首页
论坛
课程
招聘
[原创]利用WH_DEBUG消息进行反HOOK
2007-10-9 19:14 12203

[原创]利用WH_DEBUG消息进行反HOOK

2007-10-9 19:14
12203
以前在学习钩子的时候对于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,就可以在它之前进行处理了。
我只用这种方法进行过反键盘和鼠标,其它的钩子,我还没有试过,如果有什么不对的地方,还请大家指点!!!

    很久以前写的文章,一直没发布,突然想起来了,发出来共大家参考,本来是有源码的,可是权限不够,不能发附件,所以请大家海涵

第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 25
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 活跃值 9 2007-10-9 19:58
2
0
WH_DEBUG拦不住WH_KEYBOARD_LL
雪    币: 333
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
晓斌 活跃值 2007-10-9 21:22
3
0
只能拦截光明正大的HOOK啊,拦截不了HOOKAPI哦。
雪    币: 172
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ningkai 活跃值 1 2007-10-10 08:54
4
0
HOOKAPI的原理是修改输入表,和HOOK消息不一样
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
vrowang123 活跃值 1 2007-10-10 12:52
5
0
hookAPI,想学!
雪    币: 38
活跃值: 活跃值 (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2007-10-12 21:06
6
0
拦截不了LowLevel的
游客
登录 | 注册 方可回帖
返回