我可以在x86二进制文件中识别“函数”吗?

时间:2011-06-03 12:58:43

标签: language-agnostic x86 code-analysis

“函数”表示从一个点开始的二进制块(或块的图形)(可能从一个CALL指令到达),可能设置一个堆栈帧,并且在一个或多个端点中有一个或多个端点。 RET的形式(根据调用约定,它也可以展开所述堆栈帧)。

我目前的想法是将各种条件分支指令视为图中的结点,并以这种方式对代码进行广度优先搜索。这有可行吗?如果没有,那么更好的方法是什么?

我的目标就是这样:提取功能。纯粹是为了做到这一点。如果我有时间和想法,也许可以稍后做一些事情。

3 个答案:

答案 0 :(得分:2)

如果没有符号表,我会说:几乎不可能。至少没有误报/否定。

首先需要的是反汇编程序。只是寻找一个字节组合不会削减它,组合可能是一些“随机”数据的一部分。然后,跟踪CALL可能是最好的解决方案,因为函数不一定总是以相同的操作码序列开始。但即使是反汇编程序也可能会遇到困难,并且会对文本段中的嵌入数据感到困惑。

即使您能够找到这些函数,也无法在没有调试符号的情况下获取它们的名称(在编译的程序中,不再需要名称,只需要地址)。

此外,您很难找到函数接受的参数类型。例如,函数可能接受2参数但不使用。在这种情况下,您需要一个函数调用,并在调用函数之前查看堆栈的准备情况。

答案 1 :(得分:2)

您可以使用反汇编程序库(如BeaEngine)为您完成繁重的工作,然后搜索结果助记符调用

答案 2 :(得分:0)

您必须寻找以下内容:

push    ebp
mov     ebp, esp
sub     esp, ???

...
...

add    esp, ???
pop    ebp
ret