Language agnostic 我可以识别一个“";功能“;在x86二进制文件中?

Language agnostic 我可以识别一个“";功能“;在x86二进制文件中?,language-agnostic,x86,code-analysis,Language Agnostic,X86,Code Analysis,“函数”是指二进制文件的块(或块图),该块从某个点开始(可能来自调用指令之一),可能设置堆栈帧,并且具有一个或多个RET形式的端点(并且根据调用约定,它也可能展开所述堆栈帧) 我目前的想法是将各种条件分支指令视为图中的连接,并以这种方式对代码进行广度优先搜索。这是否可行?如果不是,有什么更好的方法 我的目标就是:提取函数。纯粹是为了做这件事。如果我有时间和想法的话,也许以后会做些新奇的事情。如果没有符号表,我会说:几乎不可能。至少没有误报/否定 你首先需要的是一个反汇编程序。仅仅寻找一个字节组合

“函数”是指二进制文件的块(或块图),该块从某个点开始(可能来自调用指令之一),可能设置堆栈帧,并且具有一个或多个RET形式的端点(并且根据调用约定,它也可能展开所述堆栈帧)

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


我的目标就是:提取函数。纯粹是为了做这件事。如果我有时间和想法的话,也许以后会做些新奇的事情。

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

你首先需要的是一个反汇编程序。仅仅寻找一个字节组合并不能解决这个问题,这个组合可能是一些“随机”数据的一部分。然后,跟踪调用可能是最好的解决方案,因为函数不一定总是从相同的操作码序列开始。但即使是反汇编程序也可能会遇到困难,并被文本段中嵌入的数据弄糊涂

即使能够找到函数,如果没有调试符号,也无法获得它们的名称(在编译程序中,不再需要名称,只需要地址)


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

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

你首先需要的是一个反汇编程序。仅仅寻找一个字节组合并不能解决这个问题,这个组合可能是一些“随机”数据的一部分。然后,跟踪调用可能是最好的解决方案,因为函数不一定总是从相同的操作码序列开始。但即使是反汇编程序也可能会遇到困难,并被文本段中嵌入的数据弄糊涂

即使能够找到函数,如果没有调试符号,也无法获得它们的名称(在编译程序中,不再需要名称,只需要地址)


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

您必须查看以下内容:

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

...
...

add    esp, ???
pop    ebp
ret

你必须注意以下事项:

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

...
...

add    esp, ???
pop    ebp
ret

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

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

您可以使用第三方库吗为了这个?当然可以,如果有的话。这只是一种爱好,对任何事情都没有任意的限制。我想用什么就用什么。尽管如此,如果有一个完整的解决方案,我希望它是开源的,因为我对细节感兴趣。你能使用第三方库来解决这个问题吗?当然可以,如果它存在的话。这只是一种爱好,对任何事情都没有任意的限制。我想用什么就用什么。尽管如此,如果有一个完整的解决方案,我希望它是开源的,因为我对细节感兴趣。我不关心名称,也不关心参数,只关心组成函数的blob。我不关心名称,也不关心参数,只是组成函数的BLOB。我想说的是,你最好先查找所有
RETN(x)
,然后再追溯每个函数的起点,这样你就可以捕捉到未引用的函数和表中的函数等。类似这样的东西背后有一些相当繁重的启发(请参见ollydbg),而不是为了假装,除非你不指望捕获未导出的符号。我想说你最好先查找所有
RETN(x)
,然后追溯每个函数的起点,这样你就可以捕获未引用的函数和表中的函数等。像这样的事情背后有一些相当繁重的启发(请参见ollydbg),除非你不指望捕捉到非出口的符号,否则不要假装用心。