我正在實施小監控應用程序,所以我在過程中掛鉤了CreateWindowExA/W,所以我可以控制windows的創建。 我用鉤子的方法是用匯編程序JMP指令將前5個字節替換爲我的鉤子函數。 (是的,我知道彙編程序,我之前使用過相同的方法)。 我在我的鉤子代碼的開始處使用EnterCriticalSection,並且使用InterlockedExchange來恢復被盜的字節,即替換我在CreateWindowExA/W開頭寫入的真正的5字節的JMP,以便我可以正確調用該函數。根據我的經驗,一切都很好,但是現在當我用真正的字節替換JMP的時候,其他一些線程調用函數,看起來像字節也被替換了。 。線程安全掛鉤功能
我知道我可以使用IAT/EAT表掛鉤,但我想知道什麼是錯我目前的方法InterlockedExchange不工作時說,CreateWindowExA/W從DLL的(COMCTL32稱爲... 也許問題.dll,shell32.dll ...)但不是主要的可執行模塊。
我希望有人能幫助我,如果您對我的解釋不甚瞭解,請提問,我會重新解釋。
我想從所有模塊掛接電話,我不明白你的意思,掛起線程看起來不好解決。對我來說更好的是使用簡單的長度反彙編程序,只是爲了得到幾個彙編程序指令,用jmp替換它們,之後我不會恢復它們,但是將堆棧上的參數執行被盜指令和JMP到CreateWindowExA/W,JMP實際上會在JMP之後導致我的代碼。有人可以確認在所有操作系統上,每個API中的第一個彙編指令是「MOV EDI,EDI」,「PUSH EBP」,「MOV EBP,ESP」? (我知道它不是ntdll.dll的情況下) – VisaToHell
如果我hook當前進程中的user32.dll和IAT的所有其他模塊的EAT,所有將很好,稍後如果新模塊加載,因爲我迷上了user32的EAT .dll將新模塊獲取CreateWindowEx/A/W的鉤子地址嗎? – VisaToHell
@VisaToHell:如果你希望繞行適用於當前進程中的所有模塊(這是**不是**你的問題隱含的意思),你只需要在系統dll中對代碼進行hotpatch(這就是'mov edi, edi'和前面的空閒字節用於,不需要RLD),因爲每個進程都有自己的系統dll副本。確保在其他任何可以使用這些函數之前發生這種情況通常需要加載程序以暫停狀態啓動進程,或者阻止其init,直到修補完成。 – Necrolis