标 题:
【原创】利用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,就可以在它之前进行处理了。
我只用这种方法进行过反键盘和鼠标,其它的钩子,我还没有试过,如果有什么不对的地方,还请大家指点!!!
很久以前写的文章,一直没发布,突然想起来了,发出来共大家参考,本来是有源码的,可是权限不够,不能发附件,所以请大家海涵