码迷,mamicode.com
首页 > Windows程序 > 详细

windows 全局hook

时间:2015-02-12 02:03:07      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:hook   全局hook   

最近有用到全局hook,其实可参考windows核心编程,全局hook也是Dll注入的一种方式。


首先,必须是一个Dll,可导出一个接口,在其中设置全局hook,类型为WH_GETMESSAGE(这样,应该是所有进程都会被hook到了),这样成功后,系统会把这个Dll注入到有getmessage的所有进程中,即会为每个进程隐式调用下loadlibrary。

然后每次getmessage时,都会回调进回调函数中,你就可以做一些自己的处理了。


当不需要hook时,可通过unhook,这样系统会为那些hook上的进程隐式调用freelibrary,卸载掉dll。

我们设 设置hook的进程为 P,hook Dll为D,则经试验发现,

即使是P退出前不调用 D的unhook,或P被强杀或挂掉,系统仍然会发现,仍然会帮着为那些hook上的进程调用freelibrary,也就是会进入到D的proc_detach中。

不过也会有些意外,偶尔有些进程也会未卸载掉D,比如chrome、svncache,或者需要点时间才能卸掉的其他进程 (但64位系统貌似没问题?)。

static HHOOK _myHook = NULL; 

LRESULT CALLBACK MyHookProc(
                             _In_  int nCode,
                             _In_  WPARAM wParam,
                             _In_  LPARAM lParam
                             )
{
    return CallNextHookEx(NULL, nCode, wParam, lParam);// HHOOK parameter is optional and ignored
}

bool hookStart()
{
    if (_myHook)
        return true;

    _myHook = SetWindowsHookEx(
        WH_GETMESSAGE,
        (HOOKPROC)&MyHookProc,
        GetMainDll(),
        0);

    if (NULL == _myHook)
    {
        assert(false && "[hookStart]hook false!");
        return false;
    }

    return true;
}

bool hookEnd()
{
    if (NULL == _myHook)
        return true;

    if (FALSE == UnhookWindowsHookEx(_myHook))
    {
        assert(false && "[hookEnd]unhook false!");
        return false;
    }

    _myHook = NULL;
    return true;
}



本文出自 “v” 博客,请务必保留此出处http://4651077.blog.51cto.com/4641077/1613836

windows 全局hook

标签:hook   全局hook   

原文地址:http://4651077.blog.51cto.com/4641077/1613836

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!