WH_DEBUG钩子

 


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值