簡體   English   中英

MASM和C跳轉功能

[英]MASM and C jump to function

我有一個指向C中的__stdcall函數的指針,在x86和x64程序集中,我想要做的是有一個asm函數,我可以用來跳轉到該函數。

例如,使用Windows API函數MessageBoxW

void *fn = GetProcAddress(GetModuleHandle("kernel32.dll"), MessageBoxW);

然后在C中,我會打電話給ASM,就像

void foo()
{
MessageBoxW_asmstub(NULL, "test", "test", NULL);
}

假設fn是全局的。 然后在匯編中我想要一個只轉發到MessageBoxW而不是調用它的函數。 換句話說,我希望MessageBoxW清理傳遞給MessageBoxW_asmstub的變量,然后返回foo

jump (fn) ?

我不知道該怎么做。

假設MessageBoxW_asmstub被聲明為C編譯器具有正確的調用約定(即x86的__stdcall;對於x64,幸好只有一個調用約定),然后正如Ross Ridge的評論所說,這就像跳轉到目標一樣簡單函數然后將直接返回給調用者。 由於你有一個間接引用(即fn引用指向目標的指針),你可能需要另一個加載指令(盡管我對x86的了解在這里有限 - 如果有一些雙間接的話我也不會感到驚訝形式的jmp)。 您可以在調用約定中使用任何易失性寄存器來執行此操作,例如,對於x64,您可能會使用以下內容:

extern fn:qword

MessageBoxW_asmstub:
  mov rax, fn
  jmp rax

順便說一句,如果您使用調試器逐步調用延遲加載的DLL導入,您可能會看到鏈接器生成的存根函數中使用的類似模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM