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. 【PHP数据结构】图的概念和存储结构

    随着学习的深入,我们的知识也在不断的扩展丰富.树结构有没有让大家蒙圈呢?相信我,学完图以后你就会觉得二叉树简直是简单得没法说了.其实我们说所的树,也是图的一种特殊形式. 图的概念 还记得我们学习树的第 ...

  2. 深入学习Composer原理(一)

    Composer作为PHP的包管理工具,为PHPer们提供了丰富的类库,并且让PHP重焕新生,避免被时代淘汰的悲剧.可以说,Composer和PHP7是现在PHP开发者的标配,如果你还没用过Compo ...

  3. TP5模型开启事务

    和Db开启事务类似,Db是静态方法 $userObj = new UserModel(); $userObj->startTrans(); try { $userObj->data($da ...

  4. windows 中cmd一些特殊命令

    chcp 65001  就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp 437 是美国英语 shutdown -s -t 60   60秒后关机 shutdown /a  ...

  5. Shell条件判断(6)- 多重条件判断

    多重条件判断 多个条件判断一起使用 测试选项 作用 判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真 判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真 ! ...

  6. Django边学边记—新手Django建项目各流程细节

    一.准备虚拟环境 1)安装 virtualenv pip install virtualenv 2)virtualenvwrapper pip install virtualenvwrapper-wi ...

  7. Windows 10 64位操作系统 下安装、连接测试sqlite3 sql基本操作 增删改

    一.下载sqlite安装包 1:详细下载安装版本可见官网:https://www.sqlite.org/download.html 2:百度盘分享连接:https://pan.baidu.com/s/ ...

  8. spring入门1-IOC和DI

    1.概述 1.1.简介 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Or ...

  9. javascript DOM 共同父节点

    * 查找两个节点的最近的一个共同父节点,可以包括节点自身 input: oNode1 和 oNode2 在同一文档中,且不会为相同的节点 function commonParentNode(oNode ...

  10. Spring动态代理的生成-如何判断是使用JDK动态代理还是CGlib代理

    前言 在上一篇文章中讲到了Spring是如何获取对应的Bean的增强,然后本次主要讲解一下Spring如何在获取到增强后创建Spring代理的. 在步入正题之前先给大家看一下Spring创建代理的大致 ...