程序的函数调用序列也称为控制流,是了解程序功能的重要方法。Temu默认情况下会从污点传播时记录所访问的系统函数,形成一个局部的函数调用序列。但此序列具有两个缺点:其一是局部的,不具备全面性;其二,这个序列不能反应函数调用和返回的全部性质。为更好的掌握函数的调用序列,需要手工修改相关代码。现将修改之中的所得总结如下:
1、功能代码主要添加在insn_begin和insn_end两个函数中。
2、依次检查每条指令,依据三种call指令0xe8、0x9a和(0xff与0x15)判定函数是否调用函数。其中,前两种类型的call指令调用函数后的返回地址距call指令5个字节,后一种类型的call指令调用函数后的返回地址距call指令6个字节。
3、依据函数调用的嵌套关系,可采用一个栈结构保存函数调用的返回地址序列。绝大部分的函数在执行完毕后,会返回到调用此函数的下一条指令(返回地址)继续执行(规则见2)。但EXIT、EXITPROCESS、zwcallbackreturn这三个函数较为例外,这三个函数执行完后直接返回到系统。需要额外处理。
依据如上原理就可在temu执行时,同步生产函数调用序列。