一种内核故障注入方法及电子设备的制造方法_3

文档序号:9765886阅读:来源:国知局
]处理器生成大小不大于数据返回位置的存储容量的混淆数据,并将混淆数据写入数据返回位置。
[0084]具体来讲,处理器执行回调函数时,首先读取Kprobes结构体中保存的被替换的指令的数据返回位置的位置信息,该位置信息即为被替换的指令的缓冲区指针参数,确定出被替换指令的数据返回位置。然后,处理器将生成大小不大于该数据返回位置的存储容量的混淆数据,最后将生成的混淆数据写入确定出的数据返回位置,实现返回数据错误的这类内核故障的注入。其中,向数据返回位置写入混淆数据可以通过调用COpy_to_User函数实现。
[0085]可选的,处理器生成大小不大于数据返回位置的存储容量的混淆数据,这一步骤可以通过如下两种方式实现:
[0086]方式1,随机生成大小不大于数据返回位置的存储容量的混淆数据。实际实施过程中,可以通过调用get_rand0m_bytes()函数来获得混淆数据,过程中需要确保生成的混淆数据的大小小于被替换指令对应的数据返回位置的存储容量。
[0087]方式2,先设定一具有一定大小的数据作为设定混淆数据,在需要混淆数据时,从该设定混淆数据中提取小于数据返回位置的存储容量的部分作为混淆数据。
[0088]上述两种方式,能够简单、快捷的生成混淆数据,以便对被替换指令的数据返回位置进行数据混淆处理,实现快速模拟返回数据错误的故障。
[0089]针对上述两种不同类别的内核故障的注入的技术方案,下面分别举例说明。
[0090]参见图3,为本申请实施例中返回错误状态码类别故障的注入的实例的流程示意图,该流程包括:
[0091]步骤201:注册Kprobes结构体,其中,探测点设置在sys_open函数的地址,用int3指令取代sys_open函数的第一个字节,与int3指令关联的回调函数为emulator_eax (), emulator_eax ()函数的参数包括设定的错误状态码-EACCESS。
[0092]步骤202:处理器在执行到int3指令时,引起软件异常。
[0093]步骤203:处理器执行异常处理流程,通过调用相关函数最终转向执行emulatoreax O函数,将设定的错误状态码-EACCESS写入EAX寄存器。
[0094]步骤204:处理器在执行完emulator_eax O函数后,直接执行sys_open函数返回后的下一条内核指令。
[0095]具体实施过程中,仅在首次故障注入前需要执行步骤201,在不卸载Kprobes结构体的情况下,之后的故障注入周期中,不需要再进行步骤201,重复步骤202?204即可。
[0096]在上述实例中,通过Kprobes模拟出sys_open函数返回值为错误状态码的内核故障,且在故障注入之后,直接执行SyS_0pen函数返回后的下一条内核指令,减少两次内核故障间处理器所执行的指令数量,减少了内核故障注入的等待时间。
[0097]参见图4,为本申请实施例中返回错误数值类别故障的注入的实例的流程示意图,该流程包括:
[0098]步骤301:注册Kprobes结构体,其中,探测点设置在sys_read函数的地址,用int3指令取代sys_read函数的第一个字节,回调函数为emulator_confuse (), emulator_confuse O函数的参数包括sys_read函数的缓冲区指针参数。
[0099]步骤302:处理器在执行到int3指令时,引起软件异常。
[0100]步骤303:处理器执行异常处理流程,通过调用相关函数最终转向执行emulatorconfuse O函数,首先根据sys_read函数的缓冲区指针参数确定出sys_read函数的缓冲区,然后调用get_rand0m_byteS()函数,生成小于该缓冲区容量的混淆数据,最后,调用copy_to_user函数将混淆数据写入该缓冲区。
[0101]步骤304:处理器在执行完emulator_confuse O函数后,直接执行sys_read函数返回后的下一条内核指令。
[0102]具体实施过程中,仅在首次故障注入之前需要执行步骤301,在不卸载Kprobes结构体的情况下,之后的故障注入周期中,不需要再进行步骤301,重复步骤302?304即可。
[0103]在上述实例中,通过Kprobes模拟出sys_read函数返回数据不正确的内核故障,且在故障注入之后,直接执行SyS_0pen函数返回后的下一条内核指令,减少两次内核故障间处理器所执行的指令数量,减少了内核故障注入的等待时间。
[0104]实施例2
[0105]针对现有技术中缺乏调用内核函数时出现延迟类别的故障的注入方式的技术问题,本申请实施例2提供了一种内核故障注入方法,参见图5,该方法包括如下内容:
[0106]步骤401:在加载到内存中的内核指令集合中有指令被Kprobes结构体中的断点指令替换时,处理器在执行断点指令时,转向执行Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,其中,设定时长为回调函数包含的时间参数;
[0107]步骤402:所述处理器在产生所述设定时长的时延后执行被替换的指令。
[0108]具体的,步骤401中,加载到内存中的内核指令集合中,有指令在Kprobes结构体注册时被断点指令所替换,因此,当处理器执行到断点指令时,就会引发一次软件异常,处理器将执行异常处理流程,通过调用相关的函数,最终转向执行与断点指令关联的回调函数,在执行该回调函数时,将产生设定时长的时延。其中,步骤401中处理器在执行到断点指令时转向执行与断点指令关联的回调函数的实现方式,与步骤101中对应流程的实现方式相同,由于实施例1中已经详细阐述该流程,在此不再详述。
[0109]其中,回调函数中包含有一时间参数,该时间参数即为需要产生的时延的时长,本申请实施例中称为设定时长。执行回调函数,产生设定时长的时延的实现方式,具体为:处理器记录执行该回调函数时的第一时间;然后,确定出第一时间之后的与第一时间相差设定时长的第二时间,以形成设定时长的时延。
[0110]步骤402中,处理器在产生设定时长的时延后,转向执行Kprobes结构体中保存的被替换的内核指令,即可模拟出执行被替换的指令时出现设定时长的时延的内核故障。
[0111]因此,上述技术方案提供了一种针对内核函数调用延迟类别的故障的注入方法。
[0112]进一步,步骤401中,执行回调函数,产生设定时长的时延,具有以下两种实施方式:
[0113]其一,在执行回调函数时,首先记录处理器开始执行回调函数时的第一时间;在记录完第一时间之后,再次记录当时的时间,判断该时间与第一时间的时间差是否达到设定时长,如果达到,则确定该时间为第二时间;否则,重复上述步骤,直至确定出第二时间。其中,记录当前时间的操作可以通过调用do gettimeofday函数来实现。
[0114]其二,在执行回调函数时,将启动一个计时器,在计时器达到设定时刻时,回调函数即执行完毕。其中,设定时刻与启动计时器时刻的时差为前述设定时长。
[0115]通过上述两种方式,可以快速、准确地实现制造设定时长时延的目的,方便时延模拟的进行。
[0116]进一步,在步骤402之后,处理器在执行被替换的指令之后,执行加载到内存中的内核指令集合中位于被替换的指令之后的指令,以回到正常的内核指令流程的执行。
[0117]实施例3
[0118]基于与实施例1相同的技术构思,本发明实施例提供一种电子设备,参见图6,电子设备包括总线500,以及连接到总线500的处理器501和内存502。
[0119]其中,内存502用于存储指令。
[0120]处理器501用于执行内存502中存储的指令,具体包括内核指令以及替换内核指令的断点指令、断点指令所在的Kprobes结构体中的指令。其中,在加载到内存502中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器501在执行断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数;且处理器501在执行完回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
[0121]可选的,处理器501用于执行Kprobes结构体中与断点指令关联的回调函数,具体为:将回调函数中设定的错误状态码写入数据寄存器。
[0122]可选的,处理器501用于执行Kprobes结构体中与断点指令关联的回调函数,具体为:读取Kprobes结构体中保存的被替换的指令的数据返回位置的位置信息,并确定出数据返回位置;以及生成大小不大于数据返回位置的存储容量的混淆数据,并将混淆数据写入数据返回位置。
[0123]可选的,处理器501用于生成大小不大于数据返回位置的存储容量的混淆数据,具体为:随机生成大小不大于数据返回位置的存储容量的混淆数据;或者从设定混淆数据中提取小于数据返回位置的存储容量的部分作为混淆数据。
[0124]较佳的,请参见图7,电子设备
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1