1.4.3 參數存放在堆疊中
call指令是用來呼叫子程式的,它的返回值被存放在eax中。 那麼,傳遞給子程式的參數放在哪裡呢? 參數要通過push指令存放在堆疊中。OllyDbg的右下方就是堆疊視窗,每當執行push指令時,push的值就會被放入堆疊中。 綜上所述,子程式的呼叫可以理解為下面的過程。
- C語言中的函數呼叫:function(1, 2, 3);
- 組合語言中的函數呼叫:
push 3 push 2 push 1 call function
在組合語言中,參數是按照從後往前的順序入堆疊的,其實這方面的規則會根據CPU和編譯器的不同而存在一些差異。 只要記得參數是通過堆疊來傳遞的就可以了。
例如,00401006位置上的代碼如下:
如果改寫成C語言,由於參數是從後往前入堆疊的,因此應該是下面這樣:
eax = lstrcmpW(eax, "2012")
lstrcmpW函數的功能是,當參數中的兩個字串符相同時,則返回0,否則返回非0。因此,如果eax與2012相同,則結果就是eax=0。
- 00401019的test指令表示若eas為0,則將ZF設為1,0040101B的jnz指令表示當ZF為0時進行跳轉。
- 因此,當ZF為1時程式不會進行跳轉,而是繼續執行0040101D的指令,結果就顯示出了Hello! 2012。