2012-05-18 116 views
1

我正在實施小監控應用程序,所以我在過程中掛鉤了CreateWindowExA/W,所以我可以控制windows的創建。 我用鉤子的方法是用匯編程序JMP指令將前5個字節替換爲我的鉤子函數。 (是的,我知道彙編程序,我之前使用過相同的方法)。 我在我的鉤子代碼的開始處使用EnterCriticalSection,並且使用InterlockedExchange來恢復被盜的字節,即替換我在CreateWindowExA/W開頭寫入的真正的5字節的JMP,以便我可以正確調用該函數。根據我的經驗,一切都很好,但是現在當我用真正的字節替換JMP的時候,其他一些線程調用函數,看起來像字節也被替換了。 。線程安全掛鉤功能

我知道我可以使用IAT/EAT表掛鉤,但我想知道什麼是錯我目前的方法InterlockedExchange不工作時說,CreateWindowExA/W從DLL的(COMCTL32稱爲... 也許問題.dll,shell32.dll ...)但不是主要的可執行模塊。

我希望有人能幫助我,如果您對我的解釋不甚瞭解,請提問,我會重新解釋。

回答

2

如果你在掛鉤windows功能,IAT鉤子更好更安全。然而,如果你堅持使用彎路,它通常更好地使用hotpatching builtin在事物的窗口一側(這使得寫入繞行原子的可能性,不需要同步)。

您的問題與您所說的完全相同,您的鎖只會暫停執行的線程,但不會暫停您的控制線程。要解決此問題,您需要暫停所有這些線程(通過PSAPI/toolhlp32),或者更有效地爲您繞過的函數添加檢查,以檢查被調用方地址是否位於要繞過的模塊的地址空間中,可以使用GetModuleHandle,WinNT的一些PE函數和_ReturnAddress內部函數完成。

+1

我想從所有模塊掛接電話,我不明白你的意思,掛起線程看起來不好解決。對我來說更好的是使用簡單的長度反彙編程序,只是爲了得到幾個彙編程序指令,用jmp替換它們,之後我不會恢復它們,但是將堆棧上的參數執行被盜指令和JMP到CreateWindowExA/W,JMP實際上會在JMP之後導致我的代碼。有人可以確認在所有操作系統上,每個API中的第一個彙編指令是「MOV EDI,EDI」,「PUSH EBP」,「MOV EBP,ESP」? (我知道它不是ntdll.dll的情況下) – VisaToHell

+0

如果我hook當前進程中的user32.dll和IAT的所有其他模塊的EAT,所有將很好,稍後如果新模塊加載,因爲我迷上了user32的EAT .dll將新模塊獲取CreateWindowEx/A/W的鉤子地址嗎? – VisaToHell

+1

@VisaToHell:如果你希望繞行適用於當前進程中的所有模塊(這是**不是**你的問題隱含的意思),你只需要在系統dll中對代碼進行hotpatch(這就是'mov edi, edi'和前面的空閒字節用於,不需要RLD),因爲每個進程都有自己的系統dll副本。確保在其他任何可以使用這些函數之前發生這種情況通常需要加載程序以暫停狀態啓動進程,或者阻止其init,直到修補完成。 – Necrolis

0

如果您可以控制對CreateWindowEx的每一次調用,那麼您可以用關鍵部分來包裝它們。但是,如果你能做到這一點,那麼你就不需要掛鉤該功能。

剩下的是在任何其他線程開始之前掛鉤該函數。可以通過使用靜態初始化來在應用程序的開始處執行此操作。

另一個想法是關於這個特定的功能。在許多應用程序中,所有窗口都在主線程中創建。如果這對你來說是這樣,那麼你就不需要同步。

1

只要你改回字節,掛鉤將會丟失,關鍵部分不會幫助,因爲這是在jmp之後。

看一看在DXHookshttp://dxhook.googlecode.com/svn/trunk/dxhook.cpp,因爲我認爲它會做什麼,你需要

+0

我看了Windows Detours庫,它看起來不錯,今晚我會試試它,它能夠掛鉤IAT/EAT並直接修補第一個字節? Detours圖書館有什麼缺點或缺點? – VisaToHell