HOOK 技术
在介绍 截获系统消息钩子 之前,这几个函数是密切相关的:
SetWindowsHookEx() 介绍:
功能:将应用程序定义的挂钩过程安装到挂钩链中。
函数原型:HHOOK SetWindowsHookEx(
int idHook, // 钩子类型。
HOOKPROC lpfn, // 指向挂钩过程的指针。
HINSTANCE hmod, // 包含 lpfn 参数指向的挂钩过程的 DLL 的句柄。
DWORD dwThreadId // 与挂钩过程关联的线程的标识符。如果为 0,则为全局钩子。
);
返回值:如果函数成功, 则返回值是挂钩过程的句柄。如果函数失败, 返回值为 NULL。
参数 idHook:
值 | 含义 |
WH_CALLWNDPROC | 安装的钩子过程监视信息在系统将它们发送给目标窗口之前。 |
WH_CALLWNDPROCRET | 安装的钩子过程监视信息在系统将它们发送给目标窗口之后。 |
WH_KEYBOARD | 安装监视击键消息的挂钩过程。 |
WH_MOUSE | 安装监视鼠标消息的挂钩过程。 |
WH_GETMESSAGE | 安装用于监视将消息发送给消息队列的挂钩过程 |
WH_DEBUG | 安装用于调试其他挂钩过程的挂钩过程。 |
CallNextHookEx() 介绍:
功能:将挂钩信息传递到当前挂钩链中的下一个挂钩过程。钩子过程可以在处理钩子信息之前或之后调用此函数。
函数原型:LRESULT CallNextHookEx(
HHOOK hhk, // 通常被忽略。
int nCode, // 传递给当前挂钩过程的挂钩代码。下一个挂钩过程使用此代码来确定如何处理挂钩信息。
WPARAM wParam, // 传递给当前挂钩过程的 wParam 值。此参数的含义取决于与当前挂钩链关联的挂钩的类型。
LPARAM lParam // 传递给当前挂钩过程的 lParam 值。此参数的含义取决于与当前挂钩链关联的挂钩的类型。
);
返回值:此值由链中的下一个挂钩过程返回。当前挂钩过程还必须返回此值。返回值的含义取决于挂钩类型。
UnhookWindowsHookEx() 介绍:
功能:移除由 SetWindowsHookEx 函数安装在钩子链中的挂钩过程。
函数原型:BOOL UnhookWindowsHookEx(
HHOOK hhk // 要移除的钩子的句柄。
);
返回值:非零表示成功,零表示失败。
用户自定义钩子:(生成 dll 文件,并注入到相应的进程)
#include<windows.h>
#include<stdlib.h>
HANDLE hProc;
FARPROC pfMessageBoxA;
FARPROC pfMessageBoxW;
// 注意:自定义函数得和被 HOOK 函数的形式一样,否则会发生异常。
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR sl, UINT u);
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR sl, UINT u);
BYTE OldMessageBoxACode[], NewMessageBoxACode[];
BYTE OldMessageBoxWCode[], NewMessageBoxWCode[];
DWORD CurrentProcessId, dwOldProtect;;
BOOL BHook = FALSE;
BOOL Init();
void HookOn();
void HookOff();
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Init();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
HookOff();
break;
}
return TRUE;
}
BOOL Init()
{
HMODULE hModule;
DWORD Address;
hModule = LoadLibraryA("user32.dll");
pfMessageBoxA = GetProcAddress(hModule, "MessageBoxA");
pfMessageBoxW = GetProcAddress(hModule, "MessageBoxW");
if (pfMessageBoxA == NULL || pfMessageBoxW == NULL)
return FALSE; memcpy(OldMessageBoxACode,pfMessageBoxA,); // 拷贝原来函数地址的前五个字节以备复原。
NewMessageBoxACode[] = 0xe9; // 即 jmp 指令。
Address = (DWORD)MyMessageBoxA - (DWORD)pfMessageBoxA - ; // 自定义函数与原函数的偏移地址。
memcpy(NewMessageBoxACode+,&Address,); memcpy(OldMessageBoxWCode,pfMessageBoxW,);
NewMessageBoxWCode[] = 0xe9;
Address = (DWORD)MyMessageBoxW - (DWORD)pfMessageBoxW - ;
memcpy(NewMessageBoxWCode+,&Address,); CurrentProcessId = GetCurrentProcessId();
HookOn();
return TRUE;
} int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR pl, UINT u)
{
HookOff();
MessageBoxA(hWnd, "请重新安装系统", "重要提示", MB_OK);
HookOn();
return TRUE;
} int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR pl, UINT u)
{
HookOff();
MessageBoxW(hWnd, L"请重新安装系统", L"重要提示", MB_OK);
HookOn();
return TRUE;
} void HookOn()
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, , CurrentProcessId);
// 打开进程,关闭内存保护,向内存空间前五个字节写入 jmp 指令,最后打开进程保护。
VirtualProtectEx(hProc, pfMessageBoxA, , PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProc, pfMessageBoxA, NewMessageBoxACode, , );
VirtualProtectEx(hProc, pfMessageBoxA, , dwOldProtect, &dwOldProtect); VirtualProtectEx(hProc, pfMessageBoxW, , PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProc, pfMessageBoxW, NewMessageBoxWCode, , );
VirtualProtectEx(hProc, pfMessageBoxW, , dwOldProtect, &dwOldProtect); CloseHandle(hProc);
BHook = TRUE;
} void HookOff()
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, , CurrentProcessId);
// 同理,只不过是复原内存指令。
VirtualProtectEx(hProc, pfMessageBoxA, , PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProc, pfMessageBoxA, OldMessageBoxACode, , );
VirtualProtectEx(hProc, pfMessageBoxA, , dwOldProtect, &dwOldProtect); VirtualProtectEx(hProc, pfMessageBoxW, , PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(hProc, pfMessageBoxW, OldMessageBoxWCode, , );
VirtualProtectEx(hProc, pfMessageBoxW, , dwOldProtect, &dwOldProtect); CloseHandle(hProc);
BHook = FALSE;
}
注入后,如下图所示:
HOOK 技术的更多相关文章
- HOOK技术的一些简单总结
好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术. 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常 ...
- Hook技术
hook钩子: 使用技术手段在运行时动态的将额外代码依附现进程,从而实现替换现有处理逻辑或插入额外功能的目的. 它的技术实现要点有两个: 1)如何注入代码(如何将额外代码依附于现有代码中). 2)如何 ...
- 程序破解之 API HOOK技术 z
API HOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socke ...
- API HOOK技术
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...
- 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展
[Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...
- 逆向实用干货分享,Hook技术第一讲,之Hook Windows API
逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...
- 逆向实用干货分享,Hook技术第二讲,之虚表HOOK
逆向实用干货分享,Hook技术第二讲,之虚表HOOK 正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK 昨天的博客链接: http://www ...
- x64内核HOOK技术之拦截进程.拦截线程.拦截模块
x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...
- Windows Hook技术
0x01 简介 有人称它为“钩子”,有人称它为“挂钩”技术.谈到钩子,很容易让人联想到在钓东西,比如鱼钩就用于钓鱼.编程技术的钩子也是在等待捕获系统中的某个消息或者动作.钩子的应用范围非常广泛,比如输 ...
- Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook
前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...
随机推荐
- ListView 字母导航排序
一.概述 ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的. 之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelis ...
- Unity3D_UGUI与NGUI的区别与优缺点
1. NGUI与UGUI的区别 1) UGUI的Canvas 有世界坐标和屏幕坐标; 2) UGUI的Image可以使用material; 3) UGUI通过Mask来裁剪,而NGUI通过Panel的 ...
- 在nginx日志access log可以记录POST请求的参数值
1) 在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...
- CoDeSys
CoDeSys是全球最著名的PLC内核软件研发厂家德国的3S(SMART,SOFTWARE,SOLUTIONS)公司出的一款与制造商无关的IEC 61131-1编程软件.CoDeSys 支持完整版本的 ...
- 解决chrome浏览器崩溃,再次安装不上问题
上网重新下载了个安装包,发现安装包都打不来 很绝望,查了很多资料 很多人说要删除注册表的东西 但是打开注册表,发现一堆google的东西,手动删根本不现实 在绝望中看到了解决方案:google Upd ...
- Tomcat类加载器体系结构
<深入理解java虚拟机>——Tomcat类加载器体系结构 标签: java / 虚拟机 / tomcat Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的 ...
- Vue-学习笔记0-独立项目搭建
前言 搭建Vue+Webpack项目,使用vue-cli搭建项目. 准备 vue独立项目依赖node的npm包管理器,所以需要先安装node. 相关的npm常用命令文章: Npm-常用命令,点击访问 ...
- awk 命令使用
awk命令就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.例如: awk -F '/' '{print $NF}' tmp/file.txt 该命令用于读取file. ...
- idea必备快捷键
ctrl + F: 在当前文件进行文本查找 ctrl + R: 在当前文件进行文本的替换 ctrl + Z: 撤销操作 ctrl + Y:删除光所在的行 或者选中的行 ctrl + D: 复制光标所在 ...
- 【Python】机器学习之单变量线性回归练习(计算Cost Function)
注:练习来自于吴恩达机器学习 翻译后的题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同的城市人口数和该城市带来的利润.第一列是城市的人口数,第 ...