2013-12-11 95 views
0
Main 

push ebp 
mov  ebp, esp 
and  esp, 0FFFFFFF0h 
sub  esp, 30h 
mov  dword ptr [esp], 8 ; size 
call _malloc 
mov  [esp+2Ch], eax 
mov  dword ptr [esp+4], 4 
mov  eax, [esp+2Ch] 
mov  [esp], eax 
call __start 

__start 

arg_0= dword ptr 8 
arg_4= dword ptr 0Ch 

push ebp 
mov  ebp, esp 
mov  eax, [ebp+arg_4] 
mov  edx, eax 
sar  edx, 1Fh 
shr  edx, 1Eh 
add  eax, edx 
and  eax, 3 
sub  eax, edx 
mov  [ebp+arg_4], eax 
mov  eax, [ebp+arg_4] 
cmp  eax, 1 
jz  short loc_80489F0 

上面的代碼代表了我正在開發的項目的一部分,我需要將此程序集反向工程到相應的C代碼中。我相信我已經將main()放置在堆棧上,其中[esp]包含指向malloc的指針,[esp + 4]包含數字4.arg在ASM函數中包含什麼?

我在計算哪些arg包含,我假設arg_0包含4,但arg_4讓我拋棄。

arg_0和arg_4指的是什麼?

謝謝!

回答

2

將它們定義爲C中的#define arg_0 8#define arg_4 0xc。它們由編譯器發出,以可讀的方式將參數的符號名與它的偏移量相連接。在這種情況下, arg_4從基址指針開始爲正數12。在這個調用約定中(與Microsoft相似),基指針ebp指向前一個基指針,它位於返回地址下方。參數相對於ebp處於正偏移量,而局部(自動)變量處於負偏移處。

編譯器已經在Main施加的優化以建立兩個呼叫的堆棧幀malloc_startesp一個設置。要查看發生了什麼,請繪製由sub esp, 30h指令分配的堆棧的48個字節的圖片,並仔細跟蹤每條指令。事實將會消失。

相關問題