在介绍 截获系统消息钩子 之前,这几个函数是密切相关的:

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 技术的更多相关文章

  1. HOOK技术的一些简单总结

    好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术. 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常 ...

  2. Hook技术

    hook钩子: 使用技术手段在运行时动态的将额外代码依附现进程,从而实现替换现有处理逻辑或插入额外功能的目的. 它的技术实现要点有两个: 1)如何注入代码(如何将额外代码依附于现有代码中). 2)如何 ...

  3. 程序破解之 API HOOK技术 z

    API HOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socke ...

  4. API HOOK技术

    API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...

  5. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  6. 逆向实用干货分享,Hook技术第一讲,之Hook Windows API

    逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...

  7. 逆向实用干货分享,Hook技术第二讲,之虚表HOOK

    逆向实用干货分享,Hook技术第二讲,之虚表HOOK 正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK 昨天的博客链接: http://www ...

  8. x64内核HOOK技术之拦截进程.拦截线程.拦截模块

    x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...

  9. Windows Hook技术

    0x01 简介 有人称它为“钩子”,有人称它为“挂钩”技术.谈到钩子,很容易让人联想到在钓东西,比如鱼钩就用于钓鱼.编程技术的钩子也是在等待捕获系统中的某个消息或者动作.钩子的应用范围非常广泛,比如输 ...

  10. Android so注入(inject)和Hook技术学习(三)——Got表hook之导出表hook

    前文介绍了导入表hook,现在来说下导出表的hook.导出表的hook的流程如下.1.获取动态库基值 void* get_module_base(pid_t pid, const char* modu ...

随机推荐

  1. ListView 字母导航排序

    一.概述 ListView字母导航排序,网上已经有很多代码和博客了, 这篇博文也是照搬网上的.  之所以写到这里,不是为了说明什么,只是为了以后自己查阅方便.本来公司要求实现expandablelis ...

  2. Unity3D_UGUI与NGUI的区别与优缺点

    1. NGUI与UGUI的区别 1) UGUI的Canvas 有世界坐标和屏幕坐标; 2) UGUI的Image可以使用material; 3) UGUI通过Mask来裁剪,而NGUI通过Panel的 ...

  3. 在nginx日志access log可以记录POST请求的参数值

    1)      在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...

  4. CoDeSys

    CoDeSys是全球最著名的PLC内核软件研发厂家德国的3S(SMART,SOFTWARE,SOLUTIONS)公司出的一款与制造商无关的IEC 61131-1编程软件.CoDeSys 支持完整版本的 ...

  5. 解决chrome浏览器崩溃,再次安装不上问题

    上网重新下载了个安装包,发现安装包都打不来 很绝望,查了很多资料 很多人说要删除注册表的东西 但是打开注册表,发现一堆google的东西,手动删根本不现实 在绝望中看到了解决方案:google Upd ...

  6. Tomcat类加载器体系结构

    <深入理解java虚拟机>——Tomcat类加载器体系结构 标签: java / 虚拟机 / tomcat Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的 ...

  7. Vue-学习笔记0-独立项目搭建

    前言 搭建Vue+Webpack项目,使用vue-cli搭建项目. 准备 vue独立项目依赖node的npm包管理器,所以需要先安装node. 相关的npm常用命令文章: Npm-常用命令,点击访问 ...

  8. awk 命令使用

    awk命令就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.例如: awk -F '/' '{print $NF}' tmp/file.txt 该命令用于读取file. ...

  9. idea必备快捷键

    ctrl + F: 在当前文件进行文本查找 ctrl + R: 在当前文件进行文本的替换 ctrl + Z: 撤销操作 ctrl + Y:删除光所在的行 或者选中的行 ctrl + D: 复制光标所在 ...

  10. 【Python】机器学习之单变量线性回归练习(计算Cost Function)

    注:练习来自于吴恩达机器学习 翻译后的题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同的城市人口数和该城市带来的利润.第一列是城市的人口数,第 ...