unidbg 的 hook 和 patch 功能介绍¶
前言¶
本文用于介绍
unidbg中的hook和patch功能,在我们对app的调试中非常重要。本文主要介绍unidbg使用HookZz来实现hook功能,使用keystone来实现patch的功能。
1. 前提准备¶
前提准备也主要是配置 unidbg 的运行环境即可。
- unidbg 下载地址
java v11.0.13maven 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将上面的汇编代码转为机器码- 写入此数据,替换代码指令