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。

results matching ""

    No results matching ""