目标二进制程序的函数边界识别方法及系统

摘要: 本发明涉及数据处理,尤其涉及一种目标二进制程序的函数边界识别方法及系统。背景技术:1、在软件逆向工程、漏洞挖掘、恶意软件分析及程序优化等应用场景中,准确识别无调...
目标二进制程序的函数边界识别方法及系统

本发明涉及数据处理,尤其涉及一种目标二进制程序的函数边界识别方法及系统。

背景技术:

1、在软件逆向工程、漏洞挖掘、恶意软件分析及程序优化等应用场景中,准确识别无调试符号二进制程序中的每个函数边界,是进行程序行为理解、指令语义恢复和代码重构的基础前提。

2、现有的函数边界识别方法通常采用基础的动态轨迹追踪技术。该方法通过插桩或硬件追踪手段执行目标程序,在程序运行过程中实时捕获执行序列中的调用指令和返回指令,并直接将这些被触发的调用指令及其对应的返回指令所在的地址位置,记录为相应函数的起始边界和终止边界,以此来划定二进制代码的函数范围。

3、这种现有技术仅依赖明确的调用指令和返回指令来界定函数,在处理经过尾调用优化的二进制程序时,由于编译器会将处于函数末尾的调用操作优化并替换为无条件跳转指令,导致控制流直接通过跳转指令进入新函数,无法触发调用指令监控机制。这造成了大量尾调用函数的起始边界严重漏报,导致最终输出的函数边界识别结果极不完整且准确率低下。

技术实现思路

1、本发明提供一种目标二进制程序的函数边界识别方法及系统,用以解决现有技术中的缺陷,实现函数边界识别完整性与分析效率的协同提升。

2、本发明提供一种目标二进制程序的函数边界识别方法,包括如下步骤:

3、获取目标二进制程序的动态执行指令序列;

4、从所述动态执行指令序列中提取基础函数边界信息,生成初始函数集合;

5、将所述初始函数集合作为当前函数集合,对所述动态执行指令序列进行多轮迭代遍历;在每轮迭代遍历过程中,针对所述动态执行指令序列中的无条件跳转指令,若所述无条件跳转指令的目标地址与所述当前函数集合中的已知函数边界满足预设的尾调用关联条件,则将所述目标地址作为新的函数边界更新至所述当前函数集合中;

6、当任一轮迭代遍历结束时未向所述当前函数集合新增函数边界,则结束迭代遍历,并将迭代遍历结束时的当前函数集合作为全局函数集合;

7、基于所述全局函数集合对所述动态执行指令序列进行边界判定,确定所述动态执行指令序列对应的函数起始边界和函数终止边界。

8、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述尾调用关联条件包括以下条件中的至少一种:

9、所述无条件跳转指令的目标地址位于与所述无条件跳转指令所在模块不同的另一模块内;

10、所述无条件跳转指令的目标地址为当前模块内的已知符号地址,且所述已知符号不属于预设的内部标记符号;

11、在所述无条件跳转指令的目标地址与所述无条件跳转指令的指令地址之间,存在所述当前函数集合中的已知函数的函数起始边界。

12、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述在所述无条件跳转指令的目标地址与所述无条件跳转指令的指令地址之间,存在所述当前函数集合中的已知函数的函数起始边界,包括:

13、比较所述目标地址与所述无条件跳转指令的指令地址;

14、若所述目标地址小于所述指令地址,且所述目标地址位于所述无条件跳转指令所属函数的函数起始边界之前,则确定所述无条件跳转指令满足所述尾调用关联条件;

15、若所述目标地址大于所述指令地址,且所述目标地址与所述指令地址之间的指令区间属于同一连续函数体,则确定所述无条件跳转指令满足所述尾调用关联条件,并将所述目标地址作为新的函数边界。

16、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述结束迭代遍历,包括:

17、统计当前轮迭代遍历结束时所述当前函数集合中的函数边界数量;

18、将所述当前轮迭代遍历的函数边界数量与上一轮迭代遍历结束时的函数边界数量进行比对,其中,首轮迭代遍历对应的上一轮函数边界数量为所述初始函数集合的函数边界数量;

19、若所述当前轮迭代遍历的函数边界数量大于所述上一轮的函数边界数量,则发起下一轮迭代遍历;

20、若所述当前轮迭代遍历的函数边界数量等于所述上一轮的函数边界数量,则结束迭代遍历,并将所述当前轮迭代遍历结束时的当前函数集合作为所述全局函数集合。

21、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述基于所述全局函数集合对所述动态执行指令序列进行边界判定,包括:

22、在遍历所述动态执行指令序列的过程中,记录位于返回指令之前的写入内存指令所写入的目标内存地址及写入值;

23、当读取到所述返回指令时,获取所述返回指令执行时的栈顶地址,以及所述栈顶地址处存储的返回地址;

24、若所述栈顶地址与所记录的目标内存地址一致,且所述返回地址与所记录的写入值一致,则不将所述返回指令所在位置判定为当前函数的函数终止边界,将所述返回地址对应的位置判定为新的函数起始边界。

25、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述基于所述全局函数集合对所述动态执行指令序列进行边界判定,还包括:

26、当读取到调用指令时,获取所述调用指令的指令地址,以及所述动态执行指令序列中位于所述调用指令之后的下一条指令的指令地址;

27、将所述下一条指令的指令地址与所述调用指令的指令地址进行比较;

28、若所述下一条指令的指令地址与所述调用指令的指令地址相同,则将所述调用指令对应的多次执行合并判定为一次函数进入;

29、若所述下一条指令的指令地址与所述调用指令的指令地址不同,则将所述下一条指令的指令地址判定为新的函数起始边界。

30、根据本发明提供的一种目标二进制程序的函数边界识别方法,在将所述下一条指令的指令地址判定为新的函数起始边界之前,还包括:

31、判断所述目标二进制程序是否为32位地址无关可执行程序,以及所述调用指令的目标地址是否等于所述调用指令的指令地址与所述调用指令的指令长度之和;

32、若所述目标二进制程序为32位地址无关可执行程序,且所述调用指令的目标地址等于所述调用指令的指令地址与所述调用指令的指令长度之和,则不将所述调用指令判定为函数调用,且不更新函数起始边界。

33、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述基于所述全局函数集合对所述动态执行指令序列进行边界判定,还包括:

34、读取所述动态执行指令序列中的间接跳转指令,识别所述间接跳转指令的寻址操作数;

35、若所述寻址操作数为基于指令指针寄存器加偏移量的内存寻址模式,则确定所述间接跳转指令为对全局偏移表的访问,并将所述间接跳转指令判定为函数调用。

36、根据本发明提供的一种目标二进制程序的函数边界识别方法,所述从所述动态执行指令序列中提取基础函数边界信息,生成初始函数集合,包括:

37、对所述动态执行指令序列进行一次完整遍历,且在所述完整遍历过程中不应用所述尾调用关联条件;

38、在所述完整遍历过程中,根据调用指令确定函数起始边界,根据返回指令确定函数终止边界,得到所述基础函数边界信息;

39、将所述基础函数边界信息汇总,作为所述初始函数集合。

40、本发明还提供一种目标二进制程序的函数边界识别系统,包括如下模块:

41、序列获取模块,用于获取目标二进制程序的动态执行指令序列;

42、基础信息提取模块,用于从所述动态执行指令序列中提取基础函数边界信息,生成初始函数集合;

43、迭代遍历更新模块,用于将所述初始函数集合作为当前函数集合,对所述动态执行指令序列进行多轮迭代遍历;在每轮迭代遍历过程中,针对所述动态执行指令序列中的无条件跳转指令,若所述无条件跳转指令的目标地址与所述当前函数集合中的已知函数边界满足预设的尾调用关联条件,则将所述目标地址作为新的函数边界更新至所述当前函数集合中;

44、迭代终止模块,用于当任一轮迭代遍历结束时未向所述当前函数集合新增函数边界,则结束迭代遍历,并将迭代遍历结束时的当前函数集合作为全局函数集合;

45、边界判定模块,用于基于所述全局函数集合对所述动态执行指令序列进行边界判定,确定所述动态执行指令序列对应的函数起始边界和函数终止边界。

46、本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述目标二进制程序的函数边界识别方法。

47、本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述目标二进制程序的函数边界识别方法。

48、本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述目标二进制程序的函数边界识别方法。

49、综上所述,本技术实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

50、通过获取目标二进制程序的动态执行指令序列,从而以程序运行时的真实执行记录替代静态推断,排除编译器优化和动态链接机制对函数边界判定的干扰。通过从动态执行指令序列中提取基础函数边界信息并生成初始函数集合,从而以调用指令和返回指令的确定性语义建立零误报的函数边界识别基准,为后续多轮迭代遍历提供可靠的已知函数边界参照。通过将初始函数集合作为当前函数集合对动态执行指令序列进行多轮迭代遍历、在每轮迭代遍历过程中针对无条件跳转指令检查目标地址与当前函数集合中已知函数边界是否满足尾调用关联条件并将符合条件的目标地址更新至当前函数集合,从而将每轮新增的函数边界信息反哺至下一轮判定中,逐步识别编译器将调用指令替换为无条件跳转指令后产生的深层尾调用函数边界。通过在任一轮迭代遍历未新增函数边界时结束迭代并将当前函数集合固化为全局函数集合,从而在信息增益归零时自适应终止迭代,避免冗余遍历。通过基于全局函数集合对动态执行指令序列进行边界判定并输出函数起始边界和函数终止边界,从而使在线分析阶段直接查表完成判定,将多轮迭代的计算开销完全限定在预分析阶段,从而提升了函数边界识别完整性与在线分析效率。