本发明涉及计算机技术以及处理器技术,尤其涉及一种扩充指令的模拟方法和装置。
背景技术:
在处理器的升级和更新过程中,需要对二进制可执行程序中的指令进行扩充,从而形成了扩充指令。在对处理器的指令集中的指令进行扩充之后,需要对二进制可执行程序的扩充指令进行模拟执行,模拟执行的内容包括了对扩充指令的模拟、对扩充指令的验证等工作。
现有技术中,在对二进制可执行程序的扩充指令进行测试的时候,需要将多条测试代码或者多条测试指令放置到扩充指令的位置处,然后重新对二进制可执行程序的代码程序进行扫描,重新记录二进制可执行程序的各指令的位置,然后执行二进制可执行程序的所有指令,进而对扩充指令进行测试。
然而现有技术中,由于多条测试代码或者多条测试指令被放置到扩充指令的位置处,从而会该改变二进制可执行程序中的指令条数以及地址,从而在对二进制可执行程序的各扩充指令进行测试之前,需要先对二进制可执行程序的代码程序进行扫描,再完成对各扩充指令的测试过程,进而增加了对二进制可执行程序的扩充指令进行测试的时间,降低了测试的效率。
技术实现要素:
本发明提供一种扩充指令的模拟方法和装置,用以解决现有技术中在对二进制可执行程序的各扩充指令进行测试之前,需要先对二进制可执行程序的代码程序进行扫描,再完成对各扩充指令的测试过程,进而增加了对二进制可执行程序的扩充指令进行测试的时间,降低了测试的效率的问题。
本发明的一方面是提供一种扩充指令的模拟方法,包括:
根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,所述用户态软中断指令与二进制可执行程序中的扩充指令对应;
根据所述内存位置,调用并执行与扩充指令对应的指令模拟程序。
本发明的另一方面是提供一种扩充指令的模拟装置,包括:
确定模块,用于根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,所述用户态软中断指令与二进制可执行程序中的扩充指令对应;
执行模块,用于根据所述内存位置,调用并执行与扩充指令对应的指令模拟程序。
本发明的又一方面是提供一种扩充指令的模拟装置,包括:
测试子装置,第一寄存器和第二寄存器,其中,测试子装置分别与所述第一寄存器和所述第二寄存器连接;
所述测试子装置包括:指令集模拟器和处理器;
所述指令集模拟器,用于将二进制可执行程序中的扩充指令替换为用户态软中断指令;
所述处理器,用于在根据二进制可执行程序的执行次序,执行至所述用户态软中断指令时,根据第一寄存器中存储的指令集模拟器的内存位置,确定所述指令集模拟器,其中,所述指令集模拟器包括与各扩充指令对应的指令模拟程序;
所述指令集模拟器,还用于在确定所述指令集模拟器之后,调取并执行与扩充指令对应的指令模拟程序。本发明通过根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,用户态软中断指令与二进制可执行程序中的扩充指令对应;根据内存位置,调用并执行与扩充指令对应的指令模拟程序。从而由于各扩充指令已被替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数,就可以对二进制可执行程序进行模拟执行,进而不会导致二进制可执行程序中的各指令的地址发生变化,无需对二进制可执行程序的代码程序重新进行扫描,减少了对二进制可执行程序中的扩充指令进行模拟执行的时间,提高了模拟执行的效率。
附图说明
图1为本发明实施例一提供的扩充指令的模拟方法的流程图;
图2为本发明实施例二提供的扩充指令的模拟方法的流程图;
图3为本发明实施例三提供的扩充指令的模拟装置的结构示意图;
图4为本发明实施例四提供的扩充指令的模拟装置的结构示意图;
图5为本发明实施例五提供的扩充指令的模拟方法的流程图;
图6为本发明实施例六提供的扩充指令的模拟方法的流程图;
图7为本发明实施例七提供的扩充指令的模拟装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例一提供的扩充指令的模拟方法的流程图,如图1所示,本实施例的方法包括:
步骤101、根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,用户态软中断指令与二进制可执行程序中的扩充指令对应。
在本实施例中,具体的,在处理器的升级和更新过程中,需要对处理器中的二进制可执行程序中的指令进行扩充,处理器中包括了多个二进制可执行程序,每一个二进制可执行程序中包括了多条指令。将二进制可执行程序中的扩充后的指令称为扩充指令。在对处理器的二进制可执行程序中的指令进行扩充之后,需要对二进制可执行程序中的扩充指令进行测试。
将处理器的二进制可执行程序进行备份之后,由于已经将二进制可执行程序中的各扩充指令分别对应了各自的指令模拟程序,且各指令模拟程序并没有放入到二进制可执行程序中,而是将与扩充指令对应的指令模拟程序放入到了内存中,从而与各扩充指令分别一一对应的指令模拟程序是具有内存位置的。此时,由于每一条扩充指令已经被替换为每一条用户态软中断指令,从而二进制可执行程序中的指令条数,以及二进制可执行程序的各指令的地址都不会发生变化。
执行处理器的二进制可执行程序,由于二进制可执行程序本身具有执行次序,从而可以根据二进制可执行程序的执行次序,去执行二进制可执行程序;在执行至二进制可执行程序中的一条用户态软中断指令的时候,由于与各扩充指令分别一一对应的指令模拟程序是具有内存位置的,同时扩充指令、用户态软中断指令、指令模拟程序中三者是一一对应的,从而可以确定与当前用户态软中断指令对应的扩充指令的指令模拟程序的内存位置。
举例来说,一个指令模拟程序的内存位置为0xf010 0000,根据二进制可执行程序的执行次序执行二进制可执行程序,在执行到用户态软中断指令时,可以确定指令模拟程序的内存位置0xf010 0000。
步骤102、根据内存位置,调用并执行与扩充指令对应的指令模拟程序。
在本实施例中,具体的,根据步骤101中确定出的指令模拟程序的内存位置,可以确定出与当前用户态软中断指令对应的扩充指令的指令模拟程序,然后调用与扩充指令对应的该指令模拟程序,进而执行与扩充指令对应的该指令模拟程序。此时,可以完成对与当前用户态软中断指令对应的扩充指令的测试。
对于二进制可执行程序中的每一条用户态软中断指令,在根据二进制可执行程序的执行次序去执行二进制可执行程序,在执行至二进制可执行程序中的每一条用户态软中断指令的时候,都可以采用步骤101、步骤102的方法,完成调用并执行与每一条扩充指令对应的指令模拟程序的过程,进而对二进制可执行程序中的每一条扩充指令完成测试。
本实施例通过根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,用户态软中断指令与二进制可执行程序中的扩充指令对应;根据内存位置,调用并执行与扩充指令对应的指令模拟程序。从而由于各扩充指令已被替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数,就可以对二进制可执行程序进行模拟执行,进而不会导致二进制可执行程序中的各指令的地址发生变化,无需对二进制可执行程序的代码程序重新进行扫描,减少了对二进制可执行程序中的扩充指令进行模拟执行的时间,提高了模拟执行的效率。
图2为本发明实施例二提供的扩充指令的模拟方法的流程图,在实施例一的基础上,如图2所示,本实施例的方法,在步骤101之前,还包括:
步骤201、接收替换指令,替换指令中包括各扩充指令以及与各扩充指令一一对应的用户态软中断指令;根据替换指令,将各扩充指令分别替换为与各扩充指令一一对应的用户态软中断指令。
在本实施例中,具体的,在处理器的升级和更新过程中,需要对处理器中的二进制可执行程序中的指令进行扩充,处理器中包括了多个二进制可执行程序,每一个二进制可执行程序中包括了多条指令。将二进制可执行程序中的扩充后的指令称为扩充指令。在对处理器的二进制可执行程序中的指令进行扩充之后,需要对二进制可执行程序中的扩充指令进行测试。
将处理器的二进制可执行程序进行备份之后,首先提供了一个扩充指令集模拟器,在扩充指令集模拟器中存储了与各扩充指令分别对应的各用户态软中断指令。接收替换指令,在替换指令中携带了各扩充指令以及与各扩充指令一一对应的用户态软中断指令;然后了根据根据替换指令,将二进制可执行程序中的各扩充指令,按照实际需求分别都替换为扩充指令集模拟器中的与各扩充指令分别对应的用户态软中断指令;此时,由于是一条扩充指令替换为一条用户态软中断指令,从而二进制可执行程序中的指令条数,以及二进制可执行程序的各指令的地址都不会发生变化。
用户态软中断指令中还包括:第一寄存器标识;相应的,在步骤102之前,还包括:
步骤202、根据用户态软中断指令,将用户态软中断指令的程序计数器PC值存储至与第一寄存器标识对应的寄存器中;
在步骤102之后,还包括:
步骤203、根据用户态软中断指令的PC值,确定并模拟执行二进制可执行程序中与用户态软中断指令的PC值对应的指令。
在本实施例中,具体的,二进制可执行程序中的各指令均具有PC值,PC值是一个16位的计数器,用于存放和指示下一条需要执行的指令的地址。从而二进制可执行程序的扩充指令也是具有PC值的,由于将扩充指令替换了用户态软中断指令,从而扩充指令的PC值就是与其对应的用户态软中断指令的PC值,用户态软中断指令的PC值指示了二进制可执行程序中下一条需要执行的指令的地址。
在步骤101中的用户态软中断指令中还包括第一寄存器标识,从而在步骤102之前,可以根据用户态软中断指令,将用户态软中断指令的PC值存储至与第一寄存器标识对应的寄存器中。具体来说,在根据二进制可执行程序的执行次序,执行至用户态软中断指令JumpAndBack时,可以将当前用户态软中断指令的PC值记录到寄存器BackReg中。然后,再调取指令集模拟器,指令集模拟器去执行与当前扩充指令对应的指令模拟程序,进而对与用户态软中断指令对应的扩充指令进行模拟执行。
从而在步骤102执行了与扩充指令对应的指令模拟程序之后,此时已经完成了对二进制可执行程序的扩充指令的模拟执行;然后根据与第一寄存器标识对应的寄存器中存储的当前用户态软中断指令的PC值,确定出二进制可执行程序中与该用户态软中断指令的PC值对应的指令的地址,进而确定出与用户态软中断指令的PC值对应的指令,然后执行与用户态软中断指令的PC值对应的指令。从而依次执行二进制可执行程序中的指令,然后按照步骤101-步骤102的过程对二进制可执行程序中的下一条扩充指令进行测试。
举例来说,当前用户态软中断指令的PC值为0x8010 0004,可以根据该PC值,确定二进制可执行程序中与该PC值对应的指令,与该PC值对应的指令为需要执行的下一条指令。
在步骤101之前,还包括:
步骤204、接收第一存储指令,第一存储指令包括第二寄存器标识;根据第一存储指令,将具有与各扩充指令对应的指令模拟程序的指令集模拟器存储至内存中,并确定指令集模拟器在内存中的内存位置之后,将内存位置存储至与第二寄存器标识对应的寄存器中。
在本实施例中,具体的,可以接收到携带了第二寄存器标识的第一存储指令;进而根据第一存储指令,将存储有与各扩充指令对应的指令模拟程序的指令集模拟器,存储到设备的内存中。然后,需要确定出指令集模拟器在内存中的内存位置,就可以将确定出的内存位置存储至与第二寄存器标识对应的寄存器中。
然后,在对二进制可执行程序中的指令进行扩充之后,需要对二进制可执行程序中的各扩充指令进行模拟执行之前,首先获取预先放入内存的指令集模拟器在内存中的内存位置,例如,内存位置为0xf010 0000。然后,将获取到的指令集模拟器在内存中的内存位置,存储到寄存器TargetReg中。之后,再扫描二进制可执行程序的原代码,将二进制可执行程序中的扩充指令替换为扩充指令集模拟器中的用户态软中断指令JumpAndBack。
在步骤101之前,还包括:
步骤205、接收第二存储指令,第二存储指令包括第三寄存器标识;根据第二存储指令,将各扩充指令的各指令信息,分别存储至与第三寄存器标识对应的寄存器中。
在本实施例中,具体的,二进制可执行程序中的扩充指令具有PC值、代码条数信息、指令格式信息等指令信息。从而在对二进制可执行程序中的各扩充指令进行模拟执行之前,接收到一个携带了第三寄存器标识的第二存储指令,然后根据第二存储指令,先将扩充指令的各指令信息,分别一一存储至与第三寄存器标识对应的寄存器中。将扩充指令的各指令信息进行存储,从而可以预先保留二进制可执行程序的程序执行现场。
在步骤102之后,还包括:
步骤206、接收清除指令,清除指令包括第三寄存器标识;根据清除指令,清除与第三寄存器标识对应的寄存器中的各指令信息。
在本实施例中,具体的,完成了对当前扩充指令的模拟执行之后,会根据寄存器BackReg中的当前用户态软中断指令的PC值,寻找到二进制可执行程序中的该PC值所指向的指令,然后执行该PC值所指向的指令,此时已经彻底完成了对当前扩充指令的模拟执行。
然后,接收到一个携带了第三寄存器标识的清除指令;然后可以给根据清除指令,可以清除步骤205中的寄存器中所保存的扩充指令的各指令信息,从而恢复二进制可执行程序的程序现场。
然后在实施例一的基础上,可以参照本实施例的各步骤,依次执行二进制可执行程序中的指令,对二进制可执行程序中的下一条扩充指令进行模拟执行。
本实施例通过将存储有与各扩充指令对应的指令模拟程序的指令集模拟器放入到内存中,从而不需要再将指令模拟程序放入到二进制可执行程序中,进而不会改变二进制可执行程序的指令条数、以及二进制可执行程序的各指令的地址;将用户态软中断指令的PC值存储至寄存器中,从而可以依据该PC值寻找到二进制可执行程序的需要执行的下一条指令,完成二进制可执行程序的执行和扩充指令的模拟执行;将扩充指令中的各指令信息进行存储,可以有效的存储二进制可执行程序的程序信息。同时,从而由于只需要将扩充指令替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数以及各指令的地址,就可以对二进制可执行程序的扩充指令进行模拟执行,同时,无需对二进制可执行程序的代码程序进行扫描,减少了对二进制可执行程序的扩充指令进行模拟执行的时间,提高了模拟执行的效率。同时,在对扩充指令模拟执行结束之后,可以根据预先存储的与该用户态软终端指令对应的PC值,根据该PC值跳转回到二进制可执行程序中,进而执行二进制可执行程序中的与该PC值对应的指令,继续进行二进制可执行程序的执行过程,从而依次执行二进制可执行程序中的指令;进而在对二进制可执行程序的扩充指令进行模拟执行之后,可以根据用户态软中断指令的PC值跳转回到二进制可执行程序中,继续执行二进制可执行程序的后续指令,然后对二进制可执行程序中的后续的扩充指令进行模拟执行。
图3为本发明实施例三提供的扩充指令的模拟装置的结构示意图,如图3所示,本实施例提供的扩充指令的模拟装置,包括:
确定模块31,用于根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,用户态软中断指令与二进制可执行程序中的扩充指令对应;
执行模块32,用于根据内存位置,调用并执行与扩充指令对应的指令模拟程序。
本实施例的扩充指令的模拟装置可执行本发明实施例一提供的扩充指令的模拟方法,其实现原理相类似,此处不再赘述。
本实施例通过根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置,其中,用户态软中断指令与二进制可执行程序中的扩充指令对应;根据内存位置,调用并执行与扩充指令对应的指令模拟程序。从而由于各扩充指令已被替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数,就可以对二进制可执行程序进行模拟执行,进而不会导致二进制可执行程序中的各指令的地址发生变化,无需对二进制可执行程序的代码程序重新进行扫描,减少了对二进制可执行程序中的扩充指令进行模拟执行的时间,提高了模拟执行的效率。
图4为本发明实施例四提供的扩充指令的模拟装置的结构示意图,在实施例三的基础上,如图4所示,本实施例提供的扩充指令的模拟装置,还包括:
替换模块41,用于在确定模块31根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置之前,接收替换指令,替换指令中包括各扩充指令以及与各扩充指令一一对应的用户态软中断指令;根据替换指令,将各扩充指令分别替换为与各扩充指令一一对应的用户态软中断指令。
用户态软中断指令中还包括:第一寄存器标识;扩充指令的模拟装置,还包括:
第一存储模块42,用于在执行模块32根据内存位置,调用并执行与扩充指令对应的指令模拟程序之前,根据用户态软中断指令,将用户态软中断指令的PC值存储至与第一寄存器标识对应的寄存器中;
跳转模块43,用于在执行模块32根据内存位置,调用并执行与扩充指令对应的指令模拟程序之后,根据用户态软中断指令的PC值,确定并模拟执行二进制可执行程序中与用户态软中断指令的PC值对应的指令。
本实施例提供的扩充指令的模拟装置,还包括:
第二存储模块44,用于在确定模块31根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置之前,接收第一存储指令,第一存储指令包括第二寄存器标识;根据第一存储指令,将具有与各扩充指令对应的指令模拟程序的指令集模拟器存储至内存中,并确定指令集模拟器在内存中的内存位置之后,将内存位置存储至与第二寄存器标识对应的寄存器中。
第三存储模块45,用于在确定模块31根据二进制可执行程序中的用户态软中断指令,确定与扩充指令对应的指令模拟程序的内存位置之前,接收第二存储指令,第二存储指令包括第三寄存器标识;根据第二存储指令,将各扩充指令的各指令信息,分别存储至与第三寄存器标识对应的寄存器中。
清除模块46,用于在执行模块32根据内存位置,调用并执行与扩充指令对应的指令模拟程序之后,接收清除指令,清除指令包括第三寄存器标识;根据清除指令,清除与第三寄存器标识对应的寄存器中的各指令信息。
本实施例的扩充指令的模拟装置可执行本发明实施例二提供的扩充指令的模拟方法,其实现原理相类似,此处不再赘述。
本实施例通过将存储有与各扩充指令对应的指令模拟程序的指令集模拟器放入到内存中,从而不需要再将指令模拟程序放入到二进制可执行程序中,进而不会改变二进制可执行程序的指令条数、以及二进制可执行程序的各指令的地址;将用户态软中断指令的PC值存储至寄存器中,从而可以依据该PC值寻找到二进制可执行程序的需要执行的下一条指令,完成二进制可执行程序的执行和扩充指令的模拟执行;将扩充指令中的各指令信息进行存储,可以有效的存储二进制可执行程序的程序信息。同时,从而由于只需要将扩充指令替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数以及各指令的地址,就可以对二进制可执行程序的扩充指令进行模拟执行,同时,无需对二进制可执行程序的代码程序进行扫描,减少了对二进制可执行程序的扩充指令进行模拟执行的时间,提高了模拟执行的效率。同时,在对扩充指令模拟执行结束之后,可以根据预先存储的与该用户态软终端指令对应的PC值,根据该PC值跳转回到二进制可执行程序中,进而执行二进制可执行程序中的与该PC值对应的指令,继续进行二进制可执行程序的执行过程,从而依次执行二进制可执行程序中的指令;进而在对二进制可执行程序的扩充指令进行模拟执行之后,可以根据用户态软中断指令的PC值跳转回到二进制可执行程序中,继续执行二进制可执行程序的后续指令,然后对二进制可执行程序中的后续的扩充指令进行模拟执行。
图5为本发明实施例五提供的扩充指令的模拟方法的流程图,如图5所示,本实施例的方法包括:
步骤501、指令集模拟器将二进制可执行程序中的扩充指令替换为用户态软中断指令。
在本实施例中,具体的,在处理器的升级和更新过程中,需要对处理器中的二进制可执行程序中的指令进行扩充,处理器中包括了多个二进制可执行程序,每一个二进制可执行程序中包括了多条指令。将二进制可执行程序中的扩充后的指令称为扩充指令。在对处理器的二进制可执行程序中的指令进行扩充之后,需要对二进制可执行程序中的扩充指令进行测试。
将处理器的二进制可执行程序进行备份之后,首先提供了一个扩充指令集模拟器,在扩充指令集模拟器中存储了与各扩充指令分别对应的各用户态软中断指令。将二进制可执行程序中的各扩充指令,按照实际需求分别都替换为扩充指令集模拟器中的与各扩充指令分别对应的用户态软中断指令;此时,由于是一条扩充指令替换为一条用户态软中断指令,从而二进制可执行程序中的指令条数,以及二进制可执行程序的各指令的地址都不会发生变化。
步骤502、在根据二进制可执行程序的执行次序,执行至用户态软中断指令时,处理器根据第一寄存器中存储的指令集模拟器的内存位置,确定指令集模拟器,其中,指令集模拟器包括与各扩充指令对应的指令模拟程序。
在本实施例中,具体的,已经预先将指令集模拟器存储在了设备的内存中,将指令集模拟器的内存位置存储至了设备的第一寄存器中;在指令集模拟器中存储了与各个扩充指令对应的指令模拟程序;针对每一个指令模拟程序来说,指令测试程序是对与其对应的扩充指令进行测试的代码的集合。
执行处理器的二进制可执行程序,由于二进制可执行程序本身具有执行次序,从而可以根据二进制可执行程序的执行次序,去执行二进制可执行程序,可以根据第一寄存器中预先存储的指令集模拟器的内存位置,确定指令集模拟器的位置,进而调取指令集模拟器。
举例来说,指令集模拟器的内存位置为0xf010 0000,根据二进制可执行程序的执行次序执行二进制可执行程序,在执行到用户态软中断指令时,根据指令集模拟器的内存位置0xf010 0000,调取出存储有与各扩充指令对应的指令模拟程序的指令集模拟器。
步骤503、指令集模拟器调取并执行与扩充指令对应的指令模拟程序。
在本实施例中,具体的,根据步骤502中确定出的指令集模拟器以及当前的用户态软中断指令,由于用户态软中断指令是与扩充指令对应的,进而指令集模拟器调取出指令集模拟器中与该扩充指令对应的指令模拟程序。然后,指令集模拟器执行指令集模拟器中的与扩充指令对应的指令模拟程序,进而指令集模拟器完成指令模拟,即完成扩充指令的测试。
本实施例提供了一种新的扩充指令的模拟方法,在对二进制可执行程序中的指令进行扩充之后,扩充之后的指令形成了各扩充指令,此时需要对各扩充指令进行测试;在对扩充指令进行测试的时候,只需要将扩充指令替换为与扩充指令对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中与该扩充指令对应的指令模拟程序,可以执行该指令模拟程序,进而二进制可执行程序中的扩充指令进行了模拟执行;然后按照本实施例的方法对二进制可执行程序中的下一条扩充指令进行模拟执行。从而由于只需要将各扩充指令替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数,就可以对二进制可执行程序进行模拟执行,进而不会导致二进制可执行程序中的各指令的地址发生变化,无需对二进制可执行程序的代码程序重新进行扫描,减少了对二进制可执行程序中的扩充指令进行模拟执行的时间,提高了模拟执行的效率。
图6为本发明实施例六提供的扩充指令的模拟方法的流程图,如图6所示,在实施例五的基础上,在步骤503之后,还包括:
步骤504、指令集模拟器根据第二寄存器中存储的用户态软中断指令的PC值,确定并模拟执行二进制可执行程序中与用户态软中断指令的PC值对应的指令。
在本实施例中,具体的,二进制可执行程序中的各指令均具有PC值,PC值是一个16位的计数器,用于存放和指示下一条需要执行的指令的地址。从而二进制可执行程序的扩充指令也是具有PC值的,由于将扩充指令替换了用户态软中断指令,从而扩充指令的PC值就是与其对应的用户态软中断指令的PC值,用户态软中断指令的PC值指示了二进制可执行程序中下一条需要执行的指令的地址。可以将各用户态软中断指令的PC值存储在第二寄存器中。
在步骤503执行了与扩充指令对应的指令模拟程序之后,此时已经完成了对二进制可执行程序的扩充指令的模拟执行;然后根据第二寄存器中存储的当前用户态软中断指令的PC值,确定出二进制可执行程序中与该用户态软中断指令的PC值对应的指令的地址,进而确定出与用户态软中断指令的PC值对应的指令,然后执行与用户态软中断指令的PC值对应的指令。从而依次执行二进制可执行程序中的指令,然后按照步骤501-步骤504的过程对二级制可执行程序中的下一条扩充指令进行测试。
举例来说,当前用户态软中断指令的PC值为0x8010 0004,可以根据该PC值,确定二进制可执行程序中与该PC值对应的指令,与该PC值对应的指令为需要执行的下一条指令。
在步骤501之前,还包括:
步骤601、处理器将指令集模拟器存储至内存中;处理器获取指令集模拟器在内存中的内存位置,将内存位置存储至第一寄存器中。
在本实施例中,具体的,处理器将存储有与各扩充指令对应的指令模拟程序的指令集模拟器,存储到设备的内存中。
在对二进制可执行程序中的指令进行扩充之后,需要对二进制可执行程序中的各扩充指令进行模拟执行之前,首先获取预先放入内存的指令集模拟器在内存中的内存位置,例如,内存位置为0xf010 0000。然后,将获取到的指令集模拟器在内存中的内存位置,存储到第一寄存器TargetReg中。之后,再扫描二进制可执行程序的原代码,将二进制可执行程序中的扩充指令替换为扩充指令集模拟器中的用户态软中断指令JumpAndBack。
在步骤501之前,还包括:
步骤602、处理器将扩充指令的各指令信息,分别存储至与第一寄存器、第二寄存器不同的寄存器中。
在本实施例中,具体的,二进制可执行程序中的扩充指令具有PC值、代码条数信息、指令格式信息等指令信息。在对二进制可执行程序中的各扩充指令进行模拟执行之前,先将扩充指令的各指令信息,分别一一存储至不同的寄存器中,这里的寄存器并不是第一寄存器和第二寄存器。将扩充指令的各指令信息进行存储,从而可以预先保留二进制可执行程序的程序执行现场。
在步骤502之前,还包括:
步骤603、处理器确定用户态软中断指令的PC值,将用户态软中断指令的PC值存储至第二寄存器中。
在本实施例中,具体的,在根据二进制可执行程序的执行次序,执行至用户态软中断指令JumpAndBack时,处理器可以将当前用户态软中断指令的PC值记录到第二寄存器BackReg中。然后,再调取指令集模拟器,指令集模拟器去执行与当前扩充指令对应的指令模拟程序,进而对与用户态软中断指令对应的扩充指令进行模拟执行。
在步骤504之后,还包括:
步骤604、处理器清除与第一寄存器、第二寄存器不同的寄存器中存储的各指令信息。
在本实施例中,具体的,完成了对当前扩充指令的模拟执行之后,会根据第二寄存器BackReg中的当前用户态软中断指令的PC值,寻找到二进制可执行程序中的该PC值所指向的指令,然后执行该PC值所指向的指令,此时已经彻底完成了对当前扩充指令的模拟执行。然后,可以清除步骤602中的不同于第一寄存器、第二寄存器的各寄存器中所保存的扩充指令的各指令信息,从而恢复二进制可执行程序的程序现场。然后在实施例一的基础上,可以参照本实施例的步骤603、步骤603、步骤604,依次执行二进制可执行程序中的指令,对二进制可执行程序中的下一条扩充指令进行模拟执行。
本实施例通过将存储有与各扩充指令对应的指令模拟程序的指令集模拟器放入到内存中,从而不需要再将指令模拟程序放入到二进制可执行程序中,进而不会改变二进制可执行程序的指令条数、以及二进制可执行程序的各指令的地址;将用户态软中断指令的PC值存储至第二寄存器中,从而可以依据该PC值寻找到二进制可执行程序的需要执行的下一条指令,完成二进制可执行程序的执行和扩充指令的模拟执行;将扩充指令中的各指令信息进行存储,可以有效的存储二进制可执行程序的程序信息。同时,从而由于只需要将扩充指令替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数以及各指令的地址,就可以对二进制可执行程序的扩充指令进行模拟执行,同时,无需对二进制可执行程序的代码程序进行扫描,减少了对二进制可执行程序的扩充指令进行模拟执行的时间,提高了模拟执行的效率。同时,在对扩充指令模拟执行结束之后,可以根据预先存储的与该用户态软终端指令对应的PC值,根据该PC值跳转回到二进制可执行程序中,进而执行二进制可执行程序中的与该PC值对应的指令,继续进行二进制可执行程序的执行过程,从而依次执行二进制可执行程序中的指令;进而在对二进制可执行程序的扩充指令进行模拟执行之后,可以根据用户态软中断指令的PC值跳转回到二进制可执行程序中,继续执行二进制可执行程序的后续指令,然后对二进制可执行程序中的后续的扩充指令进行模拟执行。
图7为本发明实施例七提供的扩充指令的模拟装置的结构示意图,如图7所示,本实施例提供的扩充指令的模拟装置,包括:
测试子装置1,第一寄存器2和第二寄存器3,其中,测试子装置1分别与第一寄存器2和第二寄存器3连接;
测试子装置1包括:指令集模拟器11和处理器12;
指令集模拟器11,用于将二进制可执行程序中的扩充指令替换为用户态软中断指令;并在根据二进制可执行程序的执行次序,执行至用户态软中断指令时,处理器12根据第一寄存器2中存储的指令集模拟器11的内存位置,确定指令集模拟器11之后,其中,指令集模拟器11包括与各扩充指令对应的指令模拟程序,调取并执行与扩充指令对应的指令模拟程序。
进一步的,指令集模拟器11,还用于:
在指令集模拟器11调取并执行与扩充指令对应的指令模拟程序之后,根据第二寄存器3中存储的用户态软中断指令的PC值,确定并模拟执行二进制可执行程序中与用户态软中断指令的PC值对应的指令。
处理器12,还用于:
在处理器12根据第一寄存器2中存储的指令集模拟器11的内存位置,确定指令集模拟器11之前,确定用户态软中断指令的PC值,将用户态软中断指令的PC值存储至第二寄存器3中。
处理器12,还用于:
在指令集模拟器11将二进制可执行程序中的扩充指令替换为用户态软中断指令之前,将指令集模拟器11存储至内存中,获取指令集模拟器11在内存中的内存位置,将内存位置存储至第一寄存器2中。
处理器12,还用于:
在指令集模拟器11将二进制可执行程序中的扩充指令替换为用户态软中断指令之前,将扩充指令的各指令信息,分别存储至与第一寄存器2、第二寄存器3不同的寄存器中。
处理器12,还用于:
在指令集模拟器11根据第二寄存器3中存储的用户态软中断指令的PC值,确定并模拟执行二进制可执行程序中与用户态软中断指令的PC值对应的扩充指令之后,清除与第一寄存器2、第二寄存器3不同的寄存器中存储的各指令信息。
本实施例的扩充指令的模拟装置可执行本发明实施例五和实施例六提供的扩充指令的模拟方法,其实现原理相类似,此处不再赘述。
本实施例通过将存储有与各扩充指令对应的指令模拟程序的指令集模拟器放入到内存中,从而不需要再将指令模拟程序放入到二进制可执行程序中,进而不会改变二进制可执行程序的指令条数、以及二进制可执行程序的各指令的地址;将用户态软中断指令的PC值存储至第二寄存器中,从而可以依据该PC值寻找到二进制可执行程序的需要执行的下一条指令,完成二进制可执行程序的执行和扩充指令的模拟执行;将扩充指令中的各指令信息进行存储,可以有效的存储二进制可执行程序的程序信息。同时,从而由于只需要将扩充指令替换为与其对应的用户态软中断指令,而用户态软中断指令指向了指令集模拟器中的与该扩充指令对应的指令模拟程序,进而不需要改变二进制可执行程序中的指令条数以及各指令的地址,就可以对二进制可执行程序的扩充指令进行模拟执行,同时,无需对二进制可执行程序的代码程序进行扫描,减少了对二进制可执行程序的扩充指令进行模拟执行的时间,提高了模拟执行的效率。同时,在对扩充指令模拟执行结束之后,可以根据预先存储的与该用户态软终端指令对应的PC值,根据该PC值跳转回到二进制可执行程序中,进而执行二进制可执行程序中的与该PC值对应的指令,继续进行二进制可执行程序的执行过程,从而依次执行二进制可执行程序中的指令;进而在对二进制可执行程序的扩充指令进行模拟执行之后,可以根据用户态软中断指令的PC值跳转回到二进制可执行程序中,继续执行二进制可执行程序的后续指令,然后对二进制可执行程序中的后续的扩充指令进行模拟执行。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。