S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

利用WH_DEBUG消息进行反HOOK

Posted on 2010-01-10 16:48 S.l.e!ep.¢% 阅读(1165) 评论(2)  编辑 收藏 引用 所属分类: RootKit
【原创】利用WH_DEBUG消息进行反HOOK
ningkai 当前离线

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

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

Feedback

# re: 利用WH_DEBUG消息进行反HOOK   回复  更多评论   

2010-02-23 16:50 by Pencil.C++
debug->idThread!=debug->idThreadInstaller

这个等式永远成立,在2000/xp之后的系统中。因为idThreadInstaller始终是0

# re: 利用WH_DEBUG消息进行反HOOK   回复  更多评论   

2010-02-23 20:24 by S.l.e!ep.¢%
那2K/XP 后没法判断?

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理