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

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. [翻译] .NET Core 3.0 RC 1 发布

    原文: Announcing .NET Core 3.0 Release Candidate 1 今天,我们宣布推出 .NET Core 3.0 Release Candidate 1.就像 Prev ...

  2. linux中必备常用支持库的安装(CentOS)

    在CentOS安装软件的时候,可能缺少一部分支持库,而报错.这里首先安装系统常用的支持库.那么在安装的时候就会减少很多的错误的出现 yum install -y gcc gdb strace gcc- ...

  3. 将SpringBoot部署在外部tomcat中

    一,前言 在文章SpringBoot之简单入门中提到了,SpringBoot是内置一个tomcat容器的,但是如果要将SpringBoot部署在一个外部的tomcat,要怎么办呢?这就是本篇文章的目的 ...

  4. Docker下实战zabbix三部曲之三:自定义监控项

    通过上一章<Docker下实战zabbix三部曲之二:监控其他机器>的实战,我们了解了对机器的监控是通过在机器上安装zabbix agent来完成的,zabbix agent连接上zabb ...

  5. windows如何利用计划任务自动关机?

    第一步打开控制面板,然后选择计划任务,打开它 选择创建基本任务 输入任务名称,描述,选择下一步 根据需要选择,我这里选择的是每天,然后选择下一步 选择任务开始时间,然后选择下一步 选择启动程序,然后选 ...

  6. linux mint安装ffmpge

    sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install ffmpeg

  7. windows下tomcat启动日志乱码

    在windows下用startup.bat启动时,控制台里显示乱码,如图: 解决方案: 修改conf文件下的logging.properties文件,将控制台输出的编码修改为GBK: java.uti ...

  8. playframe 项目搭建

  9. C++——指针

    目录 一.地址和指针 1.1内存 1.2针和指针变量 二.指针变量 2.1始化 2.2赋值 2.3指针类型算术运算 2.4指针类型关系运算 2.5指向指针的指针 三.指针与数组 3.1指针运算 3.2 ...

  10. python爬虫——京东评论、jieba分词、wordcloud词云统计

    接上一章,动态页面抓取——抓取京东评论区内容. url=‘https://club.jd.com/comment/productPageComments.action?callback=fetchJS ...