Windows操作系统是基于钩子完成的消息传递与用户交互,它以事件驱动的方式运行。每一个窗口都拥有自己的消息队列,当外部设备触发消息时,消息被发送到系统消息队列,再有操作系统安排将消息发送到特定进程上,这即是消息链。

所谓消息钩子,即是在系统将消息发送到用户程序前,提前截获此消息,并进行处理,也可以把它直接发送给用户程序。如:

当键盘(外部设备)发生键盘输入时,WM_KEYBOARD消息被添加到操作系统的消息队列中,再由操作系统将消息取出,判断此消息是哪个程序发生的,然后将这个消息发送到此用户程序中。应用程序有自己的Message Pump,不断从消息队列中取出消息进行处理。

本文使用消息钩子实现简单的消息勾取功能,目标程序为记事本,使用此钩子可以勾取记事本的键盘事件,使记事本中不能接收到键盘输入消息,也就不能像文本框中输入数据。

注意:消息钩子必须写在dll中,并由dll进行函数调用,将钩子回调函数注入目标进程的虚拟内存,这样达到消息勾取的目的,也是最简单的dll注入。

环境介绍:

编译器:gcc version 4.8.1 (tdm64-2)

系统环境: win7 sp1 x64

文件整理: 一个hook.c文件用于将dll注入到目标进程,一个key.c文件用于定义hook回调函数和调用安装钩子、卸载钩子的函数。

/*author : ezdate : 2015/4/3describe : program to inject .dll into target process
*/#include <windows.h>
#include <stdio.h>
#include <conio.h>#   define dll_name "hook.dll"
#   define hookproc "hookproc"
#   define hookstop "hookstop"typedef void (*phookproc) ();
typedef void (*phookstop) ();int main (int argc, char** argv) {phookproc pstart = 0;phookstop pstop = 0;HMODULE mdu = LoadLibrary (dll_name);if (! mdu) {printf ("load library error!\r\n");exit (0);}pstart = (phookproc) GetProcAddress (mdu, hookproc);pstop  = (phookstop) GetProcAddress (mdu, hookstop);pstart ();printf ("press q to end this program...\r\n");while (_getch () != 'q') ;pstop ();FreeLibrary (mdu);return 0;}

以上文件开启一个控制台,用于调用dll中的安装钩子函数,将钩子安装到所有进程中。

/*author : ezdate : 2015/4/3describe : a dll  that support export function to installand uninstall hook from current process
*/
#include <stdio.h>
#include <windows.h># define process_name "notepad.exe"HINSTANCE _hinstance = NULL;
HHOOK _hhook = NULL;
HWND _hwnd = NULL;BOOL WINAPI DllMain (HINSTANCE hinst, DWORD dwreason, LPVOID lpreserved)
{switch (dwreason) {case DLL_PROCESS_ATTACH:_hinstance = hinst;break;case DLL_PROCESS_DETACH:break;}return TRUE;
}LRESULT CALLBACK message_proc (int ncode, WPARAM wparam, LPARAM lparam) {char path [0xFF] = {0, };char* p = NULL;if (! ncode) {if (! (lparam & 0x80000000)) {int path_len = GetModuleFileName (NULL, path, 0xFF);p = strrchr (path, '\\');if (! _stricmp (p + 1, process_name)) {return 1;}}}return CallNextHookEx (_hhook, ncode, wparam, lparam);
}#ifdef __cplusplus
extern "C" {
#endif__declspec (dllexport) void  __stdcall hookproc () {_hhook = SetWindowsHookEx (WH_KEYBOARD, message_proc, _hinstance, 0);
}__declspec (dllexport) void __stdcall hookstop () {if (_hhook) {UnhookWindowsHookEx (_hhook);_hhook = NULL;}
}#ifdef __cplusplus
}
#endif

最后编译:

dll 的编译: gcc key.c -shared -o key.dll -Wl,--out-implib,key.o

可执行程序编译: gcc -o hook hook.c

下面简单介绍以上代码调用的Windows API:

1、HMODULE WINAPI LoadLibrary(
    _In_LPCTSTR lpFileName    // file name and path
);

将PE文件加载到当前进程的虚拟内存中,其返回值为进程虚拟内存中加载dll位置的起始位置(我计算机上为8位十六进制整数)。

2、FARPROC GetProcAddress(
   HMODULE hModule,   // module handler
   LPCSTR lpProcName  // func name
);

从加载到虚拟内存中的dll 中查找导出函数,即查找EAT,用函数名查找。

3、HOOK WINAPI SetWindowsHookEx (
 _In_ int idHook,
 _In_ HOOKPROC lpfn,
 _In_ HINSTANCE hMod,
 _In_ DWORD dwThreadId
);

设置windows hook,最后一个参数如果设置为0,则设置到所有的线程中。

4、BOOL WINAPI UnhookWindowsHookEx( __in HHOOK hhk);

卸载windows hook。

可以使用此技术,加载全局的鼠标和键盘钩子,在windows操作系统启动后执行,这样键盘和鼠标都会“无效”。

Windows 钩子,基本的dll注入相关推荐

  1. Windows注入与拦截(3) -- 使用钩子方式完成DLL注入

    一. 钩子技术介绍 前面介绍了< Windows注入与拦截(2) – 使用注册表方式完成DLL注入>,本文介绍使用钩子的方式将DLL注入到进程的地址空间中. Windows提供了3个API ...

  2. 关于dll注入方式的学习(全局钩子注入)

    何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...

  3. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  4. 【安全技术】关于几种dll注入方式的学习

    何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...

  5. 《逆向工程核心原理》学习笔记(三):DLL注入

    目录 前言 一.windows消息钩取 1.钩子 2.SetWindowsHookEx() 3.键盘消息钩取 4.调试练习 (1)调试HookMain.exe (2)调试KeyHook.dll 二.D ...

  6. 2020-11-23(Windows系统的dll注入 )

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

  7. MFC 全局钩子dll注入监听键盘消息

    MFC自带的键盘监听功能只有焦点在MFC程序界面时才能监听键盘消息,要想在MFC程序界面外监听键盘消息,可以通过DLL注入使用全局钩子来监听.首先,通过Visual Studio生成全局钩子的动态库, ...

  8. Dll注入过滤任意Windows控制台命令行输入

    命令提示符也就是命令行控制台,新版本也叫做Windows 终端.如何做到当命令被输入控制台窗口后能够做到过滤呢? 其中,有一种就是键盘钩子判断键盘输入,但实用性可能不高. 另外一种方法就是获取控制台缓 ...

  9. Windows系统的dll注入

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

最新文章

  1. myeclipse导入项目报错Target runtime Apache Tomcat v8.0 is not defined
  2. RabbitMq(十一) 死信交换机DLX介绍及使用
  3. 前端抓潜,必须设置门槛,筛选优质客户
  4. 【收藏】让错误的程序看得出错
  5. 变电站通信网络与系统-特定通信服务映射(SCSM)
  6. Java中的System.exit()
  7. Two Sum(Leetcode001)
  8. 编译原理第五章课后题
  9. Git学习笔记(基础操作+分支操作+PR)
  10. 在线作图工具:ProcessOn,流程图-思维导图-原型图-UML图等
  11. html5不用reload重置网页,refresh和reload
  12. python 时间戳转各时区时间
  13. 【知识图谱问答】DBpedia介绍
  14. 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
  15. SAP MM06物料删除
  16. 解析几何 曲线与二次曲面 曲面方程与坐标变换(2.1,2.2)
  17. mysqladmin的用法简介
  18. 【Ubuntu版】制作U盘启动盘
  19. sp工具中最疼的是_OnRobot推出小型壁虎单垫(SP)夹持器,扩展创新的壁虎夹持器系列...
  20. 韩国KOBA蓄电池 全系列电池供应

热门文章

  1. html导航栏圆角,怎么实现css圆角?
  2. PLSQL手动输入一个字符串,倒序打印输出字符串 , 如输入的是 abcd 打印输出 dcba
  3. Jirafeau一键式文件共享软件安装教程
  4. html:点击图片放大到全屏,再次点击缩回
  5. 视频显示输出接口及发展历史
  6. 处理机调度——看这一篇就够了
  7. 上班族适合的兼职副业,副业做什么比较靠谱,副业赚钱的路子有哪些
  8. Ubuntu Server 20.04 LTS 安装配置 PostgreSQL
  9. python renamer模块_python - 发布自己的模块(脚本) 到pypi.org
  10. android app如何挣钱,用业余爱好挣钱,这款 App 能帮你把特长变现 #Android&iOS