简单解释下hook:

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
hook原理:

每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程序。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

这是我第一次接触hook,写得很简单,对MessageBox函数hook一下下。

下面实验的原理:在指定进程中的内存里找到目标函数的地址,然后修改其首地址的前几字节为jmp指令,指向我们自己的自定义函数地址。这样,进程执行这个函数的时候,会先执行我们自己的代码,之后可以选择性执行原函数或不执行。

流程:

1.构造跳转指令。

2.在内存中找到欲hook函数地址,并保存欲hook位置处的前5个字节。

3.将构造的跳转指令写入需hook的位置处。

4.当被hook位置被执行时会转到我们的流程执行。

5.如果要执行原来的流程,那么取消hook,也就是还原被修改的字节。

6.执行原来的流程。

7.继续hook住原来的位置。

下面就要见具体代码实现了。我们来把hook封装一下。

ILHook.h

#ifndef __ILHOOK_H_1_
#define __ILHOOK_H_1_#include <Windows.h>class CILHook{
public:CILHook();~CILHook();BOOL Hook(LPSTR pszModuleName, LPSTR pszFuncName, PROC pfnHookFunc);VOID UnHook();BOOL ReHook();private:PROC m_pfnOrig;//函数地址BYTE m_bOldBytes[5];//函数入口代码BYTE m_bNewBytes[5];//Inline代码
};#endif

ILHook.cpp

#include "ILHook.h"CILHook::CILHook(){m_pfnOrig=NULL;ZeroMemory(m_bOldBytes, 5);ZeroMemory(m_bNewBytes, 5);
}
CILHook::~CILHook(){UnHook();
}/*
函数名称:Hook
函数功能:对指定模块中的函数进行挂钩
参数说明:pszModuleName:模块名称pszFuncName:函数名称pfnHookFunc:钩子函数
*/
BOOL CILHook::Hook(LPSTR pszModuleName,LPSTR pszFuncName,PROC pfnHookFunc){BOOL bRet=FALSE;//获取指定模块中函数的地址m_pfnOrig=(PROC)GetProcAddress(GetModuleHandle(pszModuleName),pszFuncName);if(m_pfnOrig!=NULL){//保存该地址处5个字节的内容DWORD dwNum=0;ReadProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,5,&dwNum);//构造JMP指令m_bNewBytes[0]='\xe9';//jmp Opcode//pfnHookFunc是HOOK后的目标地址//m_pfnOrig是原来的地址//5是指令长度*(DWORD*)(m_bNewBytes+1)=(DWORD)pfnHookFunc-(DWORD)m_pfnOrig-5;//将构造好的地址写入该地址处WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,5,&dwNum);bRet=TRUE;}return bRet;
}/*
函数名称:UnHook
函数功能:取消函数的挂钩
*/
VOID CILHook::UnHook(){if(m_pfnOrig!=0){DWORD dwNum=0;WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bOldBytes,5,&dwNum);}
}/*
函数名称:ReHook
函数功能:重新对函数进行挂钩
*/
BOOL CILHook::ReHook(){BOOL bRet=FALSE;if(m_pfnOrig!=0){DWORD dwNum=0;WriteProcessMemory(GetCurrentProcess(),m_pfnOrig,m_bNewBytes,5,&dwNum);bRet=TRUE;}return bRet;
}

test.cpp

#include "ILHook.h"CILHook MsgHook;int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType){MsgHook.UnHook();MessageBox(hWnd,"Hook",lpCaption,uType);MessageBox(hWnd,lpText,lpCaption,uType);MsgHook.ReHook();return 0;
}int main(){MessageBox(NULL,"test","test",MB_OK);MsgHook.Hook("User32.dll","MessageBoxA",(PROC)MyMessageBoxA);MessageBox(NULL,"test","test",MB_OK);MsgHook.UnHook();return 0;
}

最后的结果是弹出3个对话框,第一个是正常调用,后两个是跳转到自己的自定义函数里进行两次调用原函数,当然是恢复了hook之后。

这个例子是lnline hook本进程,后面会学习lnline hook非本进程。

lnline Hook初试相关推荐

  1. HOOK准备--PC版微信初试

    HOOK准备–PC版微信初试 以下关于钩子的介绍来自百度百科 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他 ...

  2. 初试linux编译(ubuntu+vim)+玩转智能蛇

    一.初试linux编译(ubuntu+vim) 步骤: ①下载vmware15+ubuntu桌面版映像 ②安装ubuntu ③下载vim+gcc 在ubuntu终端输入: sudo apt-get i ...

  3. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  4. 在React Hook里使用history.push跳转

    在React Hook里使用history.push跳转 react hook里用不了this.props.history的解决方法 首先引入 import { useHistory } from ' ...

  5. 在react hook里使用mobx(配置mobx依赖)

    在powershell里安装依赖 (直接npm i mobx或者npm i mobx-react是会报错的) npm i mobx mobx-react --save save是下载到"de ...

  6. HDU-1698-Just a Hook

    HDU-1698-Just a Hook http://acm.hdu.edu.cn/showproblem.php?pid=1698 还是成段更新线段树 #include<stdio.h> ...

  7. 一套使用注入和Hook技术托管入口函数的方案

    工作中,我们可能会经常使用开源项目解决一些领域中的问题.这种"拿来主义"是一种"专业人干专业事"的思想,非常实用.(转载请指明出于breaksoftware的c ...

  8. Linux下HOOK动态链接库中API的方法

    2012年,我写了一篇介绍Windows系统下Ring3层API的hook方案--<一种注册表沙箱的思路.实现--Hook Nt函数>,其在底层使用了微软的Detours库.5年后,我又遇 ...

  9. 一种注册表沙箱的思路、实现——Hook Nt函数

    Nt函数是在Ring3层最底层的函数了,选择此类函数进行Hook,是为了提高绕过门槛.我的Hook方案使用的是微软的Detours.(转载请指明出处) Detours的Hook和反Hook的写入如下: ...

最新文章

  1. tensorflow models 工程解析
  2. 2020 mse 清华_ICSMSE 2020
  3. Ajax ToolKit --- ModelPopupExtender应用经验二则
  4. The Famous Clock(著名的钟)
  5. CXF WebService 开发文档-目录索引
  6. 九章算术卷第三 衰分
  7. 基于springboot+vue的交通事故案例库系统
  8. matlab的方法定义变量,Matlab定义变量怎么操作?定义变量方法介绍
  9. SpringBoot如何自定义starter启动器?看这里
  10. Python 获取文件后缀详解
  11. 在搜狗浏览器中启用WebGL
  12. Overview of Genero BDL BDL概览
  13. 纪念爱因斯坦提出相对论100周年,推荐好文!
  14. DRN: A Deep Reinforcement Learning Framework for News Recommendation理解
  15. 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
  16. DEM数据(ASTER GDEM|SRTM|GLS2005|ALOS DEM|NASA DEM)下载
  17. C语言编写可以实现malloc() free()功能的函数(空间/时间复杂度低)
  18. GL benchmark测试解析
  19. 什么是JSON。如何使用JSON。
  20. UWB+ZigBee定位技术开创井下空间里的“GPS”导航

热门文章

  1. 改进AI/ML部署的5种方法
  2. 机器学习中的最优化算法总结
  3. AI时代我们最好做某领域的专家或高手
  4. 欧盟「人脑计划」​最新进展:新算法模拟生物进化,为大脑如何工作提供新见解...
  5. 汪卫华院士:无序中找有序 复杂中寻规律
  6. 放心,GPT-3不会“杀死”编程
  7. AI芯片的未来之战:“霸主”英伟达真就无人能挡了吗?
  8. 重磅:国家正式出台学术不端行为界定
  9. 31页官方PPT,回顾史上最大芯片WSE:科技的壮丽美感!
  10. 星巴克、苹果、谷歌、亚马逊等巨头,为何同时做这件事?