標 題:
【原創】利用WH_DEBUG消息進行反HOOK
作 者:
ningkai
時 間: 2007-10-09,19:14
鏈 接: http://bbs.pediy.com/showthread.php?t=53016
以前在學習鉤子的時候對于WH_DEBUG這個類型很是不解釋,不知道它是做什么用的,在網上找了一找,發現也沒有什么有價值的文章。在逆向分析“熱血江湖”突然發現WH_DEBUG竟被用來進行反鍵盤記錄(這是老版本,現在的版本已經用了最新的技術,原理沒弄明白,哪位要是弄明白了,希望可以指點一下)。仔細研究了一下,弄明白了其中的原理,現在就介紹給一下。
首先要將WH_DEBUG介紹一下。WH_DEBUG為調試鉤子,用來給鉤子函數除錯。在系統調用系統中與其他Hook關聯的Hook鉤子例程之前,系統會調用WH_DEBUG?Hook鉤子例程。你可以使用這個Hook來決定是否允許系統調用與其他Hook關聯的Hook鉤子例程。WH_DEBUG調用DebugProc鉤子例程。
DebugProc語法:
LRESULT?CALLBACK?DebugProc(
??int?nCode,
????WPARAM?wParam,
????LPARAM?lParam
)
nCode傳遞到鉤子例程的鉤子代碼。
wParam指示當前即將被調用的鉤子的類型,如WH_MOUSE,WH_KEYBOARD?參數。
lParam?指向DEBUGHOOKINFO?結構。
typedef?struct?
{
????DWORD?idThread;
????DWORD?idThreadInstaller;
????LPARAM?lParam;
????WPARAM?wParam;
????int?code;
}?DEBUGHOOKINFO,?*PDEBUGHOOKINFO;
idThread?安裝WH_DEBUG鉤子的線程ID。
idThreadInstaller?當前即將被調用的鉤子所在的線程ID。
lParam?當前即將被調用的鉤子的lParam參數。
wParam?當前即將被調用的鉤子的wParam參數。
Code?當前即將被調用的鉤子的nCode參數。
返回值:當你已經處理了該鉤子并且不希望即將被調用的鉤子繼續執行,則必須返回非0值?否則請返回CallNextHookEx的值。
進行反HOOK時只要知道判斷idThread和idThreadInstaller是否相等就可了。如果相等,說明即將被調用的鉤子是自己線程中鉤子;如果不等,說明是其它線程中的鉤子,只要返回非0值就可以了,這時即將被調用的鉤子就不會執行了。
程序編寫:
新建DLL工程,寫入以下代碼,然后調用InstallHook()安裝WH_DEBUG鉤子,調用UnInstallHook()卸載WH_DEBUG鉤子。
#ifndef?MYLIBAPI
#define?MYLIBAPI?extern?"C"?__declspec(dllimport)
#endif
HHOOK?DEBUG_hhook;
HINSTANCE?handle;
MYLIBAPI?bool?WINAPI?InstallHook();
MYLIBAPI?bool?WINAPI?UnInstallHook();
LRESULT?CALLBACK?DebugProc(int?nCode,?WPARAM?wParam,?LPARAM?lParam)?//WH_DEBUG鉤子例程
{
??DEBUGHOOKINFO?*debug=(DEBUGHOOKINFO?*)lParam;
//如果要編寫反鍵盤記錄代碼,可以改成
//?if(debug->idThread!=debug->idThreadInstaller?&&?wParam==?WH_KEYBOARD)
//{
//?return?1;
//}
??if(debug->idThread!=debug->idThreadInstaller)???//是否相等,如果不等則不執行
??{
????return?1;
??}
??return?::CallNextHookEx(DEBUG_hhook,?nCode,?wParam?,lParam);
}
BOOL?APIENTRY?DllMain(?HINSTANCE?hModule,?
???????????????????????DWORD??ul_reason_for_call,?
???????????????????????LPVOID?lpReserved
???????????)
{
??handle=hModule;
????return?TRUE;
}
bool?WINAPI?InstallHook()??//安裝WH_DEBUG鉤子
{
DEBUG_hhook=::SetWindowsHookEx(WH_DEBUG,(HOOKPROC)DebugProc,handle,?NULL);
If(DEBUG_hhook==NULL)
Return?false;
??return?true;
}
bool?WINAPI?UnInstallHook()//卸載WH_DEBUG鉤子
{
??UnhookWindowsHookEx(DEBUG_hhook);
??return?true;
}
當然,破解這種方法的辦法也很簡單。比如你要用HOOK進行鍵盤攔截時,在安裝WH_KEYBOARD時,同時安裝一個WH_DEBUG鉤子。這時你自己的WH_DEBUG鉤子將攔截到你自己的WH_KEYBOARD,DEBUGHOOKINFO?結構中的lParam存放的是WH_KEYBOARD的lParam,wParam存放的是WH_KEYBOARD的wParam,只要在這里處理WH_KEYBOARD就可以了。因為HOOK鏈是按照后進先出的順序執行的,所以你只要在反HOOK的WH_DEBUG之后安裝WH_DEBUG,就可以在它之前進行處理了。
我只用這種方法進行過反鍵盤和鼠標,其它的鉤子,我還沒有試過,如果有什么不對的地方,還請大家指點!!!
????很久以前寫的文章,一直沒發布,突然想起來了,發出來共大家參考,本來是有源碼的,可是權限不夠,不能發附件,所以請大家海涵