2012-11-24 59 views
7

我一直在尋找在IDA計劃,因爲我試圖找出一個特定的功能是如何工作的,當我遇到事情就這樣的:在功能地址上使用JMP有什麼影響?

; C_TestClass::Foo(void) 
__text:00000000 __ZN14C_TestClass7FooEv proc near 
__text:00000000     jmp  __ZN14C_TestClass20Barr ; C_TestClass::Barr(void) 
__text:00000000 __ZN14C_TestClass7FooEv endp 
__text:00000000 

任何人都可以向我解釋,究竟是什麼跳轉到一個函數將在這樣的情況下做? 我猜測它充當其他功能的包裝?

回答

5

跳轉通常是一種有效處理未內聯包裝函數的方式,這是正確的。

通常情況下,您必須先讀取所有函數參數並將它們推回到堆棧上,然後才能調用子函數。

但是,當包裝函數具有完全相同的原型:

  1. 相同的調用約定
  2. 相同的參數(並以相同的順序)
  3. 相同的返回類型

沒有需要所有通常的函數調用開銷。你可以直接跳到目標。 (這些類別可能不是完全必要的,因爲在某些其他情況下它仍然是可能的。)

調用包裝器函數時設置的所有參數(在堆棧或寄存器上)都已就位(和兼容)的子功能。

3

這就是所謂的尾呼。編譯器能夠直接調用該函數,並讓其返回原始調用者而不會引起任何問題。例如:

int f(int x) 
{ 
    ... 
    return g(y); 
} 

編譯器可以簡單地在年底jmp g因爲有空間在同一個地方爲f參數小號呼叫者的參數和返回值沒有返回到f之前修改「。

相關問題