我目前正在分析我在汇编中编写的程序,并且正在考虑在程序集中移动一些代码。我有一个带有一个参数的过程,但我不确定它是在堆栈还是寄存器上传递。
当我在IDA Pro中打开我的程序时,该过程的第一行是:
ThreadID= dword ptr -4
如果我将光标悬停在声明上,还会出现以下内容:
ThreadID dd ?
r db 4 dup(?)
我会假设它会指向一个堆栈变量?
当我在OllyDbg中打开相同的程序时,在堆栈上的这个位置有一个很大的值,这可能与任何可能已经传递的参数不一致,这让我相信它是在寄存器中传递的。
有人能指出我正确的方向吗?
答案 0 :(得分:0)
参数传递给函数的方式取决于函数calling convention。默认调用约定取决于语言,编译器和体系结构。
我不能肯定地提供您提供的信息,但是您不应该忘记像OllyDbg这样的汇编级调试器和IDA之类的反汇编程序经常使用启发式方法对程序进行反向工程。研究编译器生成的代码的最佳方法是指示它编写汇编列表。大多数编译器都可以选择执行此操作。
答案 1 :(得分:0)
这肯定是一个局部变量。要查看参数,请查找[esp + XXX]值。 IDA自动为[esp + arg_XXX]命名。
.text:0100346A sub_100346A proc near ; CODE XREF: sub_100347C+44p
.text:0100346A ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0 = dword ptr 4
.text:0100346A
.text:0100346A mov eax, [esp+arg_0]
.text:0100346E add dword_1005194, eax
.text:01003474 call sub_1002801
.text:01003474
.text:01003479 retn 4
.text:01003479
.text:01003479 sub_100346A endp
上面评论中概述的fastcall约定使用寄存器来传递参数。我打赌微软或GCC编译器,因为它们被更广泛地使用。因此,请先查看ECX和EDX寄存器。
Microsoft或GCC [2] __fastcall [3] 约定(又名__msfastcall)传递 前两个参数(评估 从左到右)适合ECX和 EDX。推动了剩余的论点 从右到左进入堆栈。 http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall