目前,我正在分析节目我组装写道,被考虑在装配中移动一些代码。我有带有一个参数的方法,但我不知道,如果它是在堆栈或寄存器传递。

当我在IDA打开我的节目Pro中,在程序中的第一行是:

ThreadID= dword ptr -4

如果我悬停我的光标悬停在声明,下面还显示:

ThreadID dd ?
 r db 4 dup(?)

其中我将承担将指向堆栈变量?

当我在OllyDbg中打开相同的程序然而,在这点在堆栈上有一个较大的值,这将是有可能已通过任何参数不一致,导致我相信,它是在一个寄存器传递。

任何人都可以点我在正确的方向?

有帮助吗?

解决方案

参数传递给函数的方式取决于功能的调用约定。缺省调用约定取决于语言,编译器和体系结构。

我不能说肯定有您所提供的任何信息,但你不应该忘记,汇编级调试器像OllyDbg的反汇编和IDA一样经常使用启发式反向工程的计划。研究由编译器生成的代码,最好的办法是指导它来编写汇编清单。大多数编译器有一个选项来做到这一点。

其他提示

它是一个局部变量是肯定的。检查出的论点寻找[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

和快速调用约定在评论中概述上面使用寄存器来传递参数。我在微软或GCC编译器打赌,因为他们得到越来越广泛的应用。因此,检查了ECX和EDX寄存器第一

  

微软或GCC [2] __fastcall [3]   约定(又名__msfastcall)穿过   前两个参数(评价   左到右)配合到ECX和   EDX。剩余的参数被推   到从右到左堆栈。    http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top