我正在尝试基于从 x86 32 位平台上的二进制文件反汇编的一些汇编代码生成粗粒度的调用图。
基于asm代码生成一个精确的Call Graph是非常困难的,考虑到各种间接控制流转移,所以我现在只考虑直接控制流转移。
因此,首先我试图functions
从x86、32 位上的剥离二进制文件中识别(开始和结束地址)反汇编代码。
现在,我的计划是这样的:
至于开始地址,我可能会保守地认为任何汇编代码看起来像这样
push %ebp
表示函数的起始地址。
而且,我可能会扫描整个问题,call
用目标识别所有指令,将这些函数调用的目标视为所有函数开始地址
问题是:
一些在二进制文件中定义的函数可能永远不会被调用。
一些
call
已经被jump
编译器优化(考虑尾递归调用)
至于结束地址,事情变得更加棘手,因为ret
一个函数中可能存在多个......
所以我想我可能会保守地考虑任何最近的函数开始地址之间的范围,作为一个函数..
我对吗?有没有更好的解决方案..?