1

我正在寻找对程序的二进制可执行文件进行分析,以创建特定函数调用的参数列表。我可以使用 OllyDbg 来查找对函数的所有调用的列表,但是如果没有实际执行代码,就看不到任何显示参数的内容。

看起来该函数需要 2 个参数,每个参数都在每个实例的 CALL 之前直接提供一个简单的 PUSH。我可以使用 DiStorm 来研究这个单一实例的代码,但我更喜欢可以在其他地方使用的更通用的解决方案。OllyDbg在进入函数时似乎确实知道参数的数量,所以我认为可以通过静态分析来确定参数的数量,但我对x86汇编的理解老实说非常有限。

是否有现有的方法可以做到这一点,或者我唯一的选择是使用 DiStorm 并在每次调用此函数之前获取最后 2 个 PUSH 语句?

4

1 回答 1

0

我能想到的唯一方法是通过函数并检查所有对EBP.

在函数序言中,您通常会看到:

push ebp
mov  ebp, esp
sub  esp,n

这是设置新函数堆栈框架的地方。看起来有点像这样

EBP+n -> arg n
         ...
EBP+8 -> arg 0
         return address
EBP   -> stack address
EBP-4 -> local var 0
         ...
EBP-n -> local var n
ESP   ->

EBP + (n>=8)您可以通过检查给定函数中的所有引用来获取参数的数量。

现在,您可以检查函数调用之前的推送指令的数量,但不能保证该函数不会引用堆栈的其他部分。

IDA在计算函数参数方面做得很好。我建议你试一试!你会看到这样的东西:

.text:00022042                   ; int __stdcall sub_22042(USHORT, char, char)
.text:00022042                   sub_22042 proc near     ; CODE XREF: sub_21DC4+73p
.text:00022042                                           ; sub_22524+37p
.text:00022042
.text:00022042                   arg_0= word ptr  8
.text:00022042                   arg_4= byte ptr  0Ch
.text:00022042                   arg_8= byte ptr  10h
.text:00022042
.text:00022042 8B FF                mov     edi, edi
.text:00022044 55                   push    ebp
...
于 2013-09-26T13:12:45.680 回答