2011-07-03 47 views
1

我有一個C++ DLL的源代碼。這個DLL是應用程序的一部分。我想掛鉤另一個DLL在內存中加載的函數,這樣我的掛鉤函數就會被所有其他DLL調用,而不是原始函數。我把這個代碼在我的代碼:C++函數鉤子裏面的DLL源代碼

#include <windows.h> 
#include "detours.h" 
#pragma comment(lib, "detours.lib") 

//Function prototype 
int (__stdcall* OriginalFunction)(); 

//Our hook function 
int FunctionHook() 
{ 
    //Return the real function 
    return OriginalFunction(); 
} 

//On attach set the hooks 
OriginalFunction = (int (__stdcall*)())DetourFunction((PBYTE)0x0100344C, (PBYTE)FunctionHook); 

的問題是:是不是錯的,如果我在一個DLL搜索的偏移量,並通過該偏移補丁的功能(我認爲這是更爲複雜,因爲我在另一個DLL中,並想要鉤住所有DLL的函數)?順便說一下,有人知道如何在IDA PRO中獲得標準(fex。0x0100344C)偏移量嗎?

回答

0

看來你正在嘗試使用微軟的彎路,這是一個在Windows平臺上的鉤子系統。 Detours正在使用「trampline hook」。簡單地說,它會嘗試「重寫」函數的前面幾個ASM指令,並將真正的調用重定向到你特定的函數,類似的東西。 Detours可以幫助你處理這些細節。但是我沒有看到有關彎路的任何代碼,所以我認爲你需要學習一些關於彎路基本用法的文檔。

對於你的問題:
OriginalFunction只是一個指向特定地址的變量。重寫這個變量不會影響真正的調用。因爲您的程序仍然會使用原始地址進行調用,您只需更改一個變量,而不是內部程序。
當您將內存重寫爲掛鉤函數時,此正常情況僅影響當前進程,因爲windows NT下的程序使用的是虛擬地址,而不是實際的內存地址。

+0

所有的DLL都在一個進程中,它是一個DedicatedServer.exe。如何通過覆蓋內存來掛鉤功能? –

+0

你可以參考這裏[http://xulrunner-1.9.2.sourcearchive.com/documentation/1.9.2.13plus-pbuild1plus-pnobinonly/nsWindowsDllInterceptor_8h-source.html],這是使用「trampline hook」的mozilla源代碼, 。但是,如果你可以使用Detour,我不建議你自己破解代碼。 – winterTTr

+0

看起來這個引用更清晰,語法高亮[https://bitbucket.org/MeeGoAdmin/mozilla-central/src/ace9b0ca623c/toolkit/xre/nsWindowsDllInterceptor.h] – winterTTr