【发布时间】:2013-08-23 18:35:16
【问题描述】:
我希望对程序的二进制可执行文件进行分析,以创建特定函数调用的参数列表。我可以使用 OllyDbg 来查找对函数的所有调用的列表,但是如果没有实际执行代码,就看不到任何显示参数的内容。
看起来该函数有 2 个参数,每个参数都在每个实例的 CALL 之前直接提供一个简单的 PUSH。我可以使用 DiStorm 来研究这个单一实例的代码,但我更喜欢可以在其他地方使用的更通用的解决方案。 OllyDbg在步入函数的时候好像确实知道参数个数,所以我觉得可以通过静态分析来确定参数个数,但是我对x86汇编的理解真的很有限。
是否有现有的方法可以做到这一点,还是我唯一的选择是使用 DiStorm 并在每次调用此函数之前获取最后 2 个 PUSH 语句?
【问题讨论】:
-
函数的参数不需要通过 PUSH 指令放在堆栈上。当然,在标准 i386 C 函数以外的 ABI 上,参数可以在寄存器中传递。事实上,在某些情况下,甚至无法确定传递了多少参数。在一般情况下没有办法做到这一点;最好的办法是在运行时捕获调用并记录参数。
-
是否无法判断传入了多少函数仅限于变量参数函数?如果是这样,我预计不会遇到任何这些。我知道函数参数根本不需要通过 PUSH 甚至在堆栈中。我需要针对这种特定情况的解决方案(其中参数在堆栈上并通过 PUSH 放在那里),但如果存在,我更喜欢更通用的解决方案。它不需要考虑每一种可能的参数传递方法。
-
很难定义在没有固定方法/函数定义的字节码中获取参数的通用解决方案(如 Java 或 .NET 所具有的)。您可以尝试关闭所有优化,这可能会导致仅将参数推送到堆栈上。但是优化就是优化,这些东西因处理器而异。例如,ARM 有用于参数的寄存器(IIRC
r2到r5)。
标签: x86 analysis disassembly