[英]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.