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. Linux系列(3) - ls

    作用 ls:查询目录中内容 格式 ls [选项] [文件或目录] 选项 描述 -a 显示所有文件,包括隐藏文件.隐藏文件是.开头的 -l 显示详细信息:ls -l简写为ll,使用频率很高 -d 查看目 ...

  2. Jmeter系列(14)- Setup与tearDown线程组

    与普通线程组区别 #Setup线程组:在普通线程组执⾏前触发 #tearDown线程组:在普通线程组执⾏后触发 线程组属性配置详情完全⼀致 使⽤策略建议 #Setup 线程组 – 压测执⾏准备阶段,准 ...

  3. django错误处理

    1.django.db.utils.OperationalError: no such table 意思:没有这个app应用对应的数据表的,可以用 python manage.py makemigra ...

  4. english note(6.2 to 5.30)

    notes 6.2 to 5.30  http://www.51voa.com/VOA_Special_English/suicide-rates-among-young-americans-on-t ...

  5. 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01

    百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  6. P4980-[模板]Pólya定理

    正题 题目链接:https://www.luogu.com.cn/problem/P4980 题目大意 \(n\)个物品图上\(m\)种颜色,求在可以旋转的情况下本质不同的涂色方案. 解题思路 既然是 ...

  7. 三千字介绍Redis主从+哨兵+集群

    一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ...

  8. 4-让线程睡眠的sleep方法

    让线程睡眠的sleep方法 Thread类有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法,调用线程就会让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程 ...

  9. java统一返回标准类型

    一.前言.背景 在如今前后端分离的时代,后端已经由传统的返回view视图转变为返回json数据,此json数据可能包括返回状态.数据.信息等......因为程序猿的习惯不同所以返回json数据的格式也 ...

  10. Spring源码之AOP的使用

    Spring往期精彩文章 Spring源码搭建 Spring源码阅读一 前言 我们都知道Java是一门面向对象(OOP)的语言,所谓万物皆对象.但是它也存在着一些个弊端:当你需要给多个不具有继承关系的 ...