64位下的InlineHook

目录

  • x64下手工HOOK的方法

    • 一丶HOOK的几种方法之远跳

      • 1. 远跳 不影响寄存器 + 15字节方法
      • 2.远跳 影响寄存器 + 12字节方法
      • 3.影响寄存器,恢复寄存器 进行跳转.
      • 4. 常用 jmp + rip方式跳转 大小6个字节
    • 二丶Call的几种方式.
      • 1. CALL PUSH + RET 方式
      • 2.正常call

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

其他待整理

原文地址:https://www.cnblogs.com/iBinary/p/11334793.html

时间: 2024-11-09 05:06:57

64位下的InlineHook的相关文章

window 7 64位下可运行的递归删除注册表程序

为了完成一个简单的注册表删除程序,由于我本身是win7 64位的OS,写了以下代码来递归删除注册表键值,程序代码如下: #include <tchar.h> #include <afx.h> #define KEY_WOW64_64KEY 256 long DeleteSubKeyTree(HKEY hKey, LPCTSTR lpSubKey) { LONG lResult; HKEY hSubKey; DWORD dwIndex, cbName; char szSubKey[5

ubuntu 64位下安装wps

首先,去官网下载wps.地址:http://community.wps.cn/download/ 然后切换到下载目录,执行如下命令: $ sudo apt-get install ia32-libs* 然后执行安装命令: $ sudo dpkg -i --force-architecture wps-office_8.1.0.3724~b1p2_i386.deb 会报如下错误: Selecting previously unselected package wps-office. (Readin

windows7旗舰版64位下安装、破解及运行QTP11报错

说明:如果你出现了以下几种情况,希望能解决你的问题:如果没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能成功安装 解决方法: 1.找到qtp安装包里面的vc++ 2005组件 QuickTest\CHS\prerequisites\vc2005_sp1_redist. 2.运行vcredist_x86.exe文件,如果安装失败,修改后缀名为压缩文件,如:zip.rar,解压文件后重新运行解压后的文件. 2.网上介绍用mgn-mqt82.exe的方法破解qtp11失败

关于VS2010帮助文档的使用和VC6.0在Win7 64位下的使用

由于购置了新的电脑,安装的是Win7 64位的操作系统,这两天我在重新安装编程环境的时候遇到一些问题,现在都解决掉了,分享出来以供需要的人参考. 一.以前使用的是VS2008,从VC6到2008这么多年了一只使用的MSDN是带索引的本地帮助,到了现在使用VS2010了,发现VS2010采用的是Web版形式的帮助. 并且也没有了索引.书签等非常的不习惯. 后来找到一个名字为:"h3viewer"的工具,在前提:已经安装了VS2010帮助文档的情况下.安装h3viewer,运行后界面如下:

64位下pwntools中dynELF函数的使用

这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn import * elf = ELF('./pwn_final') got_write = elf.got['write'] print 'got_write= ' + hex(got_write) call_get_name_func = 0x400966 print 'call_get_name_f

centOS 64位下编译hadoop2.4.1

1. 安装JDK a.      解压jdk [[email protected] software]$ tar -xvzf jdk-7u60-linux-x64.tar.gz b.      设置环境变量 PATH=$PATH:$HOME/bin export JAVA_HOME=/home/bigdata001/BigDataPlatform/jdk1.7.0_60 export JAVA_BIN=$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/li

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/get/Downloads/MySQL-5.6/mysql-5.6.17-winx64.zip 2.解压到D:\mysql.(路径自己指定)3.在D:\mysql\mysql-5.7.4-m14-winx64下新建my.ini配置文件 内容如下: ####################配置文件开始#

@清晰掉 各种类型32位与64位下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 位C数据类型 32和64位C语言内置数据类型,如下表所示: 上表中第一行的大写字母和数字含义如下所示:I表示:int类型L表示:long类型P表示:pointer指针类型32表示:32位系统64表示64位系统如:LP64表示,在64位系统下的long类型和pointer类型长度为64位.64位Li

Window7 64位下Nginx配置https

一.安装Nginx 官方下载地址:http://nginx.org/en/download.html 直接下载1.7.1.zip的链接:http://nginx.org/download/nginx-1.7.1.zip 二.安装Openssl 官方下载的没弄明白怎么用,不过还是留下链接以备之后使用:http://www.openssl.org/source/ 感觉比较好用的:链接:http://pan.baidu.com/s/1kT9OcPT 密码:zg6p 三.生成密钥 安装完成Openssl