unidbg 的 hook 和 patch 功能介绍¶
前言¶
本文用于介绍
unidbg
中的hook
和patch
功能,在我们对app
的调试中非常重要。本文主要介绍unidbg
使用HookZz
来实现hook
功能,使用keystone
来实现patch
的功能。
1. 前提准备¶
前提准备也主要是配置 unidbg
的运行环境即可。
- unidbg 下载地址
java v11.0.13
maven v3.8.4
- 安装
idea
ida pro
- 汇编指令和机器码在线转换工具:
https://armconverter.com/
或https://shell-storm.org/online/Online-Assembler-and-Disassembler/
2. hook 功能演示¶
hook
和后面的 patch
都是来对 add
的简单方法上生效。
安卓
java
层中cpp
文件中的代码如下:
通过 unidbg 加载 so 并调用 so 中函数 的文章,可以很容易的来调用此 add
函数。
unidbg
调用so
中add
函数示例如下:
可以 hook
这个 add
函数,同样是可以使用符号 hook
或地址 hook
使用 hookZz
的地址 hook
,使用 ida
来查看目标函数的地址及是否为 arm
或 thumb
指令集,如下:
可以看出目标函数地址为:3DC
,且为 thumb
指令集,地址调用需要加 1
hook
主代码编写为:
在对应 hook
语句中输入 new ReplaceCallback
选择所有回调即可。
则 unidbg
最终的 hookZz
代码示例为:
这里的 context
为寄存器,其中 postCall
方法中的 enablePostCall
为 True
时才能执行其里面的逻辑。
context.getIntArg(2)
就是指取寄存器 R2
的值,即 jint a
参数的值。
hookZz
代码逐行解释如下:
- 打印
jint a
和jint b
的值 hook
修改寄存器R3
的值为 5- 固定写法
hook
重写此地址(ox3DC
)对应的函数返回值为 10- 固定写法
3. patch 功能演示¶
ida
中反编译后的结果与原代码中的几乎一摸一样
对应的汇编代码为:
如果把 038E
的 ADDS
相加改为相减:
使用 汇编指令和机器码在线转换工具 找到汇编指令对应的 thumb
指令:
将地址 OX
对应的内容改为 D01A
patch
代码逐行解释如下:
- 读取
0x3E8
的内存地址,这里虽然是thumb
指令集,但是不用加 1 - 写入的代码数据定义
byte
格式的d0
和1a
- 写入此数据,替换代码指令
2.Keystone
简单写法
代码逐行解释如下:
- 第一步同样读取目标地址
- 设置
Keystone
的arm
架构的thumb
模式 - 写汇编代码
Keystone
将上面的汇编代码转为机器码- 写入此数据,替换代码指令