掌桥专利:专业的专利平台
掌桥专利
首页

一种二进制文件中合法指令的识别方法及装置

文献发布时间:2023-06-19 12:19:35


一种二进制文件中合法指令的识别方法及装置

技术领域

本发明涉及二进制技术领域,尤其涉及一种二进制文件中合法指令的识别方法及装置

背景技术

二进制重写技术是指在程序源码缺失的情况下,将编译好的二进制文件提升到更高级的编程语言如汇编语言、中间表示语言(intermediate representation,IR),并对其进行二次开发、优化和利用(包括二进制强化、Profiling、插桩和添加安全策略),并再次编译成二进制可执行文件的技术。

由于原始程序在编译成二进制后,原程序语言中的数据类型、程序执行控制流信息和符号信息等都会被舍弃,因此二进制重写技术的难点如何在二进制文件中识别所有的合法指令。目前,在二进制重写技术中识别合法指令的主要存在以下难点:

(1)二进制程序的指令中会混有数据:在现代编译器的实现中,为了编译出的程序的执行的性能优化,编译器会在代码中混入数据以加速程序的执行(例如:将跳转表JumpTable存储在代码段)。另一方面,在变长指令集中为了指令对齐,编译器也会插入数据padding(例如在在函数地址入口前)。由于二进制文件中的数据和指令没有明显界线,所以这些情况会都阻碍合法指令的识别。

(2)动态计算的间接控制流(Indirect Control Flow,ICF)目标地址:由于在二进制文件中存在间接控制流转移指令,它们的目标地址存储在一个寄存器或者一段内存中,这些目标值只能在程序运行的过程中被确定。例如,存储在跳转表中的间接控制流目标地址,要想获得这些目标地址就需要通过一个base基地址加index索引乘以offset偏移来计算;函数指针,它被初始化为一个函数的地址并且通过会经过任意的计算和解引用被确定;还有一些指针例如虚函数指针和回调函数也是需要被动态的计算所确定。

现有的二进制重写技术并不能精确的识别出二进制文件中的所有合法指令,这将会影响对二进制程序再次开发利用。

发明内容

本发明提供一种二进制文件中合法指令的识别方法及装置,用以解决现有技术中二进制重写技术不能精确识别合法指令的缺陷,实现二进制重写技术的准确性和完全性。

本发明提供一种二进制文件中合法指令的识别方法,包括以下步骤:

获取待执行的二进制文件;

沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址并继续探索,其中,所述执行过的指令为合法指令。

根据本发明提供的一种二进制文件中合法指令的识别方法,所述执行过的指令的起始地址为该执行过的指令的合法地址,执行过的指令的结束地址为解码下一条指令的起始地址。

根据本发明提供的一种二进制文件中合法指令的识别方法,沿着二进制文件的路径执行所述二进制文件的每一条路径,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为二进制文件的路径的入口地址并继续探索,具体包括以下步骤:

沿着二进制文件的入口地址执行所述二进制文件的每一条路径;

获取执行每一条路径时产生的运行时信息以及执行过的指令,所述运行时信息包括指令语义信息和运行过程中的中央处理器以及内存状态信息;

根据所述运行时信息,识别并标记待执行的二进制文件的代码片段的代码块类型,获取其中参与动态计算指令地址的所述代码块类型;

按类别对参与动态计算指令地址的代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为待执行的二进制文件的路径的入口地址并继续探索。

根据本发明提供的一种二进制文件中合法指令的识别方法,执行二进制文件的每一条路径具体包括以下步骤:

获取所述二进制文件的入口地址,从所述入口地址开始沿着二进制文件的路径执行每一条路径。

根据本发明提供的一种二进制文件中合法指令的识别方法,参与动态计算指令地址的代码块类型包括三类,分别为第一代码块类型、第二代码块类型和第三代码块类型,所述第一代码块类型为存在指令操作数是地址常量的代码块,所述第二代码块类型为具有Shl-Add和De_Mem操作逻辑的代码块,所述第三代码块类型是可计算的ICF-gadget,所述可计算的ICF-gadget为输入值中包含某一数据结构的地址,存在逻辑或者算数操作指令操作了该数据结构的数据地址,并且输出值中产生了另一个数据地址或者指令地址的代码块,其中,Shl表示一条指令的语义中具有左移操作,Add表示一条指令的语义中具有加法操作,De_Mem表示一条指令的语义中具有地址解引用操作。

根据本发明提供的一种二进制文件中合法指令的识别方法,按类别对参与动态计算指令地址的代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为待执行的二进制文件的路径的入口地址并继续探索,具体包括以下步骤:

判断参与动态计算指令地址的代码块类型的类别;

当代码块类型的类别为第一代码块类型时,获取第一代码块类型中的地址常量并将所述地址常量记录为合法指令的起始地址;

当代码块类型的类别为第二代码块类型时,获取第二代码块类型中指令的基址,迭代地改变index的值并反复执行包含具有Shl-Add和De_Mem操作语义的指令,得到存储在跳转表中的间接控制流目标地址;

当代码块类型的类别为第三代码块类型时,根据数据地址的产生和传递关系,将具有相关关系的代码块连成链,形成IE-gadget链,并反复执行所述IE-gadget链,得到间接控制流目标地址。

本发明还提供一种二进制文件中合法指令的识别装置,包括:

二进制文件获取模块,用于获取待执行的二进制文件;

动态执行模块,用于沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址并继续探索,其中,所述执行过的指令为合法指令。

根据本发明提供的一种二进制文件中合法指令的识别装置,所述动态执行模块具体包括:

路径执行单元,用于沿着二进制文件的入口地址执行所述二进制文件的每一条路径;

合法指令获取单元,用于获取执行每一条路径时产生的运行时信息以及执行过的指令,所述运行时信息包括指令语义信息和运行过程中的中央处理器以及内存状态信息;

代码块类型确定单元,用于根据所述运行时信息,标记待执行的二进制文件的代码片段的代码块类型,获取其中参与动态计算指令地址的所述代码块类型;

间接控制流目标地址识别单元,用于按类别对参与动态计算指令地址的代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为待执行的二进制文件的路径的入口地址并继续探索。

本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述二进制文件中合法指令的识别方法的步骤。

本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述二进制文件中合法指令的识别方法的步骤。

本发明提供的二进制文件中合法指令的识别方法及装置,通过对路径进行动态执行,从二进制文件的入口地址开始执行二进制文件中的每一条路径,结合执行每条路径时产生的运行时信息,对代码片段的配件的代码块类型进行分析,以此来识别出更多的动态计算的ICF目标地址即潜在的ICF目标地址。本发明提供的二进制文件中合法指令的识别方法及装置可以精准的识别二进制文件中所有的合法指令。同时可以满足所有的开发人员对二进制进行二次开发利用的需求。经过本发明提供的二进制文件中合法指令的识别方法及装置后,可以将指令转换为架构无关的IR,降低了二进制分析技术的难度。在实验中,本发明提供的二进制文件中合法指令的识别方法及装置构建了一个近似理想的参照环境,在此环境中本发明提供的二进制文件中合法指令的识别方法及装置可以实现完全的识别二进制程序所有的合法指令,并且产生的非法指令率仅为0.08%。与同类型的二进制重写技术相比大大减少了解码二进制文件产生的非法指令的数量。经过本发明提供的二进制文件中合法指令的识别方法及装置后,再分别执行重写后的程序和原始的程序,并且采用默认的参数配置,试验结果表明重写后的程序输出的结果和原始版本程序输出的结果相同,并且它们执行过程中的行为也保持一致。因此,本发明提供的二进制文件中合法指令的识别方法及装置有效的解决了二进制重写技术不能精确识别合法指令的问题,实现了重写技术的准确性和完全性。

附图说明

为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明提供的二进制文件中合法指令的识别方法的流程示意图;

图2是本发明提供的二进制文件中合法指令的识别方法中步骤S200具体的流程示意图;

图3是本发明提供的二进制文件中合法指令的识别方法中可计算ICF-gadget代码块的示例图;

图4是本发明提供的二进制文件中合法指令的识别方法中形成一个IE-gadget链的示例图;

图5是本发明提供的二进制文件中合法指令的识别方法中步骤S400具体的流程示意图;

图6是本发明提供的二进制文件中合法指令的识别装置的结构示意图;

图7是本发明提供的二进制文件中合法指令的识别装置中动态执行模块具体的结构示意图;

图8是本发明提供的二进制文件中合法指令的识别装置中间接控制流目标地址识别单元具体的结构示意图;

图9是本发明提供的电子设备的结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

目前常使用的二进制重写技术包括:

(1)BINCFI技术:BINCFI技术结合了线性反汇编和递归反汇编两种技术,其中:

线性反汇编从给出的代码段的起始地址解码并将其反汇编成汇编指令,并从已经成功识别的指令的下一字节地址开始继续反汇编下一条指令,直到解码完所有代码段地址。线性反汇编技术并不能有效的解码出混有数据的指令,由于其是线性的沿着起始地址顺序解码,因此会将指令中混有的数据翻译成指令。此外,线性反汇编技术也会将指令中的对齐padding也解码成指令,因此会导致识别错误的非法指令,使得二进制重写失去精确性。

递归反汇编从二进制程序的入口地址沿着程序的控制流路径开始解码,当遇到直接控制流转移指令的目标时,记录该分支地址,并在稍后进行探索。当遇到间接控制流转移指令时,停止解码,并选择记录的未探索入口地址重新执行。递归反汇编技术可以绕过代码中混有的数据,并有效的区分出混合在一起的数据和指令,但是当遇到间接控制流转移指令时,解码工作就会停止。虽然二进制文件中的符号表和重定位表会帮助递归反汇编技术识别出更多的ICF目标地址作为遍历的入口地址,但是当识别stripped二进制文件时(没有符号表和重定位表),并不能通过静态分析手段识别出更多的ICF目标地址,因为该技术存在二进制文件路径遍历不全的问题。

BINCFI技术从二进制程序入口开始线性解码,并用递归反汇编检查错误识别的汇编指令。当产生错误解码指令时,BINCFI技术确定错误识别指令上下界,并绕过这个地址范围重新解码,直到没有新的错误解码指令产生,BINCFI技术认为指令中混有的数据会导致错误指令的产生,因此其通过识别错误指令的上下界来绕过混有的数据,从而实现精确的识别所有合法指令。BINCFI技术还通过静态分析方法来识别潜在的ICF目标地址,来保证上下界的精确。但是BINCFI技术并不能精确区分数据和指令,上下界有效范围不能得到保证,仍然需要拷贝原始代码作为重写后二进制文件的指令地址参考。

(2)MULTIVERSE技术:MULTIVERSE技术从代码段的0字节偏移处开始解码二进制程序,当遇到非法指令编码、已经解码过的偏移长度、字节码序列的结尾等情况时会停止解码,并从下一个字节偏移处重新开始解码,直到迭代完所有的字节偏移,而后将识别出的所有汇编指令的地址映射在一个映射表中,方便重写后二进制程序运行时查找合适的指令。MULTIVERSE技术将二进制文件中的每一个字节都作为指令的起始地址来识别所有可能合法的指令,MULTIVERSE技术虽然可以识别出所有合法的指令,但是也会产生大量冗余的非法指令,且无法辨认出识别的指令中的错误解码,哪些是合法指令产生的,哪些是混合在指令中的数据产生的。

综上所述,现有的二进制重写技术并不能精确的识别出二进制文件中的所有合法指令,这将会影响对二进制程序再次开发利用。

下面结合图1描述本发明的二进制文件中合法指令的识别方法,该动态分析方法包括以下步骤:

S100、获取待执行的二进制文件。

S200、沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址即作为新的路径起始地址并继续执行探索,其中,所述执行过的指令为合法指令。

在本实施例中,执行过的指令的起始地址为该执行过的指令的合法地址,执行过的指令的结束地址为解码下一条指令的起始地址。

步骤S200为路径的动态执行方案,且在执行过程中,步骤S200会将执行过的指令的起始地址确定为该条指令的合法地址,并将这条指令的结束地址确定为解码下一条指令的起始地址。由于每一条指令都是通过执行确定的,因此保证识别指令的合法性。同时步骤S200的动态执行方案是沿着二进制文件的路径进行探索,因此也会绕过指令中混入的数据,防止将数据识别成指令,避免影响指令识别的正确性。

下面结合图2描述本发明的二进制文件中合法指令的识别方法,步骤S200包括以下步骤:

S210、沿着二进制文件的入口地址执行二进制文件的每一条路径即从入口地址开始沿着二进制文件的路径执行每一条路径。

S220、获取执行每一条路径时产生的运行时信息以及执行过的指令,运行时信息包括指令语义信息和运行过程中的中央处理器以及内存状态信息。

S230、根据运行时信息,识别并标记待执行的二进制文件的代码片段的代码块类型,获取其中参与动态计算指令地址的代码块类型。

S240、按类别对参与动态计算指令地址的代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将潜在的间接控制流目标地址确定为待执行的二进制文件的路径的入口地址并继续执行探索。之后步骤S220会继续执行步骤S240识别的潜在的ICF目标地址,这样就可以保证二进制重写技术的完整性和精确性。

需要说明的是,在本实施例中,运行时信息包括指令语义信息和运行过程中的中央处理器(Central Processing Unit,CPU)以及内存状态信息。

在该动态分析方法中,参与动态计算指令地址的代码块类型包括三类,分别为第一代码块类型(EP gadget)、第二代码块类型(JT gadget)和第三代码块类型(IE-gadget),下面对第一代码块类型、第二代码块类型和第三代码块类型进行具体介绍:

满足条件(1)的代码块类型为第一代码块类型,条件(1)为:

EP={block start≤operand≤end

(1)

第一代码块类型为在一个代码块(block)中存在指令(instruction)的操作数(operand)是地址常量,那么该代码块就是第一代码块类型。在第一代码块类型中代码片段显示的在代码块中传递指令地址,换言之,在一个代码块中会存在一个类似地址的常量。

结合执行过程中翻译的指令语义,满足条件(2)的代码块类型为第二代码块类型,条件(2)为:

(2)

其中,Shl和Add分别表示一条指令的语义中具有左移和加法操作,即表示一个基址base加上索引index乘以偏移offset,De_Mem表示一条指令的语义中具有地址解引用操作,即De_Mem表示这条指令中也包含地址解引用操作。因此,步骤S300根据步骤S200中识别的指令语义信息和运行过程中的CPU以及内存状态信息,识别当前执行的指令是否具有Shl-Add和De_Mem操作逻辑,若存在,则认为当前的代码块为第二代码块类型。

第二代码块类型为具有Shl-Add和De_Mem操作逻辑的代码块。在第二代码块类型中代码片段查询跳转表(Jump Table),并获得存储在跳转表结构中的目标地址。

第三代码块类型是可计算的ICF-gadget,可计算的ICF-gadget为给定一个代码块,如果该代码块的输入值中包含某一数据结构的基地址,存在逻辑或者算数操作指令操作了该数据结构的数据地址,并且该代码块的输出值中产生了另一个(新的)数据地址或者指令地址。

为了更好的理解可计算ICF-gadget,请参阅图2,在此代码块中的输入值分别存储在rbx寄存器和rdx寄存器中。rbx寄存器传递了一个全局数据结构的地址,并且该寄存器是mov指令的源操作数,这条指令对rbx寄存器进行了加法操作并并产生了一个新的数据地址传递给了rax寄存器,因此,该代码块就是一个可计算的ICF-gadget。

下面结合图2至图5描述本发明的二进制文件中合法指令的识别方法,步骤S240具体包括以下步骤:

S241、判断参与动态计算指令地址的代码块类型的类别。

S242、当代码块类型的类别为第一代码块类型时,获取第一代码块类型中的地址常量并将地址常量记录为合法指令的起始地址,并可以并在后续进行探索。

S243、当代码块类型的类别为第二代码块类型时,获取第二代码块类型中指令的基址base,迭代地改变index的值并反复执行包含条件(2)的语义(即具有Shl-Add和De_Mem操作)的指令,得到存储在跳转表中的间接控制流目标地址base。

需要说明的是,在本实施例中,若基址base存储在寄存器中,则步骤S243会直接读取寄存器中的值作为基址base。

S244、当代码块类型的类别为第三代码块类型时,根据数据地址的产生和传递关系,将具有相关关系的代码块连成链,形成IE-gadget链,并反复执行IE-gadget链,得到间接控制流目标地址。

基于ICF-gadget,步骤S244会分析每一个正在执行的代码块是否是可计算的ICF-gadget,如果是,这个代码块将被记录,同时根据数据地址的产生和传递关系,步骤S244将具有相关关系的gadget连成链,形成IE-gadget链,并反复执行这条形成的IE-gadget链,获得更多的间接控制流目标地址。为了更好地说明,请参阅图3,一个数据结构的首地址为0x77e7c0,被传递给rdx寄存器。第二个代码块为可计算的ICF-gadget,该代码块的输入rdx寄存器存储了数据结构的首地址,并且产生了新的数据地址存储在rax寄存器中。第三个代码块的输入rbx寄存器中存储了刚刚新产生的数据地址,并且也进行了逻辑操作并产生新的数据地址,存储在rbx寄存器中,最后一个代码块取rbx寄存器的地址在0xa8偏移处的值,即为一个间接控制流(Indirect Control Flow,ICF)目标地址。因此,步骤S244将和初始的全局地址0x77e7c0相关的后三个代码块连接成链,形成IE-gadget链,之后重复的执行这条链,来获取更多的ICF目标地址。

为了获得更多的存储在数据结构中的潜在的ICF目标地址,获取更多的ICF目标地址具体为:步骤S244在确定了所有的IE-gadget链后,将一条IE-gadget链传入的数据地址替换为任意出现在ICF-gadge代码块中的数据地址,并不断地执行该IE-gadget链来发掘更多的指令地址,以此类推,执行完所有的IE-gadget链来发掘更多的指令地址。

基于步骤S240的gadget分析方案,可以识别出所有潜在的ICF目标地址,并让步骤S220的动态执行方案继续执行这些识别出来的潜在的ICF目标地址,从而实现一个二进制文件的所有路径的全覆盖。

本发明二进制文件中合法指令的识别方法解决了二进制重写技术中识别所有合法指令的难题,并且在步骤S200分别提出了动态执行方案和gadget(一段具有特定功能的代码片段)分析方案来应对识别合法指令遇到的数据和指令混合以及ICF目标地址计算不全的难题。本发明二进制文件中合法指令的识别方法的步骤S200提出了三种代码块类型,并提出了一个可计算的ICF-gadget,结合动态执行信息,步骤S200通过分析代码块找出三种代码块类型的代码块,并施加不同的执行策略,可以分析出所有潜在的ICF目标地址。

本发明二进制文件中合法指令的识别方法二进制文件中合法指令的识别方案利用动态执行,其本质就是沿着控制流执行二进制文件,所以可以绕过二进制文件的指令中混合在指令中的数据。如果从一个程序的入口地址沿着控制流路径执行,是可以遍历完所有的路径。但是由于二进制文件中存在间接指令,它的目标地址可能不止一个,如果把所有的潜在目标地址都识别出来,通过动态执行的方式去执行,就可以保证路径全覆盖,也可以保证识别指令的合法。因此通过本发明二进制文件中合法指令的识别方案使用gadget分析方案识别的潜在的ICF目标地址,就可以保证二进制重写技术的完整性和精确性。

综上,本发明二进制文件中合法指令的识别方法,提供了提出一种实用的可以识别出二进制程序中所有合法的指令的方法,可以有效的区分出二进制文件中混合的指令和数据,并且可以识别出所有间接控制流目标地址,从而保证对二进制文件全路径覆盖。

下面对本发明提供的二进制文件中合法指令的识别装置进行描述,下文描述的二进制文件中合法指令的识别装置与上文描述二进制文件中合法指令的识别方法可相互对应参照。

下面结合图6描述本发明的二进制文件中合法指令的识别装置,该动态分析装置包括:

二进制文件获取模块100,用于获取待执行的二进制文件。

动态执行模块200,用于沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址即作为新的路径起始地址并继续执行探索,其中,所述执行过的指令为合法指令。

在本实施例中,执行过的指令的起始地址为该执行过的指令的合法地址,执行过的指令的结束地址为解码下一条指令的起始地址。

动态执行模块200为路径的动态执行方案,且在执行过程中,动态执行模块200会将执行过的指令的起始地址确定为该条指令的合法地址,并将这条指令的结束地址确定为解码下一条指令的起始地址。由于每一条指令都是通过执行确定的,因此保证识别指令的合法性。同时动态执行模块200的动态执行方案是沿着二进制文件的路径进行探索,因此也会绕过指令中混入的数据,防止将数据识别成指令,避免影响指令识别的正确性。

下面结合图7描述本发明的二进制文件中合法指令的识别方法,动态执行模块200包括:

路径执行单元210,用于沿着二进制文件的路径执行二进制文件的每一条路径即从入口地址开始沿着二进制文件的路径执行每一条路径。

合法指令获取单元220,用于获取执行每一条路径时产生的运行时信息以及执行过的指令,运行时信息包括指令语义信息和运行过程中的中央处理器以及内存状态信息。

代码块类型确定单元230,用于根据运行时信息,识别并标记待执行的二进制文件的代码片段的代码块类型,获取其中参与动态计算指令地址的代码块类型。

间接控制流目标地址识别单元240,用于按类别对参与动态计算指令地址的代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将潜在的间接控制流目标地址确定为待执行的二进制文件的路径的入口地址并继续执行探索。之后合法指令获取单元220会继续执行间接控制流目标地址识别单元240识别的潜在的ICF目标地址,这样就可以保证二进制重写技术的完整性和精确性。

需要说明的是,在本实施例中,运行时信息包括指令语义信息和运行过程中的中央处理器(Central Processing Unit,CPU)以及内存状态信息。

在该动态分析装置中,参与动态计算指令地址的代码块类型包括三类,分别为第一代码块类型(EP gadget)、第二代码块类型(JT gadget)和第三代码块类型(IE-gadget),下面对第一代码块类型、第二代码块类型和第三代码块类型进行具体介绍:

满足条件(1)的代码块类型为第一代码块类型,条件(1)为:

EP={block start≤operand≤end

(1)

第一代码块类型为在一个代码块(block)中存在指令(instruction)的操作数(operand)是地址常量,那么该代码块就是第一代码块类型。在第一代码块类型中代码片段显示的在代码块中传递指令地址,换言之,在一个代码块中会存在一个类似地址的常量。

结合执行过程中翻译的指令语义,满足条件(2)的代码块类型为第二代码块类型,条件(2)为:

(2)

其中,Shl和Add分别表示一条指令的语义中具有左移和加法操作,即表示一个基址base加上索引index乘以偏移offset,De_Mem表示一条指令的语义中具有地址解引用操作,即De_Mem表示这条指令中也包含地址解引用操作。因此,步骤S300根据步骤S200中识别的指令语义信息和运行过程中的CPU以及内存状态信息,识别当前执行的指令是否具有Shl-Add和De_Mem操作逻辑,若存在,则认为当前的代码块为第二代码块类型。

第二代码块类型为具有Shl-Add和De_Mem操作逻辑的代码块。在第二代码块类型中代码片段查询跳转表(Jump Table),并获得存储在跳转表结构中的目标地址。

第三代码块类型是可计算的ICF-gadget,可计算的ICF-gadget为给定一个代码块,如果该代码块的输入值中包含某一数据结构的地址,存在逻辑或者算数操作指令操作了该数据结构的数据地址,并且该代码块的输出值中产生了另一个(新的)数据地址或者指令地址。

为了更好的理解可计算ICF-gadget,请参阅图2,在此代码块中的输入值分别存储在rbx寄存器和rdx寄存器中。rbx寄存器传递了一个全局数据结构的地址,并且该寄存器是mov指令的源操作数,这条指令对rbx寄存器进行了加法操作并并产生了一个新的数据地址传递给了rax寄存器,因此,该代码块就是一个可计算的ICF-gadget。

下面结合图8描述本发明的二进制文件中合法指令的识别装置,间接控制流目标地址识别单元240具体包括以下步骤:

类别判断单元241,用于判断参与动态计算指令地址的代码块类型的类别。

第一分析单元242,用于当代码块类型的类别为第一代码块类型时,获取第一代码块类型中的地址常量并将地址常量记录为合法指令的起始地址,并可以并在后续进行探索。

第二分析单元243,用于当代码块类型的类别为第二代码块类型时,获取第二代码块类型中指令的基址base,迭代地改变index的值并反复执行包含条件(2)的语义(即具有Shl-Add和De_Mem操作)的指令,得到存储在跳转表中的间接控制流目标地址base。

需要说明的是,在本实施例中,若基址base存储在寄存器中,则第二分析单元243会直接读取寄存器中的值作为基址base。

第三分析单元244,用于当代码块类型的类别为第三代码块类型时,根据数据地址的产生和传递关系,将具有相关关系的代码块连成链,形成IE-gadget链,并反复执行IE-gadget链,得到间接控制流目标地址。

基于ICF-gadget,第三分析单元244会分析每一个正在执行的代码块是否是可计算的ICF-gadget,如果是,这个代码块将被记录,同时根据数据地址的产生和传递关系,第三分析单元244将具有相关关系的gadget连成链,形成IE-gadget链,并反复执行这条形成的IE-gadget链,获得更多的间接控制流目标地址。为了更好地说明,请参阅图3,一个数据结构的首地址为0x77e7c0,被传递给rdx寄存器。第二个代码块为可计算的ICF-gadget,该代码块的输入rdx寄存器存储了数据结构的首地址,并且产生了新的数据地址存储在rax寄存器中。第三个代码块的输入rbx寄存器中存储了刚刚新产生的数据地址,并且也进行了逻辑操作并产生新的数据地址,存储在rbx寄存器中,最后一个代码块取rbx寄存器的地址在0xa8偏移处的值,即为一个间接控制流(Indirect Control Flow,ICF)目标地址。因此,第三分析单元244将和初始的全局地址0x77e7c0相关的后三个代码块连接成链,形成IE-gadget链,之后重复的执行这条链,来获取更多的ICF目标地址。

为了获得更多的存储在数据结构中的潜在的ICF目标地址,获取更多的ICF目标地址具体为:第三分析单元244在确定了所有的IE-gadget链后,将一条IE-gadget链传入的数据地址替换为任意出现在ICF-gadge代码块中的数据地址,并不断地执行该IE-gadget链来发掘更多的指令地址,以此类推,执行完所有的IE-gadget链来发掘更多的指令地址。

基于间接控制流目标地址识别单元240的gadget分析方案,可以识别出所有潜在的ICF目标地址,并让合法指令获取单元220的动态执行方案继续执行这些识别出来的潜在的ICF目标地址,从而实现一个二进制文件的所有路径的全覆盖。

本发明二进制文件中合法指令的识别装置解决了二进制重写技术中识别所有合法指令的难题,并且在动态执行模块200分别提出了动态执行方案和gadget(一段具有特定功能的代码片段)分析方案来应对识别合法指令遇到的数据和指令混合以及ICF目标地址计算不全的难题。本发明二进制文件中合法指令的识别装置的动态执行模块200提出了三种代码块类型,并提出了一个可计算的ICF-gadget,结合动态执行信息,动态执行模块200通过分析代码块找出三种代码块类型的代码块,并施加不同的执行策略,可以分析出所有潜在的ICF目标地址。

本发明二进制文件中合法指令的识别装置二进制文件中合法指令的识别方案利用动态执行,其本质就是沿着控制流执行二进制文件,所以可以绕过二进制文件的指令中混合在指令中的数据。如果从一个程序的入口地址沿着控制流路径执行,是可以遍历完所有的路径。但是由于二进制文件中存在间接指令,它的目标地址可能不止一个,如果把所有的潜在目标地址都识别出来,通过动态执行的方式去执行,就可以保证路径全覆盖,也可以保证识别指令的合法。因此通过本发明二进制文件中合法指令的识别方案使用gadget分析方案识别的潜在的ICF目标地址,就可以保证二进制重写技术的完整性和精确性。

综上,本发明二进制文件中合法指令的识别装置,提供了提出一种实用的可以识别出二进制程序中所有合法的指令的装置,可以有效的区分出二进制文件中混合的指令和数据,并且可以识别出所有间接控制流目标地址,从而保证对二进制文件全路径覆盖。

图9示例了一种电子设备的实体结构示意图,如图9所示,该电子设备可以包括:处理器(processor)810、通信接口(CommunicationsInterface)820、存储器(memory)830和通信总线840,其中,处理器810,通信接口820,存储器830通过通信总线840完成相互间的通信。处理器810可以调用存储器830中的逻辑指令,以执行二进制文件中合法指令的识别方法,该方法包括:

S100、获取待执行的二进制文件。

S200、沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址并继续执行探索,其中,所述执行过的指令为合法指令。

此外,上述的存储器830中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的执行二进制文件中合法指令的识别方法,该方法包括:

S100、获取待执行的二进制文件。

S200、沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址并继续执行探索,其中,所述执行过的指令为合法指令。

又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的执行二进制文件中合法指令的识别方法,该方法包括:

S100、获取待执行的二进制文件。

S200、沿着二进制文件的路径执行所述二进制文件的每一条路径,获取执行过的每一条路径中执行过的指令,在执行过程中根据代码块的状态标记代码块类型,对不同类型的所述代码块类型执行不同的迭代策略,识别所有潜在的间接控制流目标地址,并将所述潜在的间接控制流目标地址确定为所述二进制文件的路径的入口地址并继续执行探索,其中,所述执行过的指令为合法指令。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 一种二进制文件中合法指令的识别方法及装置
  • 一种二进制文件中混合在指令中的数据的识别方法及装置
技术分类

06120113256166