lnline Hook初试
简单解释下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初试相关推荐
- HOOK准备--PC版微信初试
HOOK准备–PC版微信初试 以下关于钩子的介绍来自百度百科 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他 ...
- 初试linux编译(ubuntu+vim)+玩转智能蛇
一.初试linux编译(ubuntu+vim) 步骤: ①下载vmware15+ubuntu桌面版映像 ②安装ubuntu ③下载vim+gcc 在ubuntu终端输入: sudo apt-get i ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 在React Hook里使用history.push跳转
在React Hook里使用history.push跳转 react hook里用不了this.props.history的解决方法 首先引入 import { useHistory } from ' ...
- 在react hook里使用mobx(配置mobx依赖)
在powershell里安装依赖 (直接npm i mobx或者npm i mobx-react是会报错的) npm i mobx mobx-react --save save是下载到"de ...
- HDU-1698-Just a Hook
HDU-1698-Just a Hook http://acm.hdu.edu.cn/showproblem.php?pid=1698 还是成段更新线段树 #include<stdio.h> ...
- 一套使用注入和Hook技术托管入口函数的方案
工作中,我们可能会经常使用开源项目解决一些领域中的问题.这种"拿来主义"是一种"专业人干专业事"的思想,非常实用.(转载请指明出于breaksoftware的c ...
- Linux下HOOK动态链接库中API的方法
2012年,我写了一篇介绍Windows系统下Ring3层API的hook方案--<一种注册表沙箱的思路.实现--Hook Nt函数>,其在底层使用了微软的Detours库.5年后,我又遇 ...
- 一种注册表沙箱的思路、实现——Hook Nt函数
Nt函数是在Ring3层最底层的函数了,选择此类函数进行Hook,是为了提高绕过门槛.我的Hook方案使用的是微软的Detours.(转载请指明出处) Detours的Hook和反Hook的写入如下: ...
最新文章
- tensorflow models 工程解析
- 2020 mse 清华_ICSMSE 2020
- Ajax ToolKit --- ModelPopupExtender应用经验二则
- The Famous Clock(著名的钟)
- CXF WebService 开发文档-目录索引
- 九章算术卷第三 衰分
- 基于springboot+vue的交通事故案例库系统
- matlab的方法定义变量,Matlab定义变量怎么操作?定义变量方法介绍
- SpringBoot如何自定义starter启动器?看这里
- Python 获取文件后缀详解
- 在搜狗浏览器中启用WebGL
- Overview of Genero BDL BDL概览
- 纪念爱因斯坦提出相对论100周年,推荐好文!
- DRN: A Deep Reinforcement Learning Framework for News Recommendation理解
- 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
- DEM数据(ASTER GDEM|SRTM|GLS2005|ALOS DEM|NASA DEM)下载
- C语言编写可以实现malloc() free()功能的函数(空间/时间复杂度低)
- GL benchmark测试解析
- 什么是JSON。如何使用JSON。
- UWB+ZigBee定位技术开创井下空间里的“GPS”导航
热门文章
- 改进AI/ML部署的5种方法
- 机器学习中的最优化算法总结
- AI时代我们最好做某领域的专家或高手
- 欧盟「人脑计划」​最新进展:新算法模拟生物进化,为大脑如何工作提供新见解...
- 汪卫华院士:无序中找有序 复杂中寻规律
- 放心,GPT-3不会“杀死”编程
- AI芯片的未来之战:“霸主”英伟达真就无人能挡了吗?
- 重磅:国家正式出台学术不端行为界定
- 31页官方PPT,回顾史上最大芯片WSE:科技的壮丽美感!
- 星巴克、苹果、谷歌、亚马逊等巨头,为何同时做这件事?