64位下的InlineHook
x64下手工HOOK的方法
关于64位程序.网上HOOK方法一大堆.这里也记录一下. 了解跨平台HOOK的真相与本质.
一丶HOOK的几种方法之远跳
1. 远跳 不影响寄存器 + 15字节方法
在64位下 HOOK有几种方法. 一种是影响寄存器的值.另一种是不影响寄存器的值.各有优劣.
第一种: 不影响寄存器的值 硬编码占用大小为15个字节.
原理: 利用push + ret的原理. 让HOOK的位置跳转为我们的地址.
push 函数低地址(8个字节)
mov qword ptr ss:[rsp + 4],函数高地址(8个字节,不过高4个字节一般都是0所以可以不用给)
ret
硬编码:
68 XX XX XX XX push LowAddress
48 C7 44 24 04 XX XX XX XX mov qword ptr ss:[rsp + 4],HighAddress
C3 ret
其中XX的地方可以换成我们的地址.
2.远跳 影响寄存器 + 12字节方法
这一种方法则会影响寄存器的值.
原理: 利用 rax + jmp的方式进行跳转.
mov rax,Address
Jmp rax
硬编码
48 B8 XX XX XX XX XX XX XX XX FF E0
截图:

这里需要注意的是地址的大小尾模式. 填写一定不要写错.
3.影响寄存器,恢复寄存器 进行跳转.
这种方法其实是第二种方法的演变. 第二种我们会直接修改rax为我们的地址.其实我们可以利用堆栈进行保存.
原理: rax + jmp + push 进行恢复还原
push reg
mov reg,address
jmp reg
pop reg
reg代表的就是任意寄存器. 如果使用这个方法可以有效地保存寄存器进行HOOK.跳转回来的时候进行还原即可.
这里的硬编码不确定.因为 push reg 与 pop reg 跟你使用的寄存器有关.
4. 常用 jmp + rip方式跳转 大小6个字节
在64位程序中. 可以使用rip寄存器了. 而32位不可以.32位下想要改变 eip的值. 无非就是 jmp + call才可以改变.64位可以使用
原理: jmp + rip 进行寻址. 进行跳转
jmp qword ptr ds:[rip]
数据地址
这种方法就是 对rip + (指令长度)这个寄存器取内容 把里面的数据当做地址进行跳转. 所以当使用这个方式的时候.我们的下方跟着八个字节数据即可. 这个数据就是你要跳转的地址.
如下:

它会把下面八个字节数据当做地址进行跳转.
这时候有人说了.你这不是6字节跳转呀.下面要跟着8个字节. 所以这里说一下.
使用这种方法. 在rip的下面不一定要跟着就是数据. 我们可以修改偏移进行跳转.
什么意思. 现在我们是 jmp qword ptr ds:[rip] ,代表了我们要在当前rip的下方取8个字节当做地址跳转. 那么我们也可以写成 jmp qword ptr ds:[rip + x];
x就是任意数. 把这个偏移下的8个字节去内容当做地址去跳转.
关于偏移 计算公式其实还是一样. 目的地址 - 源地址 - 指令长度.
如下:

比如我们从第一条指令 进行偏移跳转. 把图中红框内容当做8个字节数据进行跳转.
那么可以写成如下:
目的地址(红框地址,0x7FFF12A51228) - 源地址(7FFF12A511Dd) - 指令长度(6)
指令长度为什么是6.因为我们第一行指令是 jmp qword ptr ds:[rip] 只不过我们现在还没写. 我们得出的偏移放到第一行中的偏移..
现在得出的偏移为 0x45 这个45我们就可以填写到偏移中.
现在 0x7FFF12A51228 红框地址是我们的数据.只需要在这里写入8个字节地址即可.
如下图:

如上图可以看到,第一个红框 FF 25 45 00 00 00 这个45就是我们算的偏移.
意思就是在 rip + 45位置,读取8个字节数据当做地址进行跳转. 然后 228地址我们写入了8个字节数据. 数据的地址 后缀为1EC的地址. 所以看上图,我们的RIP已经跳转过去了.
注意,因为 rip的寻址偏移只能是上下2GB 也就是你的偏移不要超过2G位置即可.
二丶Call的几种方式.
1. CALL PUSH + RET 方式
这种方式跟上方的push + ret原理类似.
call Next
Next:
push lowAddress;
mov [rsp + 4],highAddress
ret
这种方式就是取得下一行指令, 下一行指令入栈. 然后继续push + ret 进行跳转.
2.正常call
这种call 没有试过. 原理跟上面一样. 硬编码 E8 偏移 的方式调用
call youAddress
硬编码为: E8 XX XX XX XX xx代表偏移. 偏移计算公式还是 目的 - 源 - 5(指令长度)
但是是上下2GB
其他待整理
64位下的InlineHook的更多相关文章
- 64位下pwntools中dynELF函数的使用
这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn im ...
- win7(64)位下WinDbg64调试VMware10下的win7(32位)
win7(64)位下WinDbg64调试VMware10下的win7(32位) 一 Windbg32位还是64位的选择 参考文档<Windbg 32位版本和64位版本的选择> http:/ ...
- Ubuntu 14.04 AMD 64位 下 Android Studio 的安装
Ubuntu 14.04 AMD 64位 下 Android Studio 的安装 作者:yoyoyosiyu 邮箱:yoyoyosiyu@163.com 时间:2015年8月25日 Android ...
- 偶然碰到的Win7 64位下CHM 的问题解决
最近下了几个沪江资料,都是chm格式的,但是在win7 64位下,都显示不了里面的音频和视频flash之类的控件,虽然可以通过源文件的方式打开视频文件,但是很麻烦. 网上似乎碰到的人也不是很多, ...
- win7 64位下如何安装配置mysql-5.7.4-m14-winx64
win7 64位下如何安装配置mysql-5.7.4-m14-winx641. mysql-5.7.4-m14-winx64.zip下载 官方网站下载地址:http://dev.mysql.com/g ...
- 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )
64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...
- Linux 64位下一键安装scipy等科学计算环境
Linux 64位下一键安装scipy等科学计算环境 采用scipy.org的各种方法试过了,安装还是失败.找到了一键式安装包Anaconda,基本python要用到的库都齐了,而且还可以选择安装到其 ...
- centos 64位 下hadoop-2.7.2 下编译
centos 64位 下hadoop-2.7.2 下编译 由于机器安装的是centos 6.7 64位 系统 从hadoop中下载是32位 hadoop 依赖的的库是libhadoop.so 是3 ...
- Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持
Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持 GitHub - tensorflow/tensorflow: Computation using data flo ...
随机推荐
- vs2017专业版和企业版的密钥
Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH
- Delphi面向对象的编程思想
第一章.建立面向对象的新思维 1.1.1历史背景 目前对象技术的前沿课题包括设计模式.分布式对象系统.和基于网络的对象应用等 目前面向对象的语言包含4个基本的分支: 1.基于Smalltalk的:包括 ...
- Socker编程之UDP
一:socket简介 1. 不同电脑上的进程之间如何通信 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起! 在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的. ...
- 面向对象——组合、封装、访问限制机制、property内置装饰器
面向对象--组合.封装.访问限制机制.property 组合 什么是组合? 组合指的是一个对象中,包含另一个或多个对象 为什么要组合? 减少代码的冗余 怎么用组合? # 综合实现 # 父类 class ...
- AMD规范中模块id的命名规则
AMD 即 Asynchronous Module Definition, 中文是“ 异步模块定义”的意思. AMD 规范制定了定义模块的规则,这样模块和模块的依赖可以被异步加载. AMD 规范只定义 ...
- DataPipeline数据融合重磅功能丨一对多实时分发、批量读取模式
为能更好地服务用户,DataPipeline最新版本支持: 1. 一个数据源数据同时分发(实时或定时)到多个目的地: 2. 提升Hive的使用场景: 写入Hive目的地时,支持选择任意目标表字段作为 ...
- 一步一步实现kbmmw的httpsys使用https功能
kbmmw的httpsys的功能已经实现了好长时间,但是现在各个平台都要求使用https来提供服务. 今天一步一步来说一下如何使用kbmmw 的httpsys功能支持https. 首先为了获得证书,我 ...
- Oracle ERP 库存管理(业务流程 核心流程)
库存核心业务 库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务. ...
- MySQL 5.7数据库参数优化
连接相关参数 max_connections:允许客户端并发连接的最大数量,默认值是151,一般将该参数设置为500-2000max_connect_errors:如果客户端尝试连接的错误数量超过这个 ...
- JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...