我希望对程序的二进制可执行文件进行分析,以创建特定函数调用的参数列表。我可以使用OllyDbg查找函数调用的列表,但是在没有实际执行代码的情况下看不到任何显示参数的内容。
看起来该函数需要2个参数,每个参数在每个实例的CALL之前直接提供一个简单的PUSH。我可以使用DiStorm来查看这个单个实例的代码,但我更喜欢一个更通用的解决方案,我可以在其他地方使用。 OllyDbg在进入函数时似乎确实知道参数的数量,所以我认为通过静态分析可以确定参数的数量,但我对x86汇编的理解实际上非常有限。
是否有现成的方法,或者是我唯一的选择使用DiStorm并在每个CALL之前获取最后2个PUSH语句到这个函数?
答案 0 :(得分: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
...