2011-07-26 105 views
1

我編寫了一個dll。在這個DLL中,我想掛鉤另一個DLL的函數加載到內存中。這是許多小時工作的結果:C++函數鉤子(dll,asm)

typedef int (__fastcall *def_cry)(int a,int b,int fromlen); 
def_cry Real_cry; 
int __fastcall custom_cry(int a,int b,int fromlen) { 
    Log("cry ..."); 
    __asm nop; 
    return Real_cry(a, b, fromlen); 
} 
DWORD imageBaseOtherDll = 0x39500000; 
DWORD functionOffset = 0x395742F8; 
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll"); 
DWORD functionOffset = imageBase + (functionOffset - imageBaseOtherDll); 
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry); 

看來,我的鉤子不起作用。我認爲我在代碼中添加了一些邏輯錯誤,但我是一名初學者和nned幫助!

+0

asm - 請添加一些細節,例如您到目前爲止所嘗試的內容,以及您認爲問題所在。縮小問題的焦點。如果你問「你能看看這個並修復它嗎?」你的問題將被拒絕並關閉。 – Josh

+0

(+1) - 人是新的,不要讓他想通過「-1」來逃離計算器...我認爲這個問題很明顯。 – Cipi

回答

3

您確定您正在使用的功能使用__fastcall調用約定嗎?

爲了掛鉤從DLL導出的函數,您需要修補所有調用它的模塊(dll/exe)的導入表在運行時重寫函數入口點。在CodeProject here上可以找到有關修補導入表的體面文章。關於使用MS Detours的一個很好的教程可以發現here

當您調用DetourFunction時,您需要提供您想掛鉤的函數的地址。這些值不應該被硬編碼,因爲你的DLL不能保證在特定的地址加載。這可以通過以下代碼輕鬆完成:

// Get the module containing the function to hook 
HMODULE targetModule = GetModuleHandle("otherDll.dll"); 
// Get the address of the function to hook 
FARPROC targetFunction = GetProcAddress(targetModule, "cry"); 
// Go hook it. 
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);