2009-06-10 89 views
2

我正在分析我在程序集中編寫的一個程序,並且正在考慮在程序集中移動一些代碼。我有一個程序需要一個參數,但我不確定它是否通過堆棧或寄存器。將函數的參數傳遞給堆棧還是寄存器?

當我在IDA打開我的程序臨,在程序的第一行是:

ThreadID= dword ptr -4 

如果我將鼠標懸停我的光標在聲明中,下面還顯示:

ThreadID dd ? 
r db 4 dup(?) 

這我會假設會指向一個堆棧變量?

然而,當我在OllyDbg中打開相同的程序時,在棧上的這個位置存在一個很大的值,這與任何可能已經傳遞的參數都不一致,導致我相信它被傳入一個寄存器。

任何人都可以指向正確的方向嗎?

回答

0

參數傳遞給函數的方式取決於函數的calling convention。默認調用約定取決於語言,編譯器和體系結構。

對於您提供的信息我無法確定,但您不應該忘記像OllyDbg這樣的彙編級調試器和像IDA這樣的反彙編程序經常使用啓發式方法對程序進行反向工程。研究編譯器生成的代碼的最好方法是指示它編寫彙編列表。大多數編譯器都可以選擇這樣做。

+0

調用約定是__fastcall – samoz 2009-06-10 16:22:44

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寄存器。

微軟或GCC [2] __fastcall [3] 約定(又名__msfastcall)穿過 前兩個參數(評價 從左到右)配合到ECX和 EDX。剩餘的參數從右到左推送到堆棧上。 http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall