不依赖于DLL就能正常工作的全局钩子

原创 2004年03月23日 10:08:00

不依赖于DLL就能正常工作的全局钩子

不知道大家是通过什么开始对钩子(Hook)有了解的,我是看过Jeffrey Richter的《WINDOWS 高级编程指南》(新版的中文译名为《Windows核心编程》)。在这本书里作者介绍了三种将代码注入其他进程的方法,其中一种就是使用的全局消息钩子。我就是从这本书里对全局钩子有了最初的认识。

大家应该都知道,全局消息钩子要依赖于一个DLL才能够正常工作。于是呢,我也就理所当在地认为全局钩子都要依赖于一个DLL才能正常工作的,我想大部分人肯定和我一样也这么认为的。

但实际上不是这样的。有某些全局钩子可以不依赖于任何DLL而正常工作的。这些钩子包括,WH_JOURNALPLAYBACKWH_JOURNALRECORDWH_KEYBOARD_LLWH_MOUSE_LL。为什么这些钩子可以不依赖于DLL而正常工作呢?我们可以从MSDN中得到答案,MSDN中对于这四种钩子都这样的描述“This hook is called in the context of the thread that installed it.”,翻译成中文意思是钩子函数的调用是在安装钩子的线程上下文中进行的,说得更明白些,意思就是这些钩子是在哪个线程当中安装的,其钩子函数就在哪个线程中执行。所以使用这四种钩子是达不到代码注入的效果的,当然也就可以不依赖于任何DLL了。MSDN中只对个别钩子指出了必须还是没有必要使用DLL

下面是我给出的一个底层键盘钩子的代码示例,当然是不需要DLL的。

 

/*

  kbhook.cpp

*/

 

#define _WIN32_WINNT    0400

#define STRICT

#define WIN32_LEAN_AND_MEAN

 

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

 

DWORD   g_main_tid  = 0;

HHOOK   g_kb_hook   = 0;

 

BOOL CALLBACK con_handler (DWORD)

    {

        PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);

        return TRUE;

    };

 

LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)

    {

        PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;

        const char *info = NULL;

        if (w == WM_KEYDOWN)

            info = "key dn";

        else if (w == WM_KEYUP)

            info = "key up";

        else if (w == WM_SYSKEYDOWN)

            info = "sys key dn";

        else if (w == WM_SYSKEYUP)

            info = "sys key up";

 

        printf ("%s - vkCode [%04x], scanCode [%04x]/n",

            info, p->vkCode, p->scanCode);

        //  always call next hook

        return CallNextHookEx (g_kb_hook, code, w, l);

 

    };

 

int main (void)

    {

        g_main_tid = GetCurrentThreadId ();

        SetConsoleCtrlHandler (&con_handler, TRUE);

 

        g_kb_hook = SetWindowsHookEx (

            WH_KEYBOARD_LL,

            &kb_proc,

            GetModuleHandle (NULL), // 不能为NULL,否则失败

            0);

 

        if (g_kb_hook == NULL)

        {

            fprintf (stderr,

                "SetWindowsHookEx failed with error %d/n",

                ::GetLastError ());

            return 0;

        };

 

        //  消息循环是必须的,想知道原因可以查msdn

 

        MSG msg;

        while (GetMessage (&msg, NULL, 0, 0))

        {

            TranslateMessage (&msg);

            DispatchMessage (&msg);

        };

        UnhookWindowsHookEx (g_kb_hook);

        return 0;

    };

 

全局钩子为什么要用DLL 共享节

利用全局钩子  在别的进程窗口下 关闭test窗口 关于全局钩子为什么一定要在DLL中 2013-12-05 13:02使徒辟允382  分类:网站使用 | 浏览 66 次 ...
  • mfmfmmf1
  • mfmfmmf1
  • 2015年07月13日 19:39
  • 672

不需要DLL的全局钩子完成鼠标截屏功能

       效果是点击截屏以后程序判断鼠标按下和鼠标抬起两个事件得到拉出的矩形,以这个矩形大小抓屏,画到Image上。使用的钩子类型是WH_MOUSE_LL所以不需DLL就可以达到全局钩子的效果...
  • xingkiller
  • xingkiller
  • 2007年05月31日 14:33
  • 789

不依赖于DLL就能正常工作的全局钩子

不依赖于DLL就能正常工作的全局钩子不知道大家是通过什么开始对钩子(Hook)有了解的,我是看过Jeffrey Richter的《WINDOWS 高级编程指南》(新版的中文译名为《Windows核心编...
  • xstring
  • xstring
  • 2004年03月23日 10:08
  • 984

用VC编程阻止全局钩子的加载

先说一下全局钩子是怎么进入到我们的程序里来的。假如有个程序A安装了WH_GETMESSAGE的全局钩子,钩子函数在B.dll中,那么当其它程序在调用GetMessage函数从自己的消息队列中取消息的时...
  • chinawash
  • chinawash
  • 2006年11月24日 21:38
  • 1355

不依赖于DLL就能正常工作的全局钩子

不知道大家是通过什么开始对钩子(Hook)有了解的,我是看过Jeffrey Richter的《WINDOWS 高级编程指南》(新版的中文译名为《Windows核心编程》)。在这本书里作者介绍了三种将代...
  • pc2s
  • pc2s
  • 2004年12月29日 16:35
  • 787

不依赖于DLL就能工作的全局钩子

不依赖于DLL就能工作的全局钩子不知道大家是通过什么开始对钩子(Hook)有了解的,我是看过Jeffrey Richter的《WINDOWS 高级编程指南》(新版的中文译名为《Windows核心编程》...
  • ShellEx
  • ShellEx
  • 2006年08月19日 20:40
  • 4011

全局鼠标钩子DLL源码及调用源码

  • 2014年04月17日 10:37
  • 22KB
  • 下载

c# dll注入钩子(全局钩子)

  • 2012年06月21日 13:48
  • 56KB
  • 下载

udt4编程简介(原文)

Introduction to Programming with UDT The prerequisite knowledge for using UDT is sound experien...
  • bytxl
  • bytxl
  • 2015年07月15日 17:14
  • 623

依赖于DLL就能工作的全局钩子

文档标题:不依赖于DLL就能工作的全局钩子 原作者:佚名更新日期:2006-08-25浏览次数:372 关键字:Dll,全局,钩子,Hook,SetWindowsHookEx,HOOKPROC来源:(...
  • adonis1620
  • adonis1620
  • 2010年06月30日 10:47
  • 353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不依赖于DLL就能正常工作的全局钩子
举报原因:
原因补充:

(最多只允许输入30个字)