嗨,這是我的第一個問題,所以請溫柔對待我。我繞行一個EXE,使用MS走彎路和Visual Studio 2005,我的DLL被加載,然後我的鉤子工程治療但是當我試圖擴展我的鉤子代碼時,出現了錯誤,並且整個事情崩潰了,我認爲它在彈出消息框聯繫人支持的exe中創建了一個異常。爲什麼我的繞道代碼,崩潰與NOP
typedef void (__stdcall* GenterateStrings)(int,int,int);
GenterateStrings Real_GenterateStrings = (GenterateStrings)(0x06EDFA0);
extern "C" { static void __stdcall myGenterateStrings(int,int,int); }
void __stdcall myGenterateStrings(int a1, int a2, int a3)
{
myLogMessage(L"its working");
Real_GenterateStrings(a1, a2, a3);
return;
}
一個可行的治療也不例外,我的日誌文件,「其工作」罷了,不過,我需要,因爲它包含一個指向Unicode字符串我Real_GenterateStrings後拍照EAX()調用。
但如果我把任何代碼後Real_GenterateStrings調用剛剛導致崩潰一旦它掛鉤。即使只是一個nop
void __stdcall PokerAdvisorGenterateStrings(int a1, int a2, int a3)
{
myLogMessage(L"its working");
Real_GenterateStrings(a1, a2, a3);
__asm
{
nop
}
return;
}
任何想法?
我正在掛接函數是
mov eax, [rsp+0Ch]
mov ecx, [rsp+8]
mov edx, cs:113650Ah
push rax
mov eax, [rsp+8]
push rcx
push rdx
push 0A3CA2Ch
push rax
call near ptr unk_6AB8E0
add esp, 14h
retn
我不認爲它返回一個值?
在那裏,我認爲'__asm'的參數必須是字符串。然後我意識到Windows內聯彙編與GCC完全不同。所以我刪除了我的答案。我看不出任何明顯錯誤的代碼。 – Mysticial
使用調試器運行它,並獲取堆棧跟蹤,寄存器的內容並準確找出故障。 – user786653
我嚴重懷疑反彙編是正確的,它看起來像32位彙編程序與隨機的64位寄存器名稱拋出。另外:它看起來像函數使用__cdecl作爲其調用約定。你確定它應該是'__stdcall'? – user786653