inline hook是通过修改函数执行指令来达到挂钩的。比如A要调用B,但人为地修改执行流程导致A调用了C,C在完成了自己的功能后,返回B再执行。
修改这段指令前首先要获取修改权限
由于要修改的代码位于PE文件的代码段,而PE文件载入内存时默认代码段的权限为“可执行,只读”。通过函数VirtualProtect 修改这段代码所在内存空间的权限(保护属性)。
 VirtualProtect函数原型:
BOOL VirtualProtect(  
  LPVOID lpAddress,  //基地址:内存起始位置,也就是要修改代码的地址
  DWORD dwSize,  //    长度  :要修改多少个字节的属性,此处为一条jmp指令的长度5字节
  DWORD flNewProtect,  //    新保护属性  :修改后的内存保护属性,此处为64代表“可执行可写”。
  PDWORD lpflOldProtect  //    旧保护属性:原始的内存保护属性
);  
 代码实现:
//dwTemp保存旧保护属性。便于hook后续恢复原状
DWORD dwOldProtect , dwTemp; //修改为可读可写可执行
if(VirtualProtect(add , 5 , 64 , &dwOldProtect)){
//jmp to fake_add
}
//恢复为修改前的属性
VirtualProtect(add , 5 , dwOldProtect , &dwTemp);
以上实现修改add函数附近的5个字节码权限为为可读可写(flNewProtect设置为PAGE_EXECUTE_READWRITE(0x40)即64)
定位原函数地址时,可以像本例通过函数名(例如 LPVOID originFunction = MessageBoxA),或者如果该函数是存在在一个DLL并且已声明公开,则可以通过GetProcAddress( 功能是检索指定的动态链接库(DLL)中的输出库函数地址)函数来获取函数的地址。
比如要获取kernel32.dll里面的WriteProcessMemory函数:
LPVOID lpvWriteProcessMemory = GetProcAddress(GetModuleHandle("kernel32.dll") , "WriteProcessMemory");
权限修改好后就可以改写代码了,通过WriteProcessMemory将add函数开始部分改写为:jmp <fake_add的函数地址>,此处的jmp为短跳转,注意位移量为相对偏移
JMP 的 3 种类型
1. 短跳转(Short Jmp,只能跳转到256字节的范围内),对应机器码:EB
2. 近跳转(Near Jmp,可跳至同一段范围内的地址),对应机器码:E9
3. 远跳转(Far Jmp,可跳至任意地址),对应机器码: EA
短跳转 和 近跳转 指令中包含的操作数都是相对于(E)IP的偏移
远跳转指令中包含的是目标的绝对地址。
计算jmp位移量
jmp指令占5字节,执行该指令后,IP先加5,然后在加上jmp指令的位移量
所以 新函数的地址– 待修改函数的地址 – 5 = 位移量
RVA = fake_add - add - 5;
知道了地址可以开始改写内存写入jmp指令了,
//写入该段内存
if(WriteProcessMemory(currentProcessHandle , originAdd , shellCode , 5 , &dwWritten) && dwWritten == 5){
MessageBoxA(NULL , "Write Hook Success !" , "Hook add" , 0);
}
函数原型:
BOOL WriteProcessMemory(
HANDLE hProcess,//所写入的进程句柄
LPVOID lpBaseAddress,//写入内存的基地址
LPVOID lpBuffer,//待写入数据的地址
DWORD nSize,   //写入长度(字节)
LPDWORD lpNumberOfBytesWritten
);
//返回值非0为成功
运行效果
点击确定后
 
 
 
 
参考资料:

inline hook原理和实现的更多相关文章

  1. x86平台inline hook原理和实现

    概念 inline hook是一种通过修改机器码的方式来实现hook的技术. 原理 对于正常执行的程序,它的函数调用流程大概是这样的: 0x1000地址的call指令执行后跳转到0x3000地址处执行 ...

  2. Inline Hook

    @author: dlive IAT Hook时如果要钩取的API不在IAT中(LoadLibrary后调用),则无法使用该技术.而Inline Hook不存在这个限制. 0x01 Inline Ho ...

  3. 转移指令原理和Inline Hook

    目录 转移指令原理和Inline Hook 转移指令 操作符offset jmp指令 根据位移进行转移的jmp指令 插播HOOK知识 Inline Hook Inline Hook 原理 Hook代码 ...

  4. Inline Hook NtQueryDirectoryFile

    Inline Hook NtQueryDirectoryFile 首先声明这个是菜鸟—我的学习日记,不是什么高深文章,高手们慎看. 都总是发一些已经过时的文章真不好意思,几个月以来沉迷于游戏也是时候反 ...

  5. Android Hook框架adbi的分析(3)---编译和inline Hook实践

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/75200800 一.序言 在前面的博客中,已经分析过了Android Hook框架a ...

  6. 【C++】实现D3D9 的 Inline hook

    [C++]实现D3D9 的 Inline hook   简单介绍一下HOOK原理: 函数调用的过程大致是 先push 参数 进去,再执行 call 函数地址 ,进入函数.此时将所调用的函数的前五个字节 ...

  7. 对付ring0 inline hook

    对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess.然后修改SSDT表,让系统服务进入自己的函数M ...

  8. android inline hook

    最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline ...

  9. 在已有软件加壳保护 下实现 Inline hook

    如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 正常情况: 接到一个项目实现对屏幕输出内容的获取 ...

随机推荐

  1. PTA面向对象程序设计6-3 面积计算器(函数重载)

    实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int z); 第一个函数计算长方形的 ...

  2. Sentry 监控 - Environments 区分不同部署环境的事件数据

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  3. java循环结构、数组

    数组 数组是是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 数组本身是引用数据类型,既可以存储基本数据类型,也可以存储引用数据类型.它的元素相当于 ...

  4. dedecms织梦调用指定文章id

    {dede:arclist idlist="1349"  channelid="1" addfields="date,city"} idli ...

  5. Nginx系列(8)- Nginx安装 | Docker环境下部署

    Docker环境下部署Nginx https://www.cnblogs.com/gltou/p/15186971.html

  6. python pip 安装使用国内镜像源

    国内镜像源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 ...

  7. 《如何进行接口mock测试》

    前言: Mock通常是指:在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否 ...

  8. 《exe应用程序UI自动化》

    前言:有很多公司做一些客户端的应用,每次发版都要耗费人力去手动回归比较费时,那么我们就想着去怎么去驱动人为的操作变为机器的操作过程,当然想着进行UI自动 那么我们就要考虑怎么去实现exe应用程序的自动 ...

  9. P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 \(n\)个点的一张无向图,有\(k\)条必走边,\(m\)条其他边,求从\(1\)出发经过必走 ...

  10. SpringMVC的数据输出

    使用 @Controller public class OutputController { @RequestMapping("/handle01") public String ...