2011-09-07 95 views
1

嗨,這是我的第一個問題,所以請溫柔對待我。我繞行一個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 

我不認爲它返回一個值?

+0

在那裏,我認爲'__asm'的參數必須是字符串。然後我意識到Windows內聯彙編與GCC完全不同。所以我刪除了我的答案。我看不出任何明顯錯誤的代碼。 – Mysticial

+0

使用調試器運行它,並獲取堆棧跟蹤,寄存器的內容並準確找出故障。 – user786653

+0

我嚴重懷疑反彙編是正確的,它看起來像32位彙編程序與隨機的64位寄存器名稱拋出。另外:它看起來像函數使用__cdecl作爲其調用約定。你確定它應該是'__stdcall'? – user786653

回答

2

你怎麼知道eax有什麼東西?

一般來說,迂迴崩潰通常是由於不準確的調用約定和/或原型造成的。我懷疑繞道函數返回一個void *或別的東西。您需要捕獲返回值並在完成後將其傳遞給調用者,如下所示:

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"); 
    void* ret = Real_GenterateStrings(a1, a2, a3); 
    __asm 
    { 
     nop 
    } 

    return ret; 
} 
+0

在stdcall中,eax被強制保存返回值。 –

+0

我花了4天時間通過與IDA專業版的exe來到函數調用,我想繞行和包含我需要的指針的eax。我編輯了我的問題以顯示彙編函數,但是您提出的更改仍然失敗。 – Infromthecold

+0

固定 我將__stdcall更改爲__cdecl和賓果 – Infromthecold