低头不是认输,是要看清自己的路。仰头不是骄傲,是看见自己的天空。——致自己

Hook,是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。简单来说,如下图所示(个人理解,如有错误请留言):

现在开始简单的编写一个程序,简单的实现下hook,以notepad.exe为例(因为它比较简单,hook它不用考虑权限其他啥的),对其进行hook,拦截其键盘消息。首先编写一个安装钩子的程序。

#include<stdio.h>
#include<conio.h>
#include<windows.h>#define DLL_NAME   "HookKeyBoard.dll"
#define HOOK_START "HookStart"
#define HOOK_STOP  "HookStop"typedef void(*PFN_HOOKSTART)();
typedef void(*PFN_HOOKSTOP)();int main()
{HMODULE hDll =NULL;PFN_HOOKSTART HookStart = NULL;PFN_HOOKSTOP  HookStop  = NULL;char ch = 0;//加载dllhDll = LoadLibraryA(DLL_NAME);//获取导出函数的地址HookStart = (PFN_HOOKSTART)GetProcAddress(hDll,HOOK_START);HookStop  = (PFN_HOOKSTOP)GetProcAddress(hDll,HOOK_STOP);//开始hookHookStart();//输入Q退出hookprintf("输入Q退出hook!\n");while(1){char h = getch();putch(h);if( h == 'Q')break;}//结束hookHookStop();//卸载dllFreeLibrary(hDll);return 0;
}

可以看到,我加载了一个HookKeyBoard.dll,并使用了它的两个导出函数HookStart和HookStop,一个用来hook,一个用来Unhook,下面开始写HookKeyBoard.dll(注意写的是dll)。

#include<stdio.h>
#include<windows.h>#define HOOK_PROCESS_NAME "notepad.exe"HINSTANCE hInstance = NULL;
HHOOK hHook = NULL;
HWND hWnd = NULL;BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD dwReason, LPVOID IpvReserved)
{switch( dwReason ){case DLL_PROCESS_ATTACH: hInstance = hinstDLL;break;case DLL_PROCESS_DETACH: break;}return TRUE;
}LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{char szPath[MAX_PATH]={0,};CHAR *p = NULL;if(!(lParam & 0x80000000))//释放按键时{GetModuleFileNameA(NULL,szPath,MAX_PATH);p = strrchr(szPath,'\\');//比较进程名称if(!_stricmp(p+1,HOOK_PROCESS_NAME)){//MessageBox(NULL,TEXT("hook成功"),TEXT("MY"),MB_OK);return 1;}}//不是hook的程序,则传递到出去return CallNextHookEx(hHook,nCode,wParam,lParam);
}
extern "C" __declspec(dllexport) void HookStart()
{hHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);//MessageBox(NULL,TEXT("hook成功"),TEXT("MY"),MB_OK);
}extern "C" __declspec(dllexport) void HookStop()
{if(hHook){UnhookWindowsHookEx(hHook);hHook = NULL;}
}

消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中。(msdn没搜到这个函数,msdn只列出了A版和W版的函数,他们的区别就是A字符串用ascii编码,W 宽字符,字符串用Unicode编码,所以区别不大)。

看下参数

可以看到,我挂钩KeyboardProc这个系统函数。

程序写完了,代码比较简单,有点编程基础的应该都能看懂,现在开始进行测试。测试之前,先将HookKeyBoard.dll拷贝到工程生成hook.exe的目录下,否则它找不到DLL,就会出现下面的情况。详细原因请参考之前我写的这篇博客DLL搜索的目录顺序。

然后测试,第一步先打开notepad.exe,然后点击hook.exe

然后打开Process Explorer进程监视器,查看加载的DLL,然后尝试在notepad.exe里面输入东西,可以看到HookKeyBoard.dll被notepad.exe加载了,并且在notepad.exe输入任何东西都不能显示出来(被hook了),其他地方则可以正常显示。

DLL注入技术之消息钩子注入(HOOK简单的实现)相关推荐

  1. Anti 消息钩子注入

    MSDN上对消息钩子的描述: The SetWindowsHookEx function installs an application-defined hook procedure into a h ...

  2. 《撸代码 学习 IOC注入技术1 》—— 布局注入 与 控件注入

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/104539874 [源代码下载地 ...

  3. 《撸代码学习 IOC注入技术2》—— 事件注入

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/104581855 源代码下载地址 ...

  4. 注入(4)--消息钩子注入(SetWindowsHookEX)

    SetWindowsHookEx函数是微软提供给程序开发人员进行消息拦截的一个API.不过,他的功能不仅可以用作消息拦截,还可以进行DLL注入. SetWindowsHookEx原型声明如下: WIN ...

  5. 十种进程注入技术介绍:常见注入技术及趋势调查

    前言 进程注入是一种广泛使用的躲避检测的技术,通常用于恶意软件或者无文件技术.其需要在另一个进程的地址空间内运行特制代码,进程注入改善了不可见性,同时一些技术也实现了持久性.尽管目前有许多进程注入技术 ...

  6. 注入技术--消息hook注入

    1.简介 消息钩子注入. 对有窗口的进程. 容易被检测 SetWindowsHookExW的参数1如果空,则卸载钩子 2.代码 HHOOK hook = 0; DWORD msgInject(WCHA ...

  7. 防游戏检测之易语言DLL内存注入技术

    DLL注入,除了线程注入,消息钩子注入,输入法注入外,还有一种就是内存注入 那么什么是内存注入呢? 内存注入就是指内存中加载并且执行DLL文件,这样的注入方式好处有以下几点: 1.不需要把DLL文件暴 ...

  8. WinAPI【远程注入】利用远程线程注入DLLDelphi版

    { WinAPI[远程注入]利用远程线程注入DLLDelphi版} (okwary) 小叹的学习园地 ( SDK文档里是这样描述的:进程是一个正在运行的程序,它拥有自己的地址空间,拥有自己的 ...

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

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

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

    说明{      通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...

最新文章

  1. pta 7-6 根据后序和中序遍历输出先序遍历 (25 分)
  2. phpexcel设置AAA单元格,兼容大于702列数据
  3. H3 BPM微信接入配置
  4. ITK:在向量容器上迭代
  5. html画布 缩放的正方形,html5-canvas – 在动画HTML5画布中缩放和平移
  6. vim中的jk为什么是上下_JK轮胎的完整形式是什么?
  7. 异步通知《来自Linux驱动程序开发实例》
  8. php7.2连接mysql8_兼容 php 7.2 及 mysql 8
  9. 一个简单的json解析器
  10. 使用 Python 批量下载喜马拉雅有声书音频
  11. kvm实战之搭建一个web服务来进行ks.cfg文件的引导(三)
  12. Cisco命令合集-1
  13. 超详细的TypeScript入门教程!
  14. 网盘的暴力营销,你们的脸遮遮掩掩
  15. rx6600怎么样 rx6600显卡相当于什么n卡
  16. wordpress新留言微信提醒
  17. 科技交流英语(2022秋)
  18. Linux 条件变量 pthread_cond_wait
  19. Ubuntu系统安装webrtc
  20. Lucene高亮显示详解

热门文章

  1. 大数据组项目文档整理方案
  2. ajax中GET和POST区别
  3. GRBL分析:gcode解释器(一)
  4. 1999年考研数学一解析pdf
  5. MT7621完美支持32M SPI Flash(W25Q256) 修复 soft reset fail
  6. 分析了633个中国城市之后,我们发现五分之二都在流失人口...(附统计图)
  7. 电商平台拼多多详情接口API数据获取示例
  8. Lodop6.226_Clodop3.075.zip
  9. Mac下超级好用的5个顶级“实用”APP推荐
  10. 电商系统之商品类目及商品属性史