CN113312082B - 一种二进制文件中混合在指令中的数据的识别方法及装置 - Google Patents

一种二进制文件中混合在指令中的数据的识别方法及装置 Download PDF

Info

Publication number
CN113312082B
CN113312082B CN202110483804.1A CN202110483804A CN113312082B CN 113312082 B CN113312082 B CN 113312082B CN 202110483804 A CN202110483804 A CN 202110483804A CN 113312082 B CN113312082 B CN 113312082B
Authority
CN
China
Prior art keywords
instruction
binary file
address
data
code
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
Application number
CN202110483804.1A
Other languages
English (en)
Other versions
CN113312082A (zh
Inventor
陈李维
田力楠
史岗
孟丹
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Information Engineering of CAS
Original Assignee
Institute of Information Engineering of CAS
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Institute of Information Engineering of CAS filed Critical Institute of Information Engineering of CAS
Priority to CN202110483804.1A priority Critical patent/CN113312082B/zh
Publication of CN113312082A publication Critical patent/CN113312082A/zh
Application granted granted Critical
Publication of CN113312082B publication Critical patent/CN113312082B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/74Reverse engineering; Extracting design information from source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种二进制文件中混合在指令中的数据的识别方法及装置,涉及二进制技术领域,包括以下步骤:获取待执行的二进制文件;执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据;将所述混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,本发明实现了二进制重写技术的准确性和完全性。

Description

一种二进制文件中混合在指令中的数据的识别方法及装置
技术领域
本发明涉及二进制技术领域,尤其涉及一种二进制文件中混合在指令中的数据的识别方法及装置
背景技术
二进制重写技术是指在程序源码缺失的情况下,将编译好的二进制文件提升到更高级的编程语言如汇编语言、中间表示语言(intermediate representation,IR),并对其进行二次开发、优化和利用(包括二进制强化、Profiling、插桩和添加安全策略),并再次编译成二进制可执行文件的技术。
由于二进制文件中的数据和指令没有明显界线,有些二进制文件中为了指令对齐会插入一些padding;编译器为了性能优化或者人为因素也会在二进制指令中混入数据。因此,能否有效的区分二进制文件中的指令和数据是二进制重写技术的难点。此外,由于原始程序在编译成二进制后,原程序语言中的数据类型和符号标签等信息都会被舍弃,这使得区分指令和数据更变得异常艰难。
现有的二进制重写技术并不能有效的区分混合的数据和指令,部分二进制重写技术仍然需要完全拷贝原始代码作为重写后二进制文件的执行参考。
发明内容
本发明提供一种二进制文件中混合在指令中的数据的识别方法及装置,用以解决现有技术中二进制重写技术并不能有效的区分数据和指令的缺陷,实现了二进制重写技术的准确性和完全性。
本发明提供一种二进制文件中混合在指令中的数据的识别方法,包括以下步骤:
获取待执行的二进制文件;
执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据;
将所述混合在指令中的数据和二进制文件的原始数据段作为重写二进制文件的数据段。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,所述混合在指令中的数据包括两类,分别为混入函数内的数据和混入函数间的数据,所述混入函数内的数据位于函数内部,并且在函数执行时被访问,所述混入函数间的数据存在于两个函数间,用于指令地址的对齐。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,探索二进制文件的路径,具体包括以下步骤:
从二进制文件的入口地址开始探索二进制文件的路径,执行二进制文件的代码片段;
当遇到二进制文件的分支时,记录未执行的分支的地址并获取所述未执行的分支的地址的状态;
当遇到已经执行过的指令地址或者非法的跳转地址时,停止当前的路径探索,并在当前路径执行终止后恢复所述状态,从未执行的分支的地址开始执行二进制文件的代码片段;其中,状态为二进制文件当前运行时状态;
当一条路径中所有分支遍历后,获取二进制文件的非完全转移指令的指令地址;其中,完全转移指令为转移控制流到两个不同的方向的控制流转移指令,并且非完全转移指令在一条路径的执行过程中被识别;
在第一次遍历所有路径后,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址,并从下一条路径的入口地址继续执行路径探索;
遍历非完全转移指令的地址,以完成对二进制文件的路径的全覆盖。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址时,若从代码块的入口地址解码出的指令中存在无法匹配Def操作的Def_Mem操作,则认为该入口地址是一个数据地址,De_Mem表示一条指令的语义中具有地址解引用操作。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据,具体包括以下步骤:
监控代码片段的执行行为,若某一指令的执行行为尝试访问代码段的内存地址,则确定执行的代码片段访问原始的代码区域,并将访问原始的代码区域的代码片段确定为混合在指令中的数据;
根据当前的已经探索的代码块的内存地址范围,将被访问的地址确定为混合在指令中的数据的地址,以确定混合在指令中的数据的地址的上界和下界。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,将所述混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段之后还包括以下步骤:
重写二进制文件。
根据本发明提供的一种二进制文件中混合在指令中的数据的识别方法,重写二进制文件,具体包括以下步骤:
将执行过的代码片段转换为中间表示语言;
在遍历完所有非完全转移地址后,根据所述重写二进制文件的数据段,转换所述中间表示语言为重写二进制文件的代码片段,将二进制文件重写为重写二进制文件。
本发明还提供一种二进制文件中混合在指令中的数据的识别装置,包括:
二进制文件获取模块,用于获取待执行的二进制文件;
执行模块,用于执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据;
数据段确定模块,用于将所述混合在指令中的数据和二进制文件的原始数据段作为重写二进制文件的数据段。
数据段确定模块本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述一种二进制文件中混合在指令中的数据的识别方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述二进制文件中混合在指令中的数据的识别方法的步骤。
本发明提供的二进制文件中混合在指令中的数据的识别方法及装置,通过探索二进制文件的路径,遍历路径,在路径探索过程中根据指令执行的效果是否访问二进制文件的代码区域,确定是否为混合在指令中的数据的地址,再将执行过的代码片段转换为IR用于代码分析,在遍历完所有非完全地址为入口的路径后,转换中间表示语言为重写二进制文件的代码片段,并将混合在指令中的数据和原始的二进制文件的原始数据段作为所述重写后二进制文件的数据段,可以有效的区分混合在二进制文件指令中的数据,并可以精准的识别二进制文件中所有的合法指令。同时可以满足所有的开发人员对二进制进行二次开发利用的需求,本发明提供的二进制文件中混合在指令中的数据的识别方法及装置将指令转换为架构无关的IR,降低了二进制分析技术的难度。在实验中,本发明提供的二进制文件中混合在指令中的数据的识别方法及装置构建了一个近似理想的参照环境,在此环境中本发明提供的二进制文件中混合在指令中的数据的识别方法及装置可以实现完全的识别二进制程序所有的合法指令和数据,并且不需要原始代码完全拷贝作为数据参考,并且产生的非法指令率仅为0.02%。与同类型二进制重写技术相比通过识别出混合的数据,大大减少了解码二进制文件产生的非法指令的数量。本发明提供的二进制文件中混合在指令中的数据的识别方法及装置分别执行重写后的程序和原始的程序,并且采用默认的参数配置。试验结果表明重写后的程序输出的结果和原始版本程序输出的结果相同,并且它们执行过程中的行为也保持一致。因此,本发明提供的二进制文件中混合在指令中的数据的识别方法及装置有效的解决了二进制重写区分混合的数据和指令的问题,实现了重写技术的准确性和完全性。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的二进制文件中混合在指令中的数据的识别方法的流程示意图一;
图2是本发明提供的二进制文件中混合在指令中的数据的识别方法中遍历二进制文件的路径的示意图;
图3是本发明提供的二进制文件中混合在指令中的数据的识别方法中识别嵌入在指令中的数据的示意图;
图4是本发明提供的二进制文件中混合在指令中的数据的识别方法中两个代码块中出现指令冲突的示例图;
图5是本发明提供的二进制文件中混合在指令中的数据的识别方法中步骤S200具体的流程示意图;
图6是本发明提供的二进制文件中混合在指令中的数据的识别方法的流程示意图二;
图7是本发明提供的二进制文件中混合在指令中的数据的识别方法中步骤S400具体的流程示意图;
图8是本发明提供的二进制文件中混合在指令中的数据的识别装置的结构示意图一;
图9是本发明提供的二进制文件中混合在指令中的数据的识别装置的结构示意图二;
图10是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
目前常使用的二进制重写技术包括:
(1)BINCFI技术:BINCFI技术结合了线性反汇编和递归反汇编两种技术,从二进制程序入口开始线性解码,并用递归反汇编检查错误识别的汇编指令。当产生错误解码指令时,BINCFI确定错误识别指令上下界,并绕过这个地址范围重新解码,直到没有新的错误解码指令产生,BINCFI认为指令中混有的数据会导致错误指令的产生,因此其通过识别错误指令的上下界来绕过混有的数据,从而实现精确的识别所有合法指令。BINCFI技术还通过静态分析方法来识别潜在的间接控制流(Indirect Control Flow,ICF)目标地址,来保证上下界的精确。但是BINCFI技术并不能精确区分数据和指令,上下界有效范围不能得到保证,仍然需要拷贝原始代码作为重写后二进制文件的指令地址参考。
(2)MULTIVERSE技术:MULTIVERSE技术从代码段的0字节偏移处开始解码二进制程序,当遇到非法指令编码、已经解码过的偏移长度、字节码序列的结尾等情况时会停止解码,并从下一个字节偏移处重新开始解码,直到迭代完所有的字节偏移,而后将识别出的所有汇编指令的地址映射在一个映射表中,方便重写后二进制程序运行时查找合适的指令。MULTIVERSE技术将二进制文件中的每一个字节都作为指令的起始地址来识别所有可能合法的指令,MULTIVERSE技术虽然可以识别出所有合法的指令,但是也会产生大量冗余的非法指令,且无法辨认出识别的指令中的错误解码,哪些是合法指令产生的,哪些是混合的数据产生的。
(3)Zipr技术:Zipr技术利用现有的汇编器的解码结果来区分指令和数据,且Zipr技术使用objdump和IDA Pro的识别结果。对于一些不确定的识别结果,Zipr技术会给使用者发出警告,并让使用者来进行调试。Zipr技术利用现有的反汇编器的识别结果作为参考结果,所以Zipr技术的准确性取决于参考的反汇编器的识别结果。从目前来看其参考的objdump并不能有效的区分混合的数据和指令,仍然会将混在指令中的数据当做指令处理。
综上所述,现有的二进制重写技术并不能有效的区分混合的数据和指令,部分二进制重写技术仍然需要拷贝原始代码作为重写后二进制文件的执行参考。
下面结合图1-图4描述本发明的二进制文件中混合在指令中的数据的识别方法,该动态分析方法包括以下步骤:
S100、获取待执行的二进制文件。
S200、执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据。并且能够通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
在步骤S200中,首先让待执行的二进制文件即原始的二进制程序正常执行,如果遇到二进制文件的分支,记录未执行的分支地址并获取未执行的分支的地址的状态。其中,状态为二进制文件当前运行时状态,具体的,二进制文件当前运行时状态包括二进制文件运行时程序栈、程序堆、数据段和寄存器等的状态。
需要特别说明的是,在步骤S200中如果二进制文件需要用户输入,则根据二进制文件的提示要求正常输入即可,这样可以保证正确的内存状态,使得在路径探索阶段减少二进制文件的崩溃频率,提高后续识别嵌入的数据地址的准确度。
之后在二进制文件正常执行结束退出后,继续执行刚刚记录的未执行的分支的地址,直到遍历结束,在此过程中还会记录非完全转移指令的地址,并将它们作为下一条路径探索的入口地址即起始地址,当执行完所有以非完全转移指令的地址为开始地址的路径后,得到二进制文件的所有指令地址。
在该动态识别方法中,混合在指令中的数据包括两类,分别为混入函数内的数据和混入函数间的数据,混入函数内的数据位于函数内部,并且在函数执行时被访问,混入函数间的数据存在于两个函数间,用于指令地址的对齐。
为了识别出混合在指令中的数据,步骤S200的运行时信息,运行时信息包括指令语义信息和运行过程中的中央处理器(Central Processing Unit,CPU)以及内存状态信息,提出了识别嵌入的数据分析方案。步骤S200在运行时监控每个代码片段的执行行为,若某一指令的执行行为尝试访问代码片段的内存地址,步骤S200将记录此次访问的这个地址。在遍历完未执行的分支的地址,并在选取下一条后述的非完全转移指令之前,根据当前的已经探索的代码块的地址范围,来确定这个被访问数据地址的上界和下界,即通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
请参阅图3,在遍历未执行的分支地址后,在选取下一条后述的非完全转移指令之前,地址0x401fc3是数据地址,并且位于0x401fb8的指令访问了该数据,因此,根据当前已经探索的代码块的地址范围,确定了被访问的地址的范围,即地址0x401fc3的范围。
在后续转换为重写二进制文件并执行时,可以通过步骤S200得到的混合在指令中的数据的地址来访问之前混合在指令中的数据,保持地址不变可以让新生成的代码指令直接访问到数据,不需要额外进行地址转换。
S300、将混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,从而实现精确识别原始二进制文件中的所有合法指令。
下面结合图5描述本发明的二进制文件中混合在指令中的数据的识别方法,步骤S200中根探索二进制文件的路径,具体包括以下步骤:
S201、从二进制文件的入口地址开始探索二进制文件的路径,执行二进制文件的代码片段。
S202、当遇到二进制文件的分支时,记录未执行的分支的地址并获取所述未执行的分支的地址的状态。
S203、当遇到已经执行过的指令地址或者非法的跳转地址时,停止当前的路径探索,并在当前路径执行终止后恢复所述状态,从未执行的分支的地址开始执行二进制文件的代码片段;其中,状态为二进制文件当前运行时状态。
S204、当一条路径中所有分支遍历后,获取二进制文件的非完全转移指令的地址;其中,完全转移指令为转移控制流到两个不同的方向的控制流转移指令,并且非完全转移指令在一条路径的执行过程中被识别。
如图2所示代码片段,其中包含许多控制流转移指令。这些指令转移控制流到代码段的不同位置。根据完全转移指令的定义,如果一个控制流转移指令转移控制流到两个不同的方向,那么该条指令就是一个完全转移指令。
因此,JCC类型的指令属于完全转移指令。其根据标志位状态,转移控制流到不同的地址。简言之就是这种类型指令包含两种可能的目标地址;
Call指令也属于完全转移指令。其调用的函数返回后,控制流会从call指令的下一条指令继续执行;
Jmp指令不属于完全转移指令。其只改变控制流到一个指定的位置;
Ret指令也只影响控制流一次,因此也不是完全转移指令。
S205、在第一次遍历所有路径后,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址,并从下一条路径的入口地址继续执行路径探索,例如从ret指令的下一条地址继续执行路径探索。
同时,在从非完全转移指令下一条指令执行时,如果下一条指令是数据,将会出现合法指令的识别错误。
S206、遍历非完全转移指令的地址,以完成对二进制文件的路径的全覆盖。
下面结合图6描述本发明的二进制文件中混合在指令中的数据的识别方法,在步骤S300之后还包括以下步骤:
S400、重写二进制文件。
下面结合图7描述本发明的二进制文件中混合在指令中的数据的识别方法,步骤S400具体包括以下步骤:
S401、将执行过的代码片段转换为中间表示语言(intermediaterepresentation,IR)。
S402、在遍历完所有非完全转移地址后,转换IR为重写二进制文件的代码片段,将二进制文件重写为重写后二进制文件。
需要说明的是,步骤S301将执行过的代码片段转换为IR时,若出现IR序列为shl-add-inttoptr对时,则认为执行的代码片段中包含遍历跳转表的间接转移指令,通过识别跳转表的基址和跳转表的地址范围,可以确定跳转表所在代码区域的地址和范围,从而识别出跳转表结构。其中,shl和add分别表示一条指令的语义中具有左移和加法操作。
步骤S302中转换IR为重写二进制文件的代码片段过程中,会出现无效的代码块和非法数据地址的代码块,其中无效的代码块为出现在转换完成的代码块中的转换过程的代码块,非法数据地址的代码块为入口地址是非法数据地址的代码块,并根据公式(1)判断是否为非法数据地址的代码块,公式(1)为:
<Def:Reg→De_Mem(Reg)> (1)
其中,De_Mem表示一条指令的语义中具有地址解引用操作,对于在一个代码块中的每一个Def_Mem操作,寻找对应的Def操作。若寻找不到对应的Def操作,则认为该代码块的入口地址是一个非法数据地址,即若一个代码块中存在无法匹配Def操作的Def_Mem操作,则认为该代码块的入口地址是一个非法数据地址,
对于混入函数内的数据,根据无效的代码块的定义,如果一条指令在识别转换的过程中已经出现在一个转换完成的代码块中,那么当前正在转换的代码块就为一个无效的代码块。
对于识别的非法指令,请参阅图4,一个已经转换完成的代码块的起始地址为addr3,另一个正在转换的代码块的起始地址为addr1,当识别到instr2指令时,该条指令已经存在于前面的代码块中,因此该代码块为无效的代码块。当数据出现在函数内时,由于步骤S200已经沿着控制流识别出所有的合法指令,因此当执行二进制文件的代码片段时,是从一个混合在指令中的数据的地址开始执行时,其产生的指令已经存在于其他代码块中,该执行过程即被终止。因此,当从一个混入函数内的数据地址开始执行时,本发明的二进制文件中混合在指令中的数据的识别方法可以绕过这种干扰。
如果混合在指令中的数据存在于两个函数间,并且这个两个函数已经执行完成,那么当从这个混合在指令中的数据的地址开始识别指令时,根据无效的代码块的定义就可以绕过此类情况。但是其中一个函数还没有被执行,为了识别这种情况,通过公式(1)定义了如下的寄存器传递关系:
选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址时,代码块的入口地址可能是代码中数据的地址,如果存在Def_Mem操作的地址解引用存储在一个寄存器中的内存地址,那么必然存在一个Def操作赋一个值给这个寄存器。对于在一个代码块中的每一个Def_Mem操作,步骤S300会寻找对应的Def操作,如果Def操作不存在,则认为识别的代码块的入口地址是一个数据地址即入口地址是一个数据地址的代码块。因为,本发明的二进制文件中混合在指令中的数据的识别方法将具有Def_Mem操作的指令的下一个地址作为一个代码块的入口地址重新识别,并会通过公式(1)继续匹配新生成的代码块的寄存器传递关系,直到可以匹配出该关系则认为代码块的入口地址是合法地址。
一个二进制文件主要包括代码段和数据段,目前的二进制重写技术会重新生成一个代码段,其余段(主要指数据段)都保留,但是代码段在重新生成会出现不精准的问题,因此需要拷贝整段的代码。
本发明二进制文件中混合在指令中的数据的识别方法在进行二进制文件的重写时,重写后的二进制程序不需要原始的代码完全拷贝,满足实用性、准确性和安全性要求。本发明二进制文件中混合在指令中的数据的识别方法利用二进制文件的代码片段动态执行产生的访存语义行为来判断访问的数据是否存在于代码片段中,并且根据执行的状态信息识别混入在代码片段中的数据的上界和下界,即确定了混合在指令中的数据的地址,并且可以保证完全遍历完二进制文件所有的路径,实现了有效的区分出合法指令和数据。
和其他二进制重写技术相比,本发明二进制文件中混合在指令中的数据的识别方法不需要假设和辅助信息,并且不需要复杂的分析算法就可以有效区分有效的数据和指令。本发明二进制文件中混合在指令中的数据的识别方法通过IR分析来寻找关键的结构信息,此方法也降低了分析二进制的指令的复杂度。本发明二进制文件中混合在指令中的数据的识别方法可以满足实用性、准确性和安全性,同时降低分析复杂度。
综上,本发明二进制文件中混合在指令中的数据的识别方法,提供了一种实用的有效区分混合的数据和指令的方法,可以识别出二进制文件中的所有合法指令,使得重写后的二进制程序不需要原始的代码完全拷贝,同时此方法还可以保证对二进制文件全路径覆盖。
下面对本发明提供的本发明的二进制文件中混合在指令中的数据的识别装置进行描述,下文描述的二进制文件中混合在指令中的数据的识别装置与上文描述的二进制文件中混合在指令中的数据的识别方法可相互对应参照。
下面结合图8描述本发明的二进制文件中混合在指令中的数据的识别装置,该动态分析装置包括:
二进制文件获取模块100,用于获取待执行的二进制文件。
分析模块200,用于执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据。并且能够通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
在分析模块200中,首先让待执行的二进制文件即原始的二进制程序正常执行,如果遇到二进制文件的分支,记录未执行的分支地址并获取未执行的分支的地址的状态。其中,状态为二进制文件当前运行时状态,具体的,二进制文件当前运行时状态包括二进制文件运行时程序栈、程序堆、数据段和寄存器等的状态。
需要特别说明的是,在分析模块200中如果二进制文件需要用户输入,则根据二进制文件的提示要求正常输入即可,这样可以保证正确的内存状态,使得在路径探索阶段减少二进制文件的崩溃频率,提高后续识别嵌入的数据地址的准确度。
之后在二进制文件正常执行结束退出后,继续执行刚刚记录的未执行的分支的地址,直到遍历结束,在此过程中还会记录非完全转移指令的地址,并将它们作为下一条路径探索的入口地址即起始地址,当执行完所有以非完全转移指令的地址为开始地址的路径后,得到二进制文件的所有指令地址。
在该动态识别方法中,混合在指令中的数据包括两类,分别为混入函数内的数据和混入函数间的数据,混入函数内的数据位于函数内部,并且在函数执行时被访问,混入函数间的数据存在于两个函数间,用于指令地址的对齐。
为了识别出混合在指令中的数据,分析模块200的运行时信息,运行时信息包括指令语义信息和运行过程中的中央处理器(Central Processing Unit,CPU)以及内存状态信息,提出了识别嵌入的数据分析方案。分析模块200在运行时监控每个代码片段的执行行为,若某一指令的执行行为尝试访问代码片段的内存地址,分析模块200将记录此次访问的这个地址。在遍历完未执行的分支的地址后,并在选取下一条后述的非完全转移指令之前,根据当前的已经探索的代码块的地址范围,来确定这个被访问数据地址的上界和下界,即通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
在后续转换为重写二进制文件并执行时,可以通过分析模块200得到的混合在指令中的数据的地址来访问之前混合在指令中的数据,保持地址不变可以让新生成的代码指令直接访问到数据,不需要额外进行地址转换。
数据段确定模块300,用于将混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,从而实现精确识别原始二进制文件中的所有合法指令。
数据段确定模块
下面结合图9描述本发明的二进制文件中混合在指令中的数据的识别装置,执行模块200具体包括:
记录分支单元202,用于执行二进制文件,当遇到二进制文件的分支时,记录未执行的分支的地址并获取未执行的分支的地址的状态。
分支探索单元201,用于获取二进制文件的非完全转移指令的地址,其中,完全转移指令为转移控制流到两个不同的方向的控制流转移指令,在第一次遍历所有路径后,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址,并从该入口地址继续执行路径探索,例如从ret指令的下一条地址继续执行路径探索。同时,在从非完全转移指令下一条指令执行时,如果下一条指令是数据,将会出现合法指令的识别错误。遍历非完全转移的指令,以完成对二进制文件的路径的全覆盖。
特别说明的是,当遇到遍历过的指令地址或者是非法的跳转地址时,停止当前路径探索,并继续探索下一个未执行分支地址,同时在路径探索过程中如果还遇到未执行的分支地址,仍然记录未执行分支地址。获取未执行分支地址的状态,并标记未执行分支地址中非完全转移指令,并在稍后进行遍历。直到遍历完所有的非完全转移指令,这样就可以实现对二进制文件的路径的全覆盖。
图10示例了一种电子设备的实体结构示意图,如图10所示,该电子设备可以包括:处理器(processor)810、通信接口(Communications Interface)820、存储器(memory)830和通信总线830,其中,处理器810,通信接口820,存储器830通过通信总线830完成相互间的通信。处理器810可以调用存储器830中的逻辑指令,以执行二进制文件中混合在指令中的数据的识别方法,该动态分析方法包括以下步骤:
S100、获取待执行的二进制文件。
S200、执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据。并且能够通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
S300、将混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,从而实现精确识别原始二进制文件中的所有合法指令。
此外,上述的存储器830中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的二进制文件中混合在指令中的数据的识别方法,该动态分析方法包括以下步骤:
S100、获取待执行的二进制文件。
S200、执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据。并且能够通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
S300、将混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,从而实现精确识别原始二进制文件中的所有合法指令。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的二进制文件中混合在指令中的数据的识别方法,该动态分析方法包括以下步骤:
S100、获取待执行的二进制文件。
S200、执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据。并且能够通过已执行的原始的代码区域确定混合在指令中的数据的地址范围。
S300、将混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段,从而实现精确识别原始二进制文件中的所有合法指令。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (6)

1.一种二进制文件中混合在指令中的数据的识别方法,其特征在于,包括以下步骤:
获取待执行的二进制文件;
执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据;
将所述混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段;
其中,所述混合在指令中的数据包括两类,分别为混入函数内的数据和混入函数间的数据,所述混入函数内的数据位于函数内部,并且在函数执行时被访问,所述混入函数间的数据存在于两个函数间,用于指令地址的对齐;
探索二进制文件的路径,具体包括以下步骤:
从二进制文件的入口地址开始探索二进制文件的路径,执行二进制文件的代码片段;
当遇到二进制文件的分支时,记录未执行的分支的地址并获取所述未执行的分支的地址的状态;
当遇到已经执行过的指令地址或者非法的跳转地址时,停止当前的路径探索,并在当前路径执行终止后恢复所述状态,从未执行的分支的地址开始执行二进制文件的代码片段;其中,所述状态为二进制文件当前运行时状态;
当一条路径中所有分支遍历后,获取二进制文件的非完全转移指令的地址;其中,完全转移指令为转移控制流到两个不同的方向的控制流转移指令,并且非完全转移指令在一条路径的执行过程中被识别;
在第一次遍历所有路径后,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址,并从下一条路径的入口地址继续执行路径探索;
遍历非完全转移指令的地址,以完成对二进制文件的路径的全覆盖;
选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址时,若从代码块的入口地址解码出的指令中存在无法匹配Def操作的Def_Mem操作,则认为该入口地址是一个数据地址,De_Mem表示一条指令的语义中具有地址解引用操作;
当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据,具体包括以下步骤:
监控代码片段的执行行为,若某一指令的执行行为尝试访问代码段的内存地址,则确定执行的代码片段访问原始的代码区域,并将访问原始的代码区域的代码片段确定为混合在指令中的数据;
根据当前的已经探索的代码块的内存地址范围,将被访问的地址确定为混合在指令中的数据的地址,以确定混合在指令中的数据的地址的上界和下界。
2.根据权利要求1所述的二进制文件中混合在指令中的数据的识别方法,其特征在于,将所述混合在指令中的数据和二进制文件的原始数据段作为重写后二进制文件的数据段之后还包括以下步骤:
重写二进制文件。
3.根据权利要求2所述的二进制文件中混合在指令中的数据的识别方法,其特征在于,重写二进制文件,具体包括以下步骤:
将执行过的代码片段转换为中间表示语言;
在遍历完所有非完全转移地址后,转换所述中间表示语言为重写二进制文件的代码片段,将二进制文件重写为所述重写后二进制文件。
4.一种二进制文件中混合在指令中的数据的识别装置,其特征在于,包括:
二进制文件获取模块,用于获取待执行的二进制文件;
执行模块,用于执行所述二进制文件,探索二进制文件的路径,当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据;
数据段确定模块,用于将所述混合在指令中的数据和二进制文件的原始数据段作为重写二进制文件的数据段;
其中,所述混合在指令中的数据包括两类,分别为混入函数内的数据和混入函数间的数据,所述混入函数内的数据位于函数内部,并且在函数执行时被访问,所述混入函数间的数据存在于两个函数间,用于指令地址的对齐;
探索二进制文件的路径,具体包括以下步骤:
从二进制文件的入口地址开始探索二进制文件的路径,执行二进制文件的代码片段;
当遇到二进制文件的分支时,记录未执行的分支的地址并获取所述未执行的分支的地址的状态;
当遇到已经执行过的指令地址或者非法的跳转地址时,停止当前的路径探索,并在当前路径执行终止后恢复所述状态,从未执行的分支的地址开始执行二进制文件的代码片段;其中,所述状态为二进制文件当前运行时状态;
当一条路径中所有分支遍历后,获取二进制文件的非完全转移指令的地址;其中,完全转移指令为转移控制流到两个不同的方向的控制流转移指令,并且非完全转移指令在一条路径的执行过程中被识别;
在第一次遍历所有路径后,选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址,并从下一条路径的入口地址继续执行路径探索;
遍历非完全转移指令的地址,以完成对二进制文件的路径的全覆盖;
选取一个未被选取的非完全转移指令的地址作为下一条路径的入口地址时,若从代码块的入口地址解码出的指令中存在无法匹配Def操作的Def_Mem操作,则认为该入口地址是一个数据地址,De_Mem表示一条指令的语义中具有地址解引用操作;
当执行的二进制文件的代码片段访问原始的代码区域时,将访问原始的代码区域的所述代码片段确定为混合在指令中的数据,具体包括以下步骤:
监控代码片段的执行行为,若某一指令的执行行为尝试访问代码段的内存地址,则确定执行的代码片段访问原始的代码区域,并将访问原始的代码区域的代码片段确定为混合在指令中的数据;
根据当前的已经探索的代码块的内存地址范围,将被访问的地址确定为混合在指令中的数据的地址,以确定混合在指令中的数据的地址的上界和下界。
5.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至3任一项所述二进制文件中混合在指令中的数据的识别方法的步骤。
6.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至3任一项所述二进制文件中混合在指令中的数据的识别方法的步骤。
CN202110483804.1A 2021-04-30 2021-04-30 一种二进制文件中混合在指令中的数据的识别方法及装置 Active CN113312082B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110483804.1A CN113312082B (zh) 2021-04-30 2021-04-30 一种二进制文件中混合在指令中的数据的识别方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110483804.1A CN113312082B (zh) 2021-04-30 2021-04-30 一种二进制文件中混合在指令中的数据的识别方法及装置

Publications (2)

Publication Number Publication Date
CN113312082A CN113312082A (zh) 2021-08-27
CN113312082B true CN113312082B (zh) 2024-03-08

Family

ID=77372694

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110483804.1A Active CN113312082B (zh) 2021-04-30 2021-04-30 一种二进制文件中混合在指令中的数据的识别方法及装置

Country Status (1)

Country Link
CN (1) CN113312082B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1900910A (zh) * 2005-07-22 2007-01-24 中国科学院计算技术研究所 二进制翻译中经由跳转表的多目标分支语句的识别方法
CN104951274A (zh) * 2014-03-27 2015-09-30 英特尔公司 用于控制流安全性的二进制转换机制的指令和逻辑
CN111898130A (zh) * 2020-06-28 2020-11-06 中国科学院信息工程研究所 一种细粒度控制流完整性保护实现方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8533836B2 (en) * 2012-01-13 2013-09-10 Accessdata Group, Llc Identifying software execution behavior

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1900910A (zh) * 2005-07-22 2007-01-24 中国科学院计算技术研究所 二进制翻译中经由跳转表的多目标分支语句的识别方法
CN104951274A (zh) * 2014-03-27 2015-09-30 英特尔公司 用于控制流安全性的二进制转换机制的指令和逻辑
CN111898130A (zh) * 2020-06-28 2020-11-06 中国科学院信息工程研究所 一种细粒度控制流完整性保护实现方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
SVM-based Instruction Set Identification for Grid Device Firmware;Ma, Yuan et al.;PROCEEDINGS OF 2019 IEEE 8TH JOINT INTERNATIONAL INFORMATION TECHNOLOGY AND ARTIFICIAL INTELLIGENCE CONFERENCE (ITAIC 2019);20191231;第214-218页 *
二进制代码块:面向二进制程序的细粒度控制流完整性校验方法;王明华 等;《信息安全学报》;20160430;第01卷(第02期);第61-72页 *

Also Published As

Publication number Publication date
CN113312082A (zh) 2021-08-27

Similar Documents

Publication Publication Date Title
ElWazeer et al. Scalable variable and data type detection in a binary rewriter
US8316448B2 (en) Automatic filter generation and generalization
EP1618470B1 (en) Method and apparatus for recovering data values in dynamic runtime systems
US11579856B2 (en) Multi-chip compatible compiling method and device
Hasabnis et al. Lifting assembly to intermediate representation: A novel approach leveraging compilers
US11568044B2 (en) Method and apparatus for vetting universal serial bus device firmware
CN115017516A (zh) 一种基于符号执行的模糊测试方法
Zhao et al. Haepg: An automatic multi-hop exploitation generation framework
Dewey et al. Uncovering use-after-free conditions in compiled code
US20160048378A1 (en) Method for enabling independent compilation of program and a system therefor
CN114625646A (zh) 一种检测系统内存越界的方法和装置
CN110727476A (zh) 一种授权配置文件的生成方法、装置、设备及存储介质
CN113312082B (zh) 一种二进制文件中混合在指令中的数据的识别方法及装置
US8843908B2 (en) Compiler validation via program verification
Gao et al. A comprehensive detection of memory corruption vulnerabilities for C/C++ programs
Ruaro et al. Not your Type! Detecting Storage Collision Vulnerabilities in Ethereum Smart Contracts
CN114527963B (zh) C++二进制文件中的类继承关系识别方法及电子装置
CN114003868A (zh) 一种处理软件代码的方法和电子设备
CN113296833B (zh) 一种二进制文件中合法指令的识别方法及装置
Yin et al. SafeOSL: Ensuring memory safety of C via ownership‐based intermediate language
CN107203407B (zh) Java虚拟机中的数据校验方法及装置
US20240329981A1 (en) Renaming global variables based on inferred types of variables in application program code
US20240329955A1 (en) Inferring type definitions of user-defined types of variables in application program code
KR20180064825A (ko) 명시적 및 암시적 정보 흐름 추적 방법 및 그 장치
Kim Practical Static Binary Analysis with Block Memory Model

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