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

2016-02-19 14:25 0 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐不依赖于DLL就能工作的全局钩子,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

  不知道大家是通过什么开始对钩子(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";

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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]",

  info, p-vkCode, p-scanCode);

  // always call next hook

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  };

  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",

  ::GetLastError ());

  return 0;

  };

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

  MSG msg;

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

  {

  TranslateMessage (&msg);

  DispatchMessage (&msg);

  };

  UnhookWindowsHookEx (g_kb_hook);

  return 0;

  };

来源:https://www.tulaoshi.com/n/20160219/1606946.html

延伸阅读
标签: 瘦身 减肥方法
对于办公室OL来说长时间的久坐是导致身体脂肪增加的主要原因,下面图老师小编就要介绍给大家几个减肥方法,帮助大家在上班时间合理的利用时间来消耗脂肪,拒绝赘肉囤积。 一、中药通便消脂 荷叶灰是一味中药材,减肥有奇效,服用三天之后,大便就会通畅,数十日之后,体重可下降10多斤。荷叶灰出自明代戴思恭的《证治要诀》...
什么是依赖 现在许多家庭都是独生子女,父母对孩子是含在口里怕化了,捧在手里怕掉了,孩子在家是衣来伸手,饭来张口,什么事只要喊一声妈妈或爸爸就万事大吉。可是,在现实生活中,竞争激烈、压力重重,孩子一旦离开父母亲人建造的水晶宫,走向社会,就会像离开水的鱼一样难以生存,难以适应社会需要。 依赖心理主要表现为缺乏信...
csc /target:library OutPut.cs csc /reference:OutPut.dll class1.cs 一: using System; public class OutPut { private string OutPutWord; public OutPut(string OutWord) { OutPutWord=OutWord; Console.WriteLine(OutPutWord); } } 二: using System; namespace ConsoleApplication5 { /// /// Class1 的摘要说明。 //...
 作者:Victor Chen 来自:C++ 爱好者 http://www.cppfans.com -------------------------------------------------------------------------------- 程序介绍: 利用这个程序: 1.可以监视在你的电脑运行的程序, 把在你的电脑运行过的程序的时间和名字记录下来; 2.可以阻止你规定的禁用程序的执...
标签: 电脑入门
dll文件是动态数据库文件,就是一种可执行文件,一般情况下他是允许程序执行特殊任务所必需的代码及资源,一般dll文件都是后面带有dll扩展名的文件,但是有的也可能是exe及其他扩展名。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。 一般情况我们执行某程序的...

经验教程

597

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部