CN105528284B - 一种内核故障注入方法及电子设备 - Google Patents
一种内核故障注入方法及电子设备 Download PDFInfo
- Publication number
- CN105528284B CN105528284B CN201410507741.9A CN201410507741A CN105528284B CN 105528284 B CN105528284 B CN 105528284B CN 201410507741 A CN201410507741 A CN 201410507741A CN 105528284 B CN105528284 B CN 105528284B
- Authority
- CN
- China
- Prior art keywords
- instruction
- processor
- data
- kprobes
- break
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 54
- 230000006870 function Effects 0.000 claims abstract description 153
- 239000000523 sample Substances 0.000 claims abstract description 10
- 238000000605 extraction Methods 0.000 claims description 3
- 238000000151 deposition Methods 0.000 claims 1
- 238000012545 processing Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 15
- 101100348848 Mus musculus Notch4 gene Proteins 0.000 description 12
- 238000002347 injection Methods 0.000 description 9
- 239000007924 injection Substances 0.000 description 9
- 230000008569 process Effects 0.000 description 9
- 238000004590 computer program Methods 0.000 description 6
- 230000005856 abnormality Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 5
- 230000004048 modification Effects 0.000 description 5
- 238000012986 modification Methods 0.000 description 5
- 230000002159 abnormal effect Effects 0.000 description 4
- 238000005314 correlation function Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 230000004888 barrier function Effects 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 239000000243 solution Substances 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000003139 buffering effect Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 238000013075 data extraction Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000003860 storage Methods 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 241001269238 Data Species 0.000 description 1
- 102100033263 Integrator complex subunit 3 Human genes 0.000 description 1
- 101710092886 Integrator complex subunit 3 Proteins 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000001934 delay Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000003032 molecular docking Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000004321 preservation Methods 0.000 description 1
- 238000004540 process dynamic Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 238000002371 ultraviolet--visible spectrum Methods 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
- Retry When Errors Occur (AREA)
Abstract
本发明公开了一种内核故障注入方法及电子设备,用于解决故障注入的等待时间较长的技术问题。内核注入方法包括:在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数;所述处理器在执行完所述回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
Description
技术领域
本发明涉及计算机领域,特别涉及一种内核故障注入方法及电子设备。
背景技术
目前,Linux系统应用广泛,在针对Linux内核进行应用程序开发时,检验应用程序对Linux内核故障的容错机制的有效性非常重要,在Linux内核中进行故障注入是必不可少的环节。但是,Linux系统的开发者出于保证内核代码正确性的考虑,不愿意在Linux内核源代码树中加入一个调试器,以避免开发者通过内核中的调试器引入不良的修正,所以对Linux内核进行故障注入一直是个棘手的问题。
内核动态探针(Kernel Dynamic Probes,Kprobes)技术的出现有效解决了Linux系统的内核故障注入问题,提高了内核故障注入的效率。参见图1,其基本工作机制为:首先,注册Kprobes结构体,将用户指定的探测点处的内核指令替换为断点指令,该被替换的内核指令即为被探测的指令,然后把一个用户定义的回调函数关联到该断点指令,当处理器执行到该断点指令时,处理器将转而执行与断点指令相关联的回调函数,该回调函数执行时将模拟对应的内核故障,在回调函数执行完后,返回执行被探测的指令,继续正常的代码路径的执行,整个故障注入过程中无需对Linux内核频繁编译和启动。
但是,现有技术中上述故障注入方法存在故障注入的等待时间较长的问题,使得整个应用程序开发周期延长。
发明内容
本发明实施例提供一种内核故障注入方法及电子设备,用于解决故障注入的等待时间较长的技术问题。
第一方面,本发明实施例提供了一种内核故障注入方法,所述方法包括:
在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数;
所述处理器在执行完所述回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
结合第一方面,在第一方面的第一种可能的实现方式中,处理器执行所述Kprobes结构体中与所述断点指令关联的回调函数,包括:
所述处理器将所述回调函数中设定的错误状态码写入数据寄存器。
结合第一方面,在第一方面的第二种可能的实现方式中,处理器执行所述Kprobes结构体中与所述断点指令关联的回调函数,包括:
所述处理器读取所述Kprobes结构体中保存的所述被替换的指令的数据返回位置的位置信息,并确定出所述数据返回位置;
所述处理器生成大小不大于所述数据返回位置的存储容量的混淆数据,并将所述混淆数据写入所述数据返回位置。
结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,所述处理器生成大小不大于所述数据返回位置的存储容量的混淆数据,包括:
随机生成大小不大于所述数据返回位置的存储容量的所述混淆数据;或者
从设定混淆数据中提取小于所述数据返回位置的存储容量的部分作为所述混淆数据。
第二方面,本发明实施例还提供了一种内核故障注入方法,所述方法包括:
在加载到内存中的内核指令集合中有指令被Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,所述设定时长为所述回调函数包含的时间参数;
所述处理器在产生所述设定时长的时延后执行被替换的指令。
结合第二方面,在第二方面的第一种可能的实现方式中,处理器执行所述Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,包括:
所述处理器记录执行所述回调函数时的第一时间;
所述处理器确定出所述第一时间之后的与所述第一时间相差所述设定时长的第二时间,以形成所述设定时长的时延。
第三方面,本发明实施例还提供了一种电子设备,包括:
内存,用于存储指令;
处理器,用于执行内存中存储的内核指令;其中,在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数;且所述处理器在执行完所述回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
结合第三方面,在第三方面的第一种可能的实现方式中,所述处理器用于执行所述Kprobes结构体中与所述断点指令关联的回调函数,具体为:将所述回调函数中设定的错误状态码写入数据寄存器。
结合第三方面,在第三方面的第二种可能的实现方式中,所述处理器用于执行所述Kprobes结构体中与所述断点指令关联的回调函数,具体为:读取所述Kprobes结构体中保存的所述被替换的指令的数据返回位置的位置信息,并确定出所述数据返回位置;以及生成大小不大于所述数据返回位置的存储容量的混淆数据,并将所述混淆数据写入所述数据返回位置。
结合第三方面的第二种可能的实现方式,在第三方面的第三种可能的实现方式中,所述处理器用于生成大小不大于所述数据返回位置的存储容量的混淆数据,具体为:随机生成大小不大于所述数据返回位置的存储容量的所述混淆数据;或者从设定混淆数据中提取小于所述数据返回位置的存储容量的部分作为所述混淆数据。
第四方面,本发明实施例还提供了一种电子设备,包括:
内存,用于存储指令;
处理器,用于执行内存中存储的内核指令;其中,在加载到内存中的内核指令集合中有指令被Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,所述设定时长为所述回调函数包含的时间参数;且所述处理器在产生所述设定时长的时延后执行被替换的指令。
结合第四方面,在第四方面的第一种可能的实现方式中,所述处理器用于执行所述Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,具体为:记录执行所述回调函数时的第一时间;以及确定出所述第一时间之后的与所述第一时间相差所述设定时长的第二时间,以形成所述设定时长的时延。
本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:
本申请实施例中,处理器在执行到断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数,进而实现故障注入,并在实现故障注入之后,直接执行被断点指令替换的内核指令所在的函数返回后的下一条内核指令,减少了处理器所执行的指令数量,减少了下一次内核故障注入的等待时间,缩短了应用程序的开发周期。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中利用Kprobes进行内核故障注入的示例图;
图2为本申请实施例1中内核故障注入方法的流程示意图;
图3为本申请实施例1中一应用实例的流程示意图;
图4为本申请实施例1中另一应用实例的流程示意图;
图5为本申请实施例2中内核故障注入方法的流程示意图;
图6为本申请实施例3中电子设备的结构示意框图;
图7为本申请实施例3中电子设备的详细结构示意框图;
图8为本申请实施例4中电子设备的结构示意框图;
图9为本申请实施例4中电子设备的详细结构示意框图。
具体实施方式
针对现有技术中利用Kprobes进行内核故障注入的过程中存在故障注入的等待时间较长的技术问题,本申请实施例提供了一种内核故障注入方法,在该内核故障注入方法中,处理器在执行完与断点指令关联的回调函数后,结束对被断点指令替换的内核指令所在函数的调用,直接执行被替换的内核指令所在函数返回后的下一条指令,减少了处理器所执行的指令数量,减少了下一次内核故障注入的等待时间,缩短了应用程序的开发周期。
下面通过附图以及具体实施例对本申请技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
为了便于描述,首先介绍本申请实施例中出现的相关名词的含义。
Kprobes结构体:内核动态探针Kprobes模块的数据结构,该结构体是Kprobes体系的基础,所有的故障注入行为均围绕该结构体展开,其主要成员包括:
hlist:所有注册的Kprobes结构体都会添加到kprobe_table哈希表中,hlist成员用来链接到某个槽位中;
list:如果在同一个位置注册了多个Kprobes结构体,这些Kprobes结构体会形成一个队列,队首是一个特殊的Kprobes实例,list成员用来用来链接到这个队列中。当探测点被触发时,队首的Kprobes实例中注册的handler会逐个遍历队列中注册的handler;
addr:这个成员有两个作用,一个是用户在注册前指定探测点的基地址(加上偏移得到真实的地址),另一个是在注册后保存探测点的实际地址。在注册前,这个可以不指定,由Kprobes来初始化。如果没有指定,必须指定探测的位置的符号信息,例如函数名;
symbol_name:探测点的符号名称。名称和地址不能同时指定,否则注册时会返回EINVAL错误;
offset:探测点相对于addr地址的偏移;
pre_handler:这个接口在断点异常触发之后被调用;
fault_handler:如果执行过程中出错,则调用该接口。如果返回1,则表示错误由Kprobes处理,否则由内核来处理;
break_handler:在调用Kprobes的处理函数(比如pre_handler接口)时触发了断点异常会调用该接口,断点异常是通过中断门来处理的,在调用相应的处理函数前会自动关闭中断。关闭中断的情况下虽然不会接收可屏蔽的中断,但是CPU引发的异常或者NMI还是会接收到,所以有可能会发生断点异常处理嵌套;
ainsn:保存了被探测指令的拷贝。
实际情况中,Kprobes结构体还包括有其他的成员,本申请实施例在此不再予以详述。
动态可加载内核模块(Loadable Kernel Module,LKM):Linux内核向外部提供的一个扩展插口。由于Linux内核是单内核,虽然具有较高的效率,但是可扩展性和可维护性相对较差。LKM正是为了弥补这一缺陷而引入的,LKM能够在Linux内核运行过程中动态插入和卸载内核模块,进而在不重新编译内核的情况下扩展内核的功能。因此,通过将Kprobes结构体加载到LKM,即可通过Kprobes进行内核故障注入。
断点指令:使程序中断在需要的位置的指令,以便进行故障注入,例如在i386和x86_64架构中的int3指令。
回调函数:一个通过函数指针调用的函数。回调函数在特定的事件或条件发生时由另外的函数调用,用于对该事件或条件进行响应。本申请实施例中,针对不同的内核故障,可以定义相应的回调函数,进而在执行回调函数时达到对应的故障注入的目的。
实施例1
参见图2,为本申请实施例提供的内核故障注入方法的流程示意图,该流程包括:
步骤101:在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行该断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数;
步骤102:处理器在执行完回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
为了便于理解,首先介绍探测点的设置,即用断点指令替换被探测的内核指令的过程,该过程是在Kprobes结构体的注册过程中实现的。需要说明的是,Kprobes结构体的注册是在步骤101发生之前实现的。
在注册Kprobes结构体时,首先需要对内核程序进行相关配置,为加载Kprobes结构体做准备。具体配置工作包括将Kprobes相关代码编译进内核、启用用于检索内核函数地址的函数、启用内核的可插入模块功能等步骤。
在内核程序配置完毕后,就可以将Kprobes结构体加载到LKM,实现在内核程序中插入Kprobes结构体。首先会执行注册探测点的操作,该操作由register_kprobe()函数(以下简称:注册器)完成。注册器在进行相关的正确性检查后,保存被探测指令的指令码到struct_kprobe结构的ainsn中。接着注册器会把Kprobes实例添加到kprobe_table哈希表中,最后,注册器把被探测指令的第一个字节或者头几个字节替换为断点指令。本申请实施例中,被探测指令可以为任意内核指令。
通过上述步骤即可实现将被探测的内核指令替换为断点指令,完成Kprobes结构体的注册。
步骤101中,在处理器运行内核程序的过程中,当执行到断点指令时,将转向执行与断点指令关联的回调函数。具体来讲,当处理器执行到断点指令时,将引起一次软件异常,处理器会查找出中断描述符表中与该软件异常相符合的中断处理函数,处理器在运行中断处理函数时会调用一系列的相关函数,最终实现转向执行与断点指令关联的回调函数。
下面以int3断点指令引起的异常处理流程为例,详细介绍处理器在执行到断点指令时的处理流程,但以下流程仅仅是处理器由执行断点指令转向执行与断点指令关联的回调函数的一种实现方式,不能以此限定本申请实施例的范围。
当处理器执行int3时,引起软件异常,处理器查找出并执行int3对应的中断处理函数,KPROBE_ENTRY(int3)就是该中断处理函数的入口,处理器执行KPROBE_ENTRY(int3)函数时会调用do_int3()函数,而在执行do_int3()函数时会调用notify_die()函数,notify_die()函数的主要作用是调用内核代码注册的异常的回调函数。在Kprobes的初始化代码(init_Kprobes()函数)中调用了register_die_notifier()用于注册异常回调函数。Kprobes注册的异常回调函数为probe_exceptions_notify(),因此在执行notify_die()函数时会调用Kprobes结构体中的probe_exceptions_notify()函数,执行权由内核程序转移至Kprobes。
而probe_exceptions_notify()函数中的val参数能够判断当前的调用是由什么异常产生的,这里异常是由int3指令引起的,因此收到的参数为DIE_INT3,然后将调用kprobe_handler()函数,kprobe_handler()函数是Kprobes处理int3异常的主要实现函数,通过该函数能够根据Kprobes注册时记录的探测点地址到哈希表中找到已注册的struck kprobe结构中的pre_handler函数,pre_handler函数中即可保存与断点指令关联的回调函数,执行pre_handler函数中保存的回调函数,即可实现故障注入。
因此,处理器在处理由断点指令引起的软件异常时,通过运行中断处理函数,调用一系列的相关函数可以转向执行与断点指令关联的回调函数。
步骤102中,处理器在执行完回调函数后,通过Kprobes结构体中保存的被替换的内核指令,定位出被替换的指令所在函数返回后的下一条内核指令,处理器直接执行该定位出的函数返回后的下一条内核指令。
步骤102之后,将开始等待下一轮故障注入的执行周期,在下一轮执行周期中重复步骤101~102,再次实现内核故障的注入,直至将Kprobes结构体从LKM上卸载,Kprobes的生命周期才会结束。
本申请实施例上述技术方案中,处理器在执行到断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数,进而实现故障注入,并在实现故障注入之后,直接执行被断点指令替换的内核指令所在的函数返回后的下一条内核指令,减少了处理器所执行的指令数量,减少了下一次内核故障注入的等待时间,缩短了应用程序的开发周期。
进一步,本申请实施例中能够针对不同的内核故障定义对应的回调函数,以此实现注入不同类型的内核故障。下面分别介绍两种处理器执行回调函数实现故障注入的方式。
其一,步骤101中,处理器执行Kprobes结构体中与断点指令关联的回调函数,包括:处理器将回调函数中设定的错误状态码写入数据寄存器。
具体来讲,处理器在执行回调函数时,能够将回调函数中的保存的设定的错误状态码写入数据寄存器,实现返回错误状态码这类内核故障的注入。
其二,步骤101中,处理器执行Kprobes结构体中与断点指令关联的回调函数,包括如下步骤:
处理器读取Kprobes结构体中保存的被替换的指令的数据返回位置的位置信息,并确定出数据返回位置;
处理器生成大小不大于数据返回位置的存储容量的混淆数据,并将混淆数据写入数据返回位置。
具体来讲,处理器执行回调函数时,首先读取Kprobes结构体中保存的被替换的指令的数据返回位置的位置信息,该位置信息即为被替换的指令的缓冲区指针参数,确定出被替换指令的数据返回位置。然后,处理器将生成大小不大于该数据返回位置的存储容量的混淆数据,最后将生成的混淆数据写入确定出的数据返回位置,实现返回数据错误的这类内核故障的注入。其中,向数据返回位置写入混淆数据可以通过调用copy_to_user函数实现。
可选的,处理器生成大小不大于数据返回位置的存储容量的混淆数据,这一步骤可以通过如下两种方式实现:
方式1,随机生成大小不大于数据返回位置的存储容量的混淆数据。实际实施过程中,可以通过调用get_random_bytes()函数来获得混淆数据,过程中需要确保生成的混淆数据的大小小于被替换指令对应的数据返回位置的存储容量。
方式2,先设定一具有一定大小的数据作为设定混淆数据,在需要混淆数据时,从该设定混淆数据中提取小于数据返回位置的存储容量的部分作为混淆数据。
上述两种方式,能够简单、快捷的生成混淆数据,以便对被替换指令的数据返回位置进行数据混淆处理,实现快速模拟返回数据错误的故障。
针对上述两种不同类别的内核故障的注入的技术方案,下面分别举例说明。
参见图3,为本申请实施例中返回错误状态码类别故障的注入的实例的流程示意图,该流程包括:
步骤201:注册Kprobes结构体,其中,探测点设置在sys_open函数的地址,用int3指令取代sys_open函数的第一个字节,与int3指令关联的回调函数为emulator_eax(),emulator_eax()函数的参数包括设定的错误状态码-EACCESS。
步骤202:处理器在执行到int3指令时,引起软件异常。
步骤203:处理器执行异常处理流程,通过调用相关函数最终转向执行emulator_eax()函数,将设定的错误状态码-EACCESS写入EAX寄存器。
步骤204:处理器在执行完emulator_eax()函数后,直接执行sys_open函数返回后的下一条内核指令。
具体实施过程中,仅在首次故障注入前需要执行步骤201,在不卸载Kprobes结构体的情况下,之后的故障注入周期中,不需要再进行步骤201,重复步骤202~204即可。
在上述实例中,通过Kprobes模拟出sys_open函数返回值为错误状态码的内核故障,且在故障注入之后,直接执行sys_open函数返回后的下一条内核指令,减少两次内核故障间处理器所执行的指令数量,减少了内核故障注入的等待时间。
参见图4,为本申请实施例中返回错误数值类别故障的注入的实例的流程示意图,该流程包括:
步骤301:注册Kprobes结构体,其中,探测点设置在sys_read函数的地址,用int3指令取代sys_read函数的第一个字节,回调函数为emulator_confuse(),emulator_confuse()函数的参数包括sys_read函数的缓冲区指针参数。
步骤302:处理器在执行到int3指令时,引起软件异常。
步骤303:处理器执行异常处理流程,通过调用相关函数最终转向执行emulator_confuse()函数,首先根据sys_read函数的缓冲区指针参数确定出sys_read函数的缓冲区,然后调用get_random_bytes()函数,生成小于该缓冲区容量的混淆数据,最后,调用copy_to_user函数将混淆数据写入该缓冲区。
步骤304:处理器在执行完emulator_confuse()函数后,直接执行sys_read函数返回后的下一条内核指令。
具体实施过程中,仅在首次故障注入之前需要执行步骤301,在不卸载Kprobes结构体的情况下,之后的故障注入周期中,不需要再进行步骤301,重复步骤302~304即可。
在上述实例中,通过Kprobes模拟出sys_read函数返回数据不正确的内核故障,且在故障注入之后,直接执行sys_open函数返回后的下一条内核指令,减少两次内核故障间处理器所执行的指令数量,减少了内核故障注入的等待时间。
实施例2
针对现有技术中缺乏调用内核函数时出现延迟类别的故障的注入方式的技术问题,本申请实施例2提供了一种内核故障注入方法,参见图5,该方法包括如下内容:
步骤401:在加载到内存中的内核指令集合中有指令被Kprobes结构体中的断点指令替换时,处理器在执行断点指令时,转向执行Kprobes结构体中与所述断点指令关联的回调函数,产生设定时长的时延,其中,设定时长为回调函数包含的时间参数;
步骤402:所述处理器在产生所述设定时长的时延后执行被替换的指令。
具体的,步骤401中,加载到内存中的内核指令集合中,有指令在Kprobes结构体注册时被断点指令所替换,因此,当处理器执行到断点指令时,就会引发一次软件异常,处理器将执行异常处理流程,通过调用相关的函数,最终转向执行与断点指令关联的回调函数,在执行该回调函数时,将产生设定时长的时延。其中,步骤401中处理器在执行到断点指令时转向执行与断点指令关联的回调函数的实现方式,与步骤101中对应流程的实现方式相同,由于实施例1中已经详细阐述该流程,在此不再详述。
其中,回调函数中包含有一时间参数,该时间参数即为需要产生的时延的时长,本申请实施例中称为设定时长。执行回调函数,产生设定时长的时延的实现方式,具体为:处理器记录执行该回调函数时的第一时间;然后,确定出第一时间之后的与第一时间相差设定时长的第二时间,以形成设定时长的时延。
步骤402中,处理器在产生设定时长的时延后,转向执行Kprobes结构体中保存的被替换的内核指令,即可模拟出执行被替换的指令时出现设定时长的时延的内核故障。
因此,上述技术方案提供了一种针对内核函数调用延迟类别的故障的注入方法。
进一步,步骤401中,执行回调函数,产生设定时长的时延,具有以下两种实施方式:
其一,在执行回调函数时,首先记录处理器开始执行回调函数时的第一时间;在记录完第一时间之后,再次记录当时的时间,判断该时间与第一时间的时间差是否达到设定时长,如果达到,则确定该时间为第二时间;否则,重复上述步骤,直至确定出第二时间。其中,记录当前时间的操作可以通过调用do gettimeofday函数来实现。
其二,在执行回调函数时,将启动一个计时器,在计时器达到设定时刻时,回调函数即执行完毕。其中,设定时刻与启动计时器时刻的时差为前述设定时长。
通过上述两种方式,可以快速、准确地实现制造设定时长时延的目的,方便时延模拟的进行。
进一步,在步骤402之后,处理器在执行被替换的指令之后,执行加载到内存中的内核指令集合中位于被替换的指令之后的指令,以回到正常的内核指令流程的执行。
实施例3
基于与实施例1相同的技术构思,本发明实施例提供一种电子设备,参见图6,电子设备包括总线500,以及连接到总线500的处理器501和内存502。
其中,内存502用于存储指令。
处理器501用于执行内存502中存储的指令,具体包括内核指令以及替换内核指令的断点指令、断点指令所在的Kprobes结构体中的指令。其中,在加载到内存502中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器501在执行断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数;且处理器501在执行完回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
可选的,处理器501用于执行Kprobes结构体中与断点指令关联的回调函数,具体为:将回调函数中设定的错误状态码写入数据寄存器。
可选的,处理器501用于执行Kprobes结构体中与断点指令关联的回调函数,具体为:读取Kprobes结构体中保存的被替换的指令的数据返回位置的位置信息,并确定出数据返回位置;以及生成大小不大于数据返回位置的存储容量的混淆数据,并将混淆数据写入数据返回位置。
可选的,处理器501用于生成大小不大于数据返回位置的存储容量的混淆数据,具体为:随机生成大小不大于数据返回位置的存储容量的混淆数据;或者从设定混淆数据中提取小于数据返回位置的存储容量的部分作为混淆数据。
较佳的,请参见图7,电子设备还包括:连接到总线500的只读存储器503,当需要运行电子设备时,通过固化在只读存储器503中的基本输入输出系统引导系统进行启动,引导电子设备进入正常运行状态。
而在电子设备进入正常运行状态后,在内存502中运行应用程序和操作系统。
实施例1中的内核故障注入方法中的各种内核故障注入方式和具体实例同样适用于实施例3的电子设备,通过实施例1中对内核故障注入方法的详细描述,本领域技术人员可以清楚的知道实施例3中电子设备的实施方法,所以为了说明书的简洁,在此不再详述。
实施例4
基于与实施例2相同的技术构思,本发明实施例提供一种电子设备,参见图8,电子设备包括:总线600,以及连接到总线600的处理器601和内存602。
其中,内存602用于存储指令。
处理器601用于执行内存602中的指令,具体包括内核指令以及替换内核指令的断点指令、断点指令所在的Kprobes结构体中的指令。在加载到内存602中的内核指令集合中有指令被Kprobes结构体中的断点指令替换时,处理器601在执行断点指令时,转向执行Kprobes结构体中与断点指令关联的回调函数,产生设定时长的时延,设定时长为回调函数包含的时间参数;且处理器601在产生设定时长的时延后执行被替换的指令。
可选的,处理器601用于执行Kprobes结构体中与断点指令关联的回调函数,产生设定时长的时延,具体为:记录执行回调函数时的第一时间;以及确定出第一时间之后的与第一时间相差设定时长的第二时间,以形成设定时长的时延。
较佳的,请参见图9,电子设备还包括:连接到总线600的只读存储器603,当需要运行电子设备时,通过固化在只读存储器603中的基本输入输出系统引导系统进行启动,引导电子设备进入正常运行状态。
而在电子设备进入正常运行状态后,在内存602中运行应用程序和操作系统。
实施例2中的内核故障注入方法中的各种内核故障注入方式和具体实例同样适用于实施例4的电子设备,通过实施例2中对内核故障注入方法的详细描述,本领域技术人员可以清楚的知道实施例4中电子设备的实施方法,所以为了说明书的简洁,在此不再详述。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (8)
1.一种内核故障注入方法,其特征在于,包括:
在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数;
所述处理器在执行完所述回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
2.如权利要求1所述的方法,其特征在于,处理器执行所述Kprobes结构体中与所述断点指令关联的回调函数,包括:
所述处理器将所述回调函数中设定的错误状态码写入数据寄存器。
3.如权利要求1所述的方法,其特征在于,处理器执行所述Kprobes结构体中与所述断点指令关联的回调函数,包括:
所述处理器读取所述Kprobes结构体中保存的所述被替换的指令的数据返回位置的位置信息,并确定出所述数据返回位置;
所述处理器生成大小不大于所述数据返回位置的存储容量的混淆数据,并将所述混淆数据写入所述数据返回位置。
4.如权利要求3所述的方法,其特征在于,所述处理器生成大小不大于所述数据返回位置的存储容量的混淆数据,包括:
随机生成大小不大于所述数据返回位置的存储容量的所述混淆数据;或者从设定混淆数据中提取小于所述数据返回位置的存储容量的部分作为所述混淆数据。
5.一种电子设备,其特征在于,包括:
内存,用于存储指令;
处理器,用于执行内存中存储的内核指令;其中,在加载到内存中的内核指令集合中有指令被内核动态探针Kprobes结构体中的断点指令替换时,处理器在执行所述断点指令时,转向执行所述Kprobes结构体中与所述断点指令关联的回调函数;且所述处理器在执行完所述回调函数时,转向执行被替换的指令所在函数返回后的下一条内核指令。
6.如权利要求5所述的电子设备,其特征在于,所述处理器用于执行所述Kprobes结构体中与所述断点指令关联的回调函数,具体为:将所述回调函数中设定的错误状态码写入数据寄存器。
7.如权利要求5所述的电子设备,其特征在于,所述处理器用于执行所述Kprobes结构体中与所述断点指令关联的回调函数,具体为:读取所述Kprobes结构体中保存的所述被替换的指令的数据返回位置的位置信息,并确定出所述数据返回位置;以及生成大小不大于所述数据返回位置的存储容量的混淆数据,并将所述混淆数据写入所述数据返回位置。
8.如权利要求7所述的电子设备,其特征在于,所述处理器用于生成大小不大于所述数据返回位置的存储容量的混淆数据,具体为:随机生成大小不大于所述数据返回位置的存储容量的所述混淆数据;或者从设定混淆数据中提取小于所述数据返回位置的存储容量的部分作为所述混淆数据。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410507741.9A CN105528284B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
CN201810725000.6A CN109101416B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410507741.9A CN105528284B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810725000.6A Division CN109101416B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105528284A CN105528284A (zh) | 2016-04-27 |
CN105528284B true CN105528284B (zh) | 2018-09-28 |
Family
ID=55770527
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410507741.9A Expired - Fee Related CN105528284B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
CN201810725000.6A Expired - Fee Related CN109101416B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810725000.6A Expired - Fee Related CN109101416B (zh) | 2014-09-28 | 2014-09-28 | 一种内核故障注入方法及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN105528284B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106598799A (zh) * | 2016-12-16 | 2017-04-26 | 郑州云海信息技术有限公司 | 一种故障注入模拟系统及故障管理系统 |
CN106776175A (zh) * | 2016-12-16 | 2017-05-31 | 郑州云海信息技术有限公司 | 一种内存的故障管理方法、系统及故障管理系统 |
CN109271306A (zh) * | 2018-09-30 | 2019-01-25 | 深圳中广核工程设计有限公司 | 基于故障注入的寿命试验方法、装置、设备及介质 |
CN109558325A (zh) * | 2018-12-03 | 2019-04-02 | 浪潮电子信息产业股份有限公司 | 一种时延统计方法、装置和计算机可读存储介质 |
CN110032897B (zh) * | 2019-04-17 | 2021-01-08 | 清华大学 | 一种多核处理器及其基于时间约束的故障攻击方法 |
CN110688271B (zh) * | 2019-09-11 | 2023-06-23 | 上海高性能集成电路设计中心 | 一种应用于处理器芯片仿真验证的可控随机故障注入方法 |
CN111639312B (zh) * | 2020-06-02 | 2023-04-14 | 腾讯科技(成都)有限公司 | 反调试方法、装置、存储介质及电子装置 |
CN112905995B (zh) * | 2021-02-05 | 2022-08-05 | 电子科技大学 | 一种处理器内部寄存器组异常行为实时检测方法及系统 |
CN114691504B (zh) * | 2022-03-28 | 2024-08-13 | 北京交通大学 | 一种基于调用指令替换的故障注入方法 |
CN115729724B (zh) * | 2022-11-30 | 2024-05-10 | 中电金信软件有限公司 | 故障注入方法、故障测试系统、电子设备及可读存储介质 |
CN116991559B (zh) * | 2023-09-25 | 2024-02-02 | 苏州元脑智能科技有限公司 | 不可中断的睡眠状态进程的退出方法和装置 |
CN117931555B (zh) * | 2024-03-22 | 2024-06-07 | 新华三信息技术有限公司 | 在内核态下模拟scsi设备故障的方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101334754A (zh) * | 2008-08-05 | 2008-12-31 | 浙江大学 | 基于故障注入的嵌入式系统测评方法 |
CN103019904A (zh) * | 2012-12-27 | 2013-04-03 | 中国航空工业集团公司第六三一研究所 | 机载余度计算机支持容错验证的无损故障注入方法 |
WO2013094048A1 (ja) * | 2011-12-21 | 2013-06-27 | 富士通株式会社 | 試験サーバ、情報処理システム、試験プログラムおよび試験方法 |
CN103257913A (zh) * | 2013-04-18 | 2013-08-21 | 西安交通大学 | 一种运行时软件故障检测排除系统和方法 |
CN103473162A (zh) * | 2013-09-25 | 2013-12-25 | 浪潮电子信息产业股份有限公司 | 一种基于软件故障注入的可靠性评测系统设计方法 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8739135B2 (en) * | 2005-11-04 | 2014-05-27 | Red Hat, Inc. | Static instrumentation macros for fast declaration free dynamic probes |
US7523446B2 (en) * | 2006-11-30 | 2009-04-21 | International Business Machines Corporation | User-space return probes |
US8141056B2 (en) * | 2008-04-03 | 2012-03-20 | International Business Machines Corporation | Just-in-time dynamic instrumentation |
KR101042979B1 (ko) * | 2009-10-23 | 2011-06-21 | 한국항공대학교산학협력단 | 임베디드 시스템의 신뢰성 평가를 위한 시뮬레이션 커널을 이용하는 오류주입시험 장치 |
CN102354298A (zh) * | 2011-07-27 | 2012-02-15 | 哈尔滨工业大学 | 基于staf的高端容错机故障注入自动化测试平台及方法 |
CN102346710B (zh) * | 2011-10-13 | 2015-04-29 | 北京航空航天大学 | 一种基于动态插桩技术的数据包处理时延分析方法 |
CN102722434B (zh) * | 2012-05-24 | 2015-01-14 | 北京航空航天大学 | 一种针对Linux进程调度的性能测试方法和工具 |
CN102768642B (zh) * | 2012-06-25 | 2016-08-03 | 浪潮电子信息产业股份有限公司 | 一种基于源码分析的linux内核可靠性评测系统及其方法 |
CN103761175B (zh) * | 2013-11-25 | 2016-08-17 | 中国科学院计算技术研究所 | 一种Linux系统下程序执行路径监测系统及其方法 |
-
2014
- 2014-09-28 CN CN201410507741.9A patent/CN105528284B/zh not_active Expired - Fee Related
- 2014-09-28 CN CN201810725000.6A patent/CN109101416B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101334754A (zh) * | 2008-08-05 | 2008-12-31 | 浙江大学 | 基于故障注入的嵌入式系统测评方法 |
WO2013094048A1 (ja) * | 2011-12-21 | 2013-06-27 | 富士通株式会社 | 試験サーバ、情報処理システム、試験プログラムおよび試験方法 |
CN103019904A (zh) * | 2012-12-27 | 2013-04-03 | 中国航空工业集团公司第六三一研究所 | 机载余度计算机支持容错验证的无损故障注入方法 |
CN103257913A (zh) * | 2013-04-18 | 2013-08-21 | 西安交通大学 | 一种运行时软件故障检测排除系统和方法 |
CN103473162A (zh) * | 2013-09-25 | 2013-12-25 | 浪潮电子信息产业股份有限公司 | 一种基于软件故障注入的可靠性评测系统设计方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109101416B (zh) | 2022-01-14 |
CN105528284A (zh) | 2016-04-27 |
CN109101416A (zh) | 2018-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105528284B (zh) | 一种内核故障注入方法及电子设备 | |
US9164754B1 (en) | Runtime patching of native-code programs | |
CN110580226B (zh) | 操作系统级程序的目标码覆盖率测试方法、系统及介质 | |
US8806447B2 (en) | Step-type operation processing during debugging by machine instruction stepping concurrent with setting breakpoints | |
US8843899B2 (en) | Implementing a step-type operation during debugging of code using internal breakpoints | |
US20110145643A1 (en) | Reproducible test framework for randomized stress test | |
US8997059B2 (en) | Reverse debugging | |
US8843910B1 (en) | Identifying a set of functionally distinct reorderings in a multithreaded program | |
CN109213680B (zh) | 基于嵌入式软件仿真器的自动化测试方法 | |
US10552190B2 (en) | Precise error injection for driver testing | |
US20160224448A1 (en) | Test generation using expected mode of the target hardware device | |
US10997055B2 (en) | Methods, circuits, apparatus, systems and associated software modules for evaluating code behavior | |
CN102750484A (zh) | 一种防止病毒样本自检的方法及装置 | |
CN106055481B (zh) | 计算机程序的测试方法及装置 | |
CN106575336A (zh) | 对敏感代码恶意调用的检测与抑制 | |
US20080229141A1 (en) | Debugging method | |
CN105027089B (zh) | 内核功能性检查器 | |
US20180189167A1 (en) | Methods, circuits, apparatus, systems and associated software modules for evaluating code behavior | |
Tychalas et al. | Iffset: In-field fuzzing of industrial control systems using system emulation | |
US9317636B1 (en) | System and method for stopping integrated circuit simulation | |
KR102462864B1 (ko) | 멀티 코어를 이용한 동적 바이너리 인스트루멘테이션 장치 및 방법 | |
KR20190051301A (ko) | 퍼징 수행 시스템, 퍼징용 실행 흐름 정보 추출 장치 및 방법 | |
US20180004947A1 (en) | Enhanced control transfer security | |
CN109144844A (zh) | 追踪方法、装置、设备和机器可读介质 | |
CN112860224B (zh) | 一种函数执行环境构建方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180928 |