“函数”表示从一个点开始的二进制块(或块的图形)(可能从一个CALL指令到达),可能设置一个堆栈帧,并且在一个或多个端点中有一个或多个端点。 RET的形式(根据调用约定,它也可以展开所述堆栈帧)。
我目前的想法是将各种条件分支指令视为图中的结点,并以这种方式对代码进行广度优先搜索。这有可行吗?如果没有,那么更好的方法是什么?
我的目标就是这样:提取功能。纯粹是为了做到这一点。如果我有时间和想法,也许可以稍后做一些事情。
答案 0 :(得分:2)
如果没有符号表,我会说:几乎不可能。至少没有误报/否定。
首先需要的是反汇编程序。只是寻找一个字节组合不会削减它,组合可能是一些“随机”数据的一部分。然后,跟踪CALL可能是最好的解决方案,因为函数不一定总是以相同的操作码序列开始。但即使是反汇编程序也可能会遇到困难,并且会对文本段中的嵌入数据感到困惑。
即使您能够找到这些函数,也无法在没有调试符号的情况下获取它们的名称(在编译的程序中,不再需要名称,只需要地址)。
此外,您很难找到函数接受的参数类型。例如,函数可能接受2参数但不使用。在这种情况下,您需要一个函数调用,并在调用函数之前查看堆栈的准备情况。
答案 1 :(得分:2)
您可以使用反汇编程序库(如BeaEngine)为您完成繁重的工作,然后搜索结果助记符调用。
答案 2 :(得分:0)
您必须寻找以下内容:
push ebp
mov ebp, esp
sub esp, ???
...
...
add esp, ???
pop ebp
ret