2011-10-28 66 views
2

我一直在研究這種使用windows dll中的hotpatching機制的API掛鉤方法。通過hotpatching掛鉤... DLL中的非導出類方法

http://www.codeproject.com/KB/winsdk/0xF9EB_Hooking.aspx

我想知道如果任何人會知道的一種方式,以便擴展到掛鉤非導出的函數,例如用於一個DLL的內部的內部類C++的構造函數。我已經通過dis-assembly知道了地址......我遇到的問題是如何設置正確的調用約定,以便我可以在我的hook函數中調用原始函數。

我已經到了我的鉤子函數被調用的地方......程序崩潰,因爲我不能返回調用原始函數的結果。

讓我們假設我們正在談論一個原型是這樣的掛鉤一個內部類的構造函數:

public __thiscall <class_name>::<class_name>(<single pointer arg to another object>) 

回答

3

取決於你的模塊的加載方式,一般來說您可以在各自的覆蓋相對或絕對地址呼叫站點,否則你需要做一個蹦牀功能,爲此它更容易使用像MS Detours這樣的東西。

在基於__thiscall的正確原型基礎類成員函數方面,您需要一些技巧,因爲您通常不能使用__thiscall以外的類。最快和最簡單的方法是使用__fastcall並忽略第二個參數。所以你的第一個定義變成void __fastcall myctor(myobj* pObj)

+0

不管你做什麼,都要避免Detours。免費版本(不是10美元版本)可能會導致各種有趣和創造性的段錯誤和其他崩潰(它在64位系統上也不起作用,即使在32位進程中也是如此)。 EasyHook雖然缺乏文檔,但卻是一個更穩定的選擇(並且有點安全)。 – ssube

+0

@peachykeen:這就是爲什麼我說*類似於*的東西,因爲我不是繞道而行的粉絲,只是碰巧知道...... – Necrolis

-1

將其定義爲一個典型的__stdcall函數,只是您將在ecx寄存器中有this指針。如果您需要此指針,然後使用__asm關鍵字來獲取值:

void __stdcall HookedConstructor(SomeObject *pObject){ 
    HookedClass *pClass; 
    __asm mov pClass, ecx; 
    ... 
} 

請注意,您必須在呼叫開始這樣做。否則,ecx寄存器的值可能會被覆蓋。

+0

大多數類的函數定義使用'__thiscall',除非他們被明確告知不要,所以任意使用'__cdecl'會導致堆棧損壞的不錯發作。 – Necrolis

+0

@Necrolis你是對的。 – JosephH

+0

提供一個鉤子/存根類,如果你有關於這些信息的成員可能更安全更乾淨,並且實現那些函數,然後在鉤子中使用指針到成員。 – ssube