CN110457046B - 混合指令集程序的反汇编方法、装置、存储介质及终端 - Google Patents
混合指令集程序的反汇编方法、装置、存储介质及终端 Download PDFInfo
- Publication number
- CN110457046B CN110457046B CN201910779728.1A CN201910779728A CN110457046B CN 110457046 B CN110457046 B CN 110457046B CN 201910779728 A CN201910779728 A CN 201910779728A CN 110457046 B CN110457046 B CN 110457046B
- Authority
- CN
- China
- Prior art keywords
- instruction
- instruction set
- function
- program
- code segment
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本申请涉及应用开发领域,具体涉及一种混合指令集程序的反汇编方法、装置、存储介质及终端设备,所述方法包括:获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段;使用预设分析法反汇编所述单一指令集代码段。本申请能够在无函数符号时仍可正确识别指令所属指令集,继而实现反汇编混合指令集程序。
Description
技术领域
本申请涉及应用开发领域,具体涉及一种混合指令集程序的反汇编方法、装置、存储介质及终端设备。
背景技术
CPU(中央处理器)允许执行的多个指令的集合称为指令集。不同架构的CPU有不同的指令集,某些架构的CPU支持同时执行两套指令集,把一段可执行程序的二进制指令转换为汇编代码(或伪指令)的过程称为反汇编。目前的反汇编均以单一指令集为前置条件,当一个ELF(可执行可链接文件)程序存在函数符号时,函数入口地址会标识出该函数指令块所使用的指令集,根据这些信息,反汇编工具可正确地反汇编对应的函数指令块;如果一个去除所有函数符号的ELF程序或者一个BIN文件(纯二进制指令文件)包含了混合指令集,由于没有额外的指令集使用信息,反汇编工具一般默认使用某种指令集进行反汇编,导致无法正确识别、反汇编混合指令程序代码段的所有指令集。
发明内容
为克服以上技术问题,特别是现有技术无法正确识别、反汇编混合指令程序代码段的所有指令集的问题,特提出以下技术方案:
第一方面,本申请提供了一种混合指令集程序的反汇编方法,包括:
获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;
获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;
根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段;
使用预设分析法反汇编所述单一指令集代码段。
进一步的,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
重复执行根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型的步骤。
进一步的,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
按照所述目的函数的入口地址按预设规则对所述目的函数进行排序,并剔除非法的入口地址,得到排序后的带有指令集标识的函数入口地址集合。
进一步的,所述根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段,包括:
根据排序后的带有指令集标识的函数入口地址集合,判断排序后的连续的多个函数入口地址是否具有相同的指令集标识;
若是,将该排序后的连续的多个函数入口地址归类为同一个单一指令集代码段,生成至少一个单一指令集代码段。
进一步的,所述跳转指令包括第一跳转指令和第二跳转指令;所述获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,包括:
若所述跳转指令为第一跳转指令,获取所述第一跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为当前遍历时所用的指令集;
若所述跳转指令为第二跳转指令,获取所述第二跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为目的函数所要切换的目的指令集。
进一步的,第一跳转指令为不带指令集切换的函数跳转指令;所述第二跳转指令为带指令集切换的函数跳转指令。
进一步的,所述根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,包括:
根据所述开始位按每32位将程序的代码段分割成若干条潜在的ARM指令;
判断所述潜在的ARM指令是否为ARM BLX指令或ARM BL指令,识别出所述程序的代码段中的跳转指令;
根据所述开始位按每16位将程序的代码段分割成若干条潜在的Thumb指令;
判断所述潜在的Thumb指令是否为Thumb BLX指令或Thumb BL指令,识别出所述程序的代码段中的跳转指令。
第二方面,本申请提供一种混合指令集程序的反汇编装置,包括:
遍历模块:用于获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;
记录模块:用于获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;
计算模块:用于根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段;
反汇编模块:用于使用预设分析法反汇编所述单一指令集代码段。
第三方面,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述的混合指令集程序的反汇编方法。
第四方面,本申请还提供了一种终端设备,所述终端设备包括一个或多个处理器、存储器、一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于执行上述的混合指令集程序的反汇编方法。
本申请与现有技术相比,具有以下有益效果:
本申请提供了一种对混合指令集程序的反汇编方法,尤其是在无函数符号(Symbol)时混合指令集程序的反汇编方法,通过获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,跳转指令指示从当前函数跳转到指定函数,在获取到跳转指令后,根据所述跳转指令确定所指向的函数,然后记录所述目的函数的入口地址及该目的函数所属的指令集类型,获取到程序代码段中的所有跳转指令所指向的目的函数后的入口地址及所属的指令集类型后,便能得到带有指令集标识的函数入口地址集合,再根据所述目的函数所属的指令集类型确定该目的函数的代码长度,结合目的函数的入口地址计算出该目的函数的代码段,将程序的代码段切分为至少一个单一指令集的代码段,便可依据对单一指令集的反汇编规则对该单一指令集代码段进行反汇编,在无函数符号时仍可正确识别指令所属指令集,继而实现反汇编混合指令集程序,提高对无函数符号(Symbol)时混合指令集程序的反汇编的正确性及效率。
本申请附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本申请的实践了解到。
附图说明
本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本申请混合指令集程序的反汇编方法的一实施例流程示意图;
图2为本申请带有指令集标识的函数入口地址集合的一实施例示意图;
图3为本申请识别混合指令集程序的代码段包含的控制流及函数所属指令集的一实施例流程示意图;
图4为本申请混合指令集程序的反汇编装置的一实施例示意图;
图5为本申请终端设备的一实施例结构示意图。
具体实施方式
下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能解释为对本申请的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本申请所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本申请实施例提供一种混合指令集程序的反汇编方法,如图1所示,所述方法包括以下步骤:
S10:获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令。
本实施例应用于计算机领域,用于将一段可执行程序的二进制代码转换为汇编代码(或伪指令),程序的二进制代码根据CPU(中央处理器)支持的指令集而设计,不同架构的CPU有不同的指令集,某些架构的CPU支持同时执行两套指令集,例如ARM(架构)CPU支持同时执行ARM指令集和Thumb指令集,CPU一般使用特殊的跳转指令实现不同指令集的切换。本实施例要对程序的二进制代码进行反汇编,首先确定程序代码段的开始位和结束位,本实施例的一种实施方式,若程序为ELF(可执行可链接文件)程序,根据ELF的文件结构信息来确定代码段的开始位和结束位;本实施例的另一种实施方式,若程序为BIN文件(纯二进制指令文件),BIN文件的开头和结束就是代码段的开始位和结束位。当获取程序的代码段的开始位与结束位后,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令。遍历(Traversal)是指沿着程序的代码段的某条搜索路线,依次对程序的代码段对应的树(或图)中每个节点均做一次访问,本实施例中,通过遍历程序的代码段各种不同功能的指令,识别出所述程序的代码段中的跳转指令。
S20:获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合。
本实施例中,跳转指令指示从当前函数跳转到指定函数,在获取到跳转指令后,根据所述跳转指令确定所指向的函数,本实施例将跳转指令所指向的函数定义为目的函数,然后记录所述目的函数的入口地址及该目的函数所属的指令集类型,获取到程序代码段中的所有跳转指令所指向的目的函数后的入口地址及所属的指令集类型后,便能得到带有指令集标识的函数入口地址集合,如图2所示是带有指令集标识的函数入口地址集合的一示意图,图中记录了各目的函数的入口地址(函数入口地址1~函数入口地址N),并且记录了各目的函数对应所属的指令集类型,图2使用单独字段明确符号标识目的函数所属的不同指令集,也可以使用其它符号标识不同的指令集,另外,还可以直接使用函数入口地址最低位是0还是1标识不同的指令集。
S30:根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段。
在得到带有指令集标识的函数入口地址集合后,根据所述目的函数所属的指令集类型确定该目的函数的代码长度,再根据目的函数的入口地址结合所述代码长度便能计算出该目的函数的代码段,将程序的代码段切分为至少一个单一指令集的代码段,即根据带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段。
S40:使用预设分析法反汇编所述单一指令集代码段。
在得到单一指令集代码段后,便可依据对单一指令集的反汇编规则对该单一指令集代码段进行反汇编,本实施例的一种所述方式,使用递归下降分析法反汇编所述单一指令集代码段,依据控制流回溯分析和重建全部指令,将可执行程序的一段段单一指令集的二进制代码段转换为汇编代码,实现对程序的代码段的反汇编操作;本实施例的另一种所述方式,使用线性扫描分析法逐个遍历一段段单一指令集的二进制代码段,将可执行程序的一段段单一指令集的二进制代码段转换为汇编代码,实现对程序的代码段的反汇编操作。反汇编是验证程序正确性的重要手段,并且反汇编后可以用于检测恶意程序或实施逆向工程。
本实施例提供了一种对混合指令集程序的反汇编方法,尤其是在无函数符号(Symbol)时混合指令集程序的反汇编方法,通过获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,跳转指令指示从当前函数跳转到指定函数,在获取到跳转指令后,根据所述跳转指令确定所指向的函数,然后记录所述目的函数的入口地址及该目的函数所属的指令集类型,获取到程序代码段中的所有跳转指令所指向的目的函数后的入口地址及所属的指令集类型后,便能得到带有指令集标识的函数入口地址集合,再根据所述目的函数所属的指令集类型确定该目的函数的代码长度,结合目的函数的入口地址计算出该目的函数的代码段,将程序的代码段切分为至少一个单一指令集的代码段,便可依据对单一指令集的反汇编规则对该单一指令集代码段进行反汇编,在无函数符号时仍可正确识别指令所属指令集,继而实现反汇编混合指令集程序,提高对无函数符号(Symbol)时混合指令集程序的反汇编的正确性及效率。
本申请的一种实施例,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
重复执行根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型的步骤。
本实施例中,为了更加全面地识别出所述程序的代码段中的跳转指令,对程序的代码段进行多次遍历,具体的,在一次遍历查找到代码段中的跳转指令,并且记录所述跳转指令所指向的目的函数的入口地址及该目的函数所属的指令集类型后,再一次对代码段进行遍历,重复执行根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型的步骤,以查找出程序的代码段的所有跳转指令,再根据查找到的跳转指令确定所指向的目的函数,并记录所述目的函数的入口地址及所有目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合。
本申请的一种实施例,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
按照所述目的函数的入口地址按预设规则对所述目的函数进行排序,并剔除非法的入口地址,得到排序后的带有指令集标识的函数入口地址集合。
本实施例中,得到各目的函数的入口地址后,为了提高目的函数排列的有序性,按照所述目的函数的入口地址按预设规则对所述目的函数进行排序,一种实施方式为按照所述目的函数的入口地址从小到大对所述目的函数进行排序,本领域普通技术人员可以理解,本具体实施例按函数的入口地址从小到大排序,不影响本发明按一定规则排序的思想;同时,剔除非法的入口地址,将函数的入口地址与代码段的开始位和结束位相比较,将小于程序的代码段开始位地址或者大于程序的代码段结束地址的函数入口地址均视为非法的入口地址,提出该些非法的入口地址,从而得到排序后的带有指令集标识的函数入口地址集合,将目的函数按照预设规则进行排序,提高了目的函数的有序性,同时目的函数的有序排列亦反应了程序的代码段的先后顺序,有利于提高对程序的代码段的反编译,提高对程序的代码段的反编译效率。
本申请的一种实施例,所述根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段,包括:
根据排序后的带有指令集标识的函数入口地址集合,判断排序后的连续的多个函数入口地址是否具有相同的指令集标识;
若是,将该排序后的连续的多个函数入口地址归类为同一个单一指令集代码段,生成至少一个单一指令集代码段。
本实施例中,根据排序后的带有指令集标识的函数入口地址集合,判断排序后的连续的多个函数入口地址是否具有相同的指令集标识,例如排序后的连续的多个函数入口地址为函数入口地址1、函数入口地址2、函数入口地址3,判断该多个入口地址是否具有相同的指令集标识,若是,则说明该多个入口地址对应的目的函数所属的指令集相同,将将该排序后的连续的多个函数入口地址归类为同一个单一指令集代码段,生成至少一个单一指令集代码段。即将目的函数的入口地址排序完毕后,一个或多个相邻得所属相同指令集的目的函数可构成一个或多个单一指令集代码段,根据其函数入口地址的排序可得到单一指令集代码段的开始地址和结束地址,其中,开始地址是单一指令集代码段中首个目的函数的入口地址,结束地址是下一个单一指令集代码段中首个函数的入口地址,或者整个代码段的结束地址。
本申请的一种实施例,所述跳转指令包括第一跳转指令和第二跳转指令;所述获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,包括:
若所述跳转指令为第一跳转指令,获取所述第一跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为当前遍历时所用的指令集;
若所述跳转指令为第二跳转指令,获取所述第二跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为目的函数所要切换的目的指令集。
本实施例中,所述跳转指令包含至少两种不同类型的跳转指令,以第一跳转指令和第二跳转指令定义两种不同类型的跳转指令,不同的跳转指令在记录其所属的指令集类型时的操作不同。在遍历时,使用指令集A对程序的代码段进行遍历时,若遍历到的跳转指令为第一跳转指令,此时获取所述第一跳转指令所指向的目的函数,并记录所述目的函数的入口地址及记录所述目的函数所属指令集为当前遍历时所用的指令集,即所述目的函数所属指令集为指令集A;在使用指令集A对程序的代码段进行遍历时,若遍历到的跳转指令为第二跳转指令,此时获取所述第二跳转指令所指向的目的函数,记录所述目的函数的入口地址,同时获取所述目的函数所要切换的指令集,将目的函数所要切换的指令集定义为目标指令集,并记录所述目的函数所属指令集为目的函数所要切换的目的指令集。在一种实施方式中,指令集包括指令集A和指令集B,当使用指令集A对程序的代码段进行遍历时,若遍历到的跳转指令为第一跳转指令,此时记录所述第一跳转指令所指向的目的函数所属指令集为指令集A;当使用指令集B对程序的代码段进行遍历时,若遍历到的跳转指令为第一跳转指令,此时记录所述第一跳转指令所指向的目的函数所属指令集为指令集B;在另一种实施方式中,当使用指令集A对程序的代码段进行遍历时,若遍历到的跳转指令为第二跳转指令,此时记录所述第二跳转指令所指向的目的函数所属指令集为指令集B;当使用指令集B对程序的代码段进行遍历时,若遍历到的跳转指令为第二跳转指令,此时记录所述第二跳转指令所指向的目的函数所属指令集为指令集A。从而快速地对遍历出的不同类型的目的函数所属的指令集进行归类,从而提高对程序代码的反汇编效率。
本申请的一种实施例,第一跳转指令为不带指令集切换的函数跳转指令;所述第二跳转指令为带指令集切换的函数跳转指令。
本实施例中,在上述实施例的基础上,所述第一跳转指令为不带指令集切换的函数跳转指令,所述第二跳转指令为带指令集切换的函数跳转指令,例如ARM CPU可以执行32位ARM指令集和16位ARM指令集,在程序的代码段中同时包含ARM指令集和ARM指令集,并且程序的代码段中使用特殊跳转指令(即第二跳转指令)实现不同指令集的切换,以供CPU识别、执行。所述第一跳转指令包括ARM CPU的BL指令,ARM CPU的BL指令可实现ARM指令集的跳转或Thumb指令集的跳转;所述第二跳转指令包括ARM CPU的BLX指令,ARM CPU的BLX指令可实现ARM指令集和Thumb指令集之间的相互切换。
本申请的一种实施例,所述根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,包括:
根据所述开始位按每32位将程序的代码段分割成若干条潜在的ARM指令;
判断所述潜在的ARM指令是否为ARM BLX指令或ARM BL指令,识别出所述程序的代码段中的跳转指令;
根据所述开始位按每16位将程序的代码段分割成若干条潜在的Thumb指令;
判断所述潜在的Thumb指令是否为Thumb BLX指令或Thumb BL指令,识别出所述程序的代码段中的跳转指令。
本实施例中,ARM CPU的架构属于RISC(精简指令集架构),所有指令长度均相等,ARM指令集为32位和Thumb指令集为16位,在所述根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令时,根据所述开始位与结束位首次遍历整个代码段,根据所述开始位按每32位将程序的代码段分割成若干条潜在的ARM指令,同时判断每一条潜在的ARM指令是否为ARM BLX指令或ARM BL指令,所述ARM BLX指令为上述的第二跳转指令,所述ARM BL指令为上述的第一跳转指令;再次遍历整个代码段时,根据所述开始位按每16位将程序的代码段分割成若干条潜在的Thumb指令,同时判断每一条潜在的Thumb指令是否为Thumb BLX指令或Thumb BL指令,所述Thumb BLX指令为上述的第二跳转指令,所述Thumb BL指令为上述的第一跳转指令。从而识别出程序的代码段中的跳转指令,然后根据ARM架构参考手册可以计算出ARM指令集和Thumb指令集下的BLX指令和BL指令所跳转的目的函数入口地址,并且根据跳转指令的类型可以得到目的函数所属的指令集类型。
本申请的一种具体实现实施例,为便于阐述,所举具体实施例的可执行程序的代码段仅包含两套指令集(ARM指令集和Thumb指令集),可以理解的是,本申请的技术也适用于两套以上指令集。如图3所示,识别程序的代码段包含的控制流及函数所属指令集包括以下步骤:
先确定程序代码段的开始和结束;
在首次遍历整个代码段时,按每32位将代码段分割成一条条潜在ARM指令,同时判断每一条潜在ARM指令是否为BLX指令或BL指令,依次寻找ARM BLX指令和ARM BL指令,如果找到ARM BLX指令,则计算出目的函数的入口地址,记录该地址并记录此目的函数属于Thumb指令集;如果找到ARM BL指令,则计算出目的函数的入口地址,记录该地址并记录此目的函数属于ARM指令集;在再次遍历整个代码段时,按每16位将代码段分割成一条条潜在Thumb指令,同时判断每一条潜在Thumb指令是否为Thumb BLX指令或ThumbBL指令,依次寻找Thumb BLX指令和Thumb BL指令;如果找到Thumb BLX指令,则计算出目的函数的入口地址,记录该地址并记录此目的函数属于ARM指令集;如果找到Thumb BL指令,则计算出目的函数的入口地址,记录该地址并记录此目的函数属于Thumb指令集;两次遍历完成后,将得到一个带有指令集标识的函数入口地址集合。通过对此集合按函数入口地址大小排序,可计算生成一个或多个单一指令集代码段,再使用递归下降分析法反汇编所有单一指令集代码段,完成整个程序的反汇编。
如图4所示,在另一种实施例中,本申请提供了一种混合指令集程序的反汇编装置,包括:
遍历模块10:用于获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;
记录模块20:用于获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;
计算模块30:用于根据所述带有指令集标识的函数入口地址集合计算生成一个或多个单一指令集代码段;
反汇编模块:用于使用递归下降分析法反汇编所述一个或多个单一指令集代码段。
本申请的一种实施例,所述记录模块20执行获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,遍历模块10重复次执行根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,记录模块20重复执行获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合。
本申请的一种实施例,所述记录模块20还包括执行按照所述目的函数的入口地址按预设规则对所述目的函数进行排序,并剔除非法的入口地址,得到排序后的带有指令集标识的函数入口地址集合。
本申请的一种实施例,所述计算30还包括执行:
根据排序后的带有指令集标识的函数入口地址集合,判断排序后的连续的多个函数入口地址是否具有相同的指令集标识;
若是,将该排序后的连续的多个函数入口地址归类为同一个单一指令集代码段,生成至少一个单一指令集代码段。
本申请的一种实施例,所述跳转指令包括第一跳转指令和第二跳转指令,所述记录模块20还包括执行:
若所述跳转指令为第一跳转指令,获取所述第一跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为当前遍历时所用的指令集;
若所述跳转指令为第二跳转指令,获取所述第二跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为目的函数所要切换的目的指令集。
本申请的一种实施例,第一跳转指令为不带指令集切换的函数跳转指令;所述第二跳转指令为带指令集切换的函数跳转指令。
本申请的一种实施例,所述遍历模块10还包括执行:
根据所述开始位按每32位将程序的代码段分割成若干条潜在的ARM指令;
判断所述潜在的ARM指令是否为ARM BLX指令或ARM BL指令,识别出所述程序的代码段中的跳转指令;
根据所述开始位按每16位将程序的代码段分割成若干条潜在的Thumb指令;
判断所述潜在的Thumb指令是否为Thumb BLX指令或Thumb BL指令,识别出所述程序的代码段中的跳转指令。
在另一种实施例中,本申请提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例所述的混合指令集程序的反汇编方法。其中,所述计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(RandomAcceSS Memory,随即存储器)、EPROM(EraSable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically EraSable Programmable Read-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储设备包括由设备以能够读的形式存储或传输信息的任何介质,可以是只读存储器,磁盘或光盘等。
本申请实施例提供的一种计算机可读存储介质,可实现获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段;使用预设分析法反汇编所述单一指令集代码段。通过提供一种对混合指令集程序的反汇编方法,尤其是在无函数符号(Symbol)时混合指令集程序的反汇编方法,通过获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,跳转指令指示从当前函数跳转到指定函数,在获取到跳转指令后,根据所述跳转指令确定所指向的函数,然后记录所述目的函数的入口地址及该目的函数所属的指令集类型,获取到程序代码段中的所有跳转指令所指向的目的函数后的入口地址及所属的指令集类型后,便能得到带有指令集标识的函数入口地址集合,再根据所述目的函数所属的指令集类型确定该目的函数的代码长度,结合目的函数的入口地址计算出该目的函数的代码段,将程序的代码段切分为至少一个单一指令集的代码段,便可依据对单一指令集的反汇编规则对该单一指令集代码段进行反汇编,在无函数符号时仍可正确识别指令所属指令集,继而实现反汇编混合指令集程序,提高对无函数符号(Symbol)时混合指令集程序的反汇编的正确性及效率。
本申请实施例提供的计算机可读存储介质可以实现上述混合指令集程序的反汇编方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
此外,在又一种实施例中,本申请还提供一种终端设备,如图5所示,所述终端设备包括处理器503、存储器505、输入单元507以及显示单元509等器件。本领域技术人员可以理解,图5示出的结构器件并不构成对所有终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件。所述存储器505可用于存储计算机程序501以及各功能模块,所述处理器503运行存储在存储器505的计算机程序501,从而执行设备的各种功能应用以及数据处理。所述存储器505可以是内存储器或外存储器,或者包括内存储器和外存储器两者。内存储器可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦写可编程ROM(EEPROM)、快闪存储器、或者随机存储器。
输入单元507用于接收信号的输入及接收用户的输入,输入单元507可包括触控面板以及其它输入设备,触控面板可收集用户在其上或附近的触摸操作,并根据预先设定的程序驱动相应的连接装置。显示单元509可用于显示用户输入的信息或提供给用户的信息以及计算机设备的各种菜单。显示单元509可采用液晶显示器、有机发光二极管等形式。处理器503是计算机设备的控制中心,利用各种接口和线路连接整个电脑的各个部分,通过运行或执行存储在存储器503内的软件程序和/或模块,以及调用存储在存储器内的数据,执行各种功能和处理数据。
在一种实施方式中,所述终端设备包括一个或多个处理器503,以及一个或多个存储器505,一个或多个计算机程序501,其中所述一个或多个计算机程序501被存储在存储器505中并被配置为由所述一个或多个处理器503执行,所述一个或多个计算机程序501配置用于执行以上实施例所述的反汇编方法。图5中所示的一个或多个处理器503能够执行、实现图5中所示的遍历模块10、记录模块20、计算模块30、反汇编模块40的功能。
本申请实施例提供的一种终端设备,可实现获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段;使用预设分析法反汇编所述单一指令集代码段。通过提供一种对混合指令集程序的反汇编方法,尤其是在无函数符号(Symbol)时混合指令集程序的反汇编方法,通过获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,跳转指令指示从当前函数跳转到指定函数,在获取到跳转指令后,根据所述跳转指令确定所指向的函数,然后记录所述目的函数的入口地址及该目的函数所属的指令集类型,获取到程序代码段中的所有跳转指令所指向的目的函数后的入口地址及所属的指令集类型后,便能得到带有指令集标识的函数入口地址集合,再根据所述目的函数所属的指令集类型确定该目的函数的代码长度,结合目的函数的入口地址计算出该目的函数的代码段,将程序的代码段切分为至少一个单一指令集的代码段,便可依据对单一指令集的反汇编规则对该单一指令集代码段进行反汇编,在无函数符号时仍可正确识别指令所属指令集,继而实现反汇编混合指令集程序,提高对无函数符号(Symbol)时混合指令集程序的反汇编的正确性及效率。
本申请实施例提供的终端设备可以实现上述提供的混合指令集程序的反汇编方法的实施例,具体功能实现请参见方法实施例中的说明,在此不再赘述。
以上所述仅是本申请的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (10)
1.一种混合指令集程序的反汇编方法,其特征在于,包括以下步骤:
获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;
获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;
根据所述带有指令集标识的函数入口地址集合以及所述目的函数的代码长度计算生成至少一个单一指令集代码段;其中,所述代码长度由所述目的函数所属的指令集类型确定;
使用预设分析法反汇编所述单一指令集代码段。
2.根据权利要求1所述的方法,其特征在于,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
重复执行根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型的步骤。
3.根据权利要求1所述的方法,其特征在于,所述记录所述目的函数的入口地址及该目的函数所属的指令集类型之后,还包括:
按照所述目的函数的入口地址按预设规则对所述目的函数进行排序,并剔除非法的入口地址,得到排序后的带有指令集标识的函数入口地址集合。
4.根据权利要求3所述的方法,其特征在于,所述根据所述带有指令集标识的函数入口地址集合计算生成至少一个单一指令集代码段,包括:
根据排序后的带有指令集标识的函数入口地址集合,判断排序后的连续的多个函数入口地址是否具有相同的指令集标识;
若是,将该排序后的连续的多个函数入口地址归类为同一个单一指令集代码段,生成至少一个单一指令集代码段。
5.根据权利要求1所述的方法,其特征在于,所述跳转指令包括第一跳转指令和第二跳转指令;所述获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,包括:
若所述跳转指令为第一跳转指令,获取所述第一跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为当前遍历时所用的指令集;
若所述跳转指令为第二跳转指令,获取所述第二跳转指令所指向的目的函数,记录所述目的函数的入口地址,及记录所述目的函数所属指令集为目的函数所要切换的目的指令集。
6.根据权利要求5所述的方法,其特征在于,第一跳转指令为不带指令集切换的函数跳转指令;所述第二跳转指令为带指令集切换的函数跳转指令。
7.根据权利要求1所述的方法,其特征在于,所述根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令,包括:
根据所述开始位按每32位将程序的代码段分割成若干条潜在的ARM指令;
判断所述潜在的ARM指令是否为ARM BLX指令或ARM BL指令,识别出所述程序的代码段中的跳转指令;
根据所述开始位按每16位将程序的代码段分割成若干条潜在的Thumb指令;
判断所述潜在的Thumb指令是否为Thumb BLX指令或Thumb BL指令,识别出所述程序的代码段中的跳转指令。
8.一种混合指令集程序的反汇编装置,其特征在于,包括:
遍历模块:用于获取程序的代码段的开始位与结束位,根据所述开始位与结束位遍历所述程序的代码段,识别出所述程序的代码段中的跳转指令;
记录模块:用于获取所述跳转指令所指向的目的函数,记录所述目的函数的入口地址及该目的函数所属的指令集类型,得到带有指令集标识的函数入口地址集合;
计算模块:用于根据所述带有指令集标识的函数入口地址集合以及所述目的函数的代码长度计算生成至少一个单一指令集代码段;其中,所述代码长度由所述目的函数所属的指令集类型确定;
反汇编模块:用于使用预设分析法反汇编所述单一指令集代码段。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1至7任一项所述的混合指令集程序的反汇编方法。
10.一种终端设备,其特征在于,包括:
一个或多个处理器;
存储器;
一个或多个计算机程序,其中所述一个或多个计算机程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个计算机程序配置用于执行根据权利要求1至7任一项所述的混合指令集程序的反汇编方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910779728.1A CN110457046B (zh) | 2019-08-22 | 2019-08-22 | 混合指令集程序的反汇编方法、装置、存储介质及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910779728.1A CN110457046B (zh) | 2019-08-22 | 2019-08-22 | 混合指令集程序的反汇编方法、装置、存储介质及终端 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110457046A CN110457046A (zh) | 2019-11-15 |
CN110457046B true CN110457046B (zh) | 2023-05-12 |
Family
ID=68488540
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910779728.1A Active CN110457046B (zh) | 2019-08-22 | 2019-08-22 | 混合指令集程序的反汇编方法、装置、存储介质及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110457046B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114327497A (zh) * | 2020-09-30 | 2022-04-12 | 华为技术有限公司 | 一种代码处理方法、装置及设备 |
Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6014513A (en) * | 1997-12-23 | 2000-01-11 | University Of Washington | Discovering code and data in a binary executable program |
CN101290574A (zh) * | 2008-05-27 | 2008-10-22 | 浙江大学 | 一种反汇编器指令匹配的处理方法 |
CN102591698A (zh) * | 2011-12-05 | 2012-07-18 | 福建二菱电子有限公司 | 一种单片机反汇编的方法 |
CN102681821A (zh) * | 2011-12-31 | 2012-09-19 | 浙江大学 | 基于C-SKY v2指令集的二进制工具集设计方法 |
US8510713B1 (en) * | 2008-10-31 | 2013-08-13 | Google Inc. | Method and system for validating a disassembler |
CN103677746A (zh) * | 2012-09-06 | 2014-03-26 | 北京中天安泰信息科技有限公司 | 指令重组方法及装置 |
CN104063259A (zh) * | 2014-06-05 | 2014-09-24 | 中国人民解放军信息工程大学 | 基于程序文法的指令集类型识别方法 |
US9164754B1 (en) * | 2013-12-18 | 2015-10-20 | Amazon Technologies, Inc. | Runtime patching of native-code programs |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN105260659A (zh) * | 2015-09-10 | 2016-01-20 | 西安电子科技大学 | 一种基于qemu的内核级代码重用型攻击检测方法 |
CN105608346A (zh) * | 2015-12-25 | 2016-05-25 | 北京奇虎科技有限公司 | 基于arm指令虚拟化的elf文件保护方法及系统 |
CN106775913A (zh) * | 2016-12-16 | 2017-05-31 | 华东师范大学 | 一种目标代码控制流图生成方法 |
CN108073812A (zh) * | 2017-08-08 | 2018-05-25 | 哈尔滨安天科技股份有限公司 | 一种基于反汇编的pe程序入口点归一化方法及系统 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2159732A1 (en) * | 2008-08-21 | 2010-03-03 | Thomson Licensing | Method and device for code obfuscation |
US20160196427A1 (en) * | 2014-07-08 | 2016-07-07 | Leviathan, Inc. | System and Method for Detecting Branch Oriented Programming Anomalies |
CN106407809B (zh) * | 2016-09-20 | 2019-03-01 | 四川大学 | 一种Linux平台恶意软件检测方法 |
-
2019
- 2019-08-22 CN CN201910779728.1A patent/CN110457046B/zh active Active
Patent Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6014513A (en) * | 1997-12-23 | 2000-01-11 | University Of Washington | Discovering code and data in a binary executable program |
CN101290574A (zh) * | 2008-05-27 | 2008-10-22 | 浙江大学 | 一种反汇编器指令匹配的处理方法 |
US8510713B1 (en) * | 2008-10-31 | 2013-08-13 | Google Inc. | Method and system for validating a disassembler |
CN102591698A (zh) * | 2011-12-05 | 2012-07-18 | 福建二菱电子有限公司 | 一种单片机反汇编的方法 |
CN102681821A (zh) * | 2011-12-31 | 2012-09-19 | 浙江大学 | 基于C-SKY v2指令集的二进制工具集设计方法 |
CN103677746A (zh) * | 2012-09-06 | 2014-03-26 | 北京中天安泰信息科技有限公司 | 指令重组方法及装置 |
US9164754B1 (en) * | 2013-12-18 | 2015-10-20 | Amazon Technologies, Inc. | Runtime patching of native-code programs |
CN104063259A (zh) * | 2014-06-05 | 2014-09-24 | 中国人民解放军信息工程大学 | 基于程序文法的指令集类型识别方法 |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN105260659A (zh) * | 2015-09-10 | 2016-01-20 | 西安电子科技大学 | 一种基于qemu的内核级代码重用型攻击检测方法 |
CN105608346A (zh) * | 2015-12-25 | 2016-05-25 | 北京奇虎科技有限公司 | 基于arm指令虚拟化的elf文件保护方法及系统 |
CN106775913A (zh) * | 2016-12-16 | 2017-05-31 | 华东师范大学 | 一种目标代码控制流图生成方法 |
CN108073812A (zh) * | 2017-08-08 | 2018-05-25 | 哈尔滨安天科技股份有限公司 | 一种基于反汇编的pe程序入口点归一化方法及系统 |
Non-Patent Citations (2)
Title |
---|
一种动静结合的代码反汇编框架;奚琪等;《小型微型计算机系统》;20131031;第34卷(第10期);第2253-2255页 * |
针对指令重叠混淆技术的恶意代码反汇编研究;戴超等;《小型微型计算机系统》;20160915(第09期);第1975-1979页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110457046A (zh) | 2019-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Tan et al. | Making k-object-sensitive pointer analysis more precise with still k-limiting | |
US9158514B2 (en) | Method and apparatus for providing change-related information | |
US8381194B2 (en) | Methods and apparatuses for selective code coverage | |
CN110287702B (zh) | 一种二进制漏洞克隆检测方法及装置 | |
US10902130B2 (en) | Guiding automated testing of binary programs | |
US20140059522A1 (en) | Generating Test Cases for Covering Enterprise Rules and Predicates | |
KR102013582B1 (ko) | 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법 | |
EP3001319A1 (en) | Method for detecting libraries in program binaries | |
CN109214149B (zh) | 一种mips固件基地址自动化检测方法 | |
KR101979329B1 (ko) | 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치 | |
Zheng et al. | An efficient greybox fuzzing scheme for linux-based iot programs through binary static analysis | |
JP6728874B2 (ja) | 未知のバイナリプログラムに対する有効な入力の決定 | |
CN110457046B (zh) | 混合指令集程序的反汇编方法、装置、存储介质及终端 | |
US8782626B2 (en) | Search suggestions for static code analysis | |
CN114265772A (zh) | 一种测试用例的生成方法及一种测试方法 | |
Stratis et al. | Speeding up test execution with increased cache locality | |
US8645404B2 (en) | Memory pattern searching via displaced-read memory addressing | |
CN109101355B (zh) | 一种提取错误现场特征测试激励的处理器调试方法 | |
US20190265954A1 (en) | Apparatus and method for assisting discovery of design pattern in model development environment using flow diagram | |
CN108132799A (zh) | 过程间静态程序分析信息提取方法、装置及设备 | |
CN113946516A (zh) | 代码覆盖率确定方法、装置及存储介质 | |
CN104317572B (zh) | 一种实时系统的循环边界内向分析方法 | |
CN114647439A (zh) | 一种代码扫描的方法、代码迁移的方法及相关装置 | |
US8402445B2 (en) | Program translation method and notifying instruction inserting method | |
Tran-Quoc et al. | Towards os-independent memory images analyzing: Using paging structures in memory forensics |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |