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

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

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

但实际上不是这样的。有某些全局钩子可以不依赖于任何DLL而正常工作的。这些钩子包括,WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_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
#include
#include

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就能正常工作的全局钩子

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

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

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

udt4编程简介(原文)

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

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

文档标题:不依赖于DLL就能工作的全局钩子 原作者:佚名更新日期:2006-08-25浏览次数:372 关键字:Dll,全局,钩子,Hook,SetWindowsHookEx,HOOKPROC来源:(...
  • adonis1620
  • adonis1620
  • 2010年06月30日 10:47
  • 353

不依赖于Activity的全局对话框的实现

实现不依赖于Activity的全局对话框有三种方式:第一个方法利用系统弹出dialog在alter.show()语句前加入:alert.getWindow().setType(WindowManage...
  • hp910315
  • hp910315
  • 2015年12月10日 22:24
  • 3669

UDT分析及Android平台移植

基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议,UDT的主要目的是支持高速广域网上的海量数据传输。 由于UDT完全采...
  • chenxupro
  • chenxupro
  • 2013年04月14日 23:13
  • 1659

利用DLL构建全局钩子

钩子是一种很神奇的东西,yefeic
  • shmilyhwyz
  • shmilyhwyz
  • 2014年08月12日 22:29
  • 956

安装全局消息钩子实现dll窗体程序注入

安装全局消息钩子实现dll窗体程序注入
  • u013761036
  • u013761036
  • 2016年10月26日 18:33
  • 1605

全局的AlertDialog,不依靠activity

情景:后台service接收到某个广播后发出事件,在application中接收到事件,处理事件是要弹出一个dialog,直接显示会报错: android.view.WindowManager$Bad...
  • Snow_Sun_Li
  • Snow_Sun_Li
  • 2014年03月05日 13:01
  • 1866

C#中运用全局钩子

转自:http://topic.csdn.net/u/20080328/07/e0343ac4-32eb-4d7b-acee-c479cf26560a.html using System; using...
  • normallife
  • normallife
  • 2009年04月01日 16:40
  • 4419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不依赖于DLL就能正常工作的全局钩子
举报原因:
原因补充:

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