跳转至

unidbg 的 hook 和 patch 功能介绍

前言

本文用于介绍 unidbg 中的 hookpatch 功能,在我们对 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 文件中的代码如下:

image-20220518155148787

通过 unidbg 加载 so 并调用 so 中函数 的文章,可以很容易的来调用此 add 函数。

unidbg 调用 soadd 函数示例如下:

image-20220518160520498

可以 hook 这个 add 函数,同样是可以使用符号 hook 或地址 hook

使用 hookZz 的地址 hook,使用 ida 来查看目标函数的地址及是否为 armthumb 指令集,如下:

可以看出目标函数地址为:3DC,且为 thumb 指令集,地址调用需要加 1

image-20220518162416294

hook 主代码编写为:

在对应 hook 语句中输入 new ReplaceCallback 选择所有回调即可。

image-20220518162819888

unidbg 最终的 hookZz 代码示例为:

这里的 context 为寄存器,其中 postCall 方法中的 enablePostCallTrue 时才能执行其里面的逻辑。

context.getIntArg(2) 就是指取寄存器 R2 的值,即 jint a 参数的值。

image-20220518212209753

hookZz 代码逐行解释如下:
  1. 打印 jint ajint b 的值
  2. hook 修改寄存器 R3 的值为 5
  3. 固定写法
  4. hook 重写此地址(ox3DC)对应的函数返回值为 10
  5. 固定写法

3. patch 功能演示

  1. ida 中反编译后的结果与原代码中的几乎一摸一样

image-20220518215043509

对应的汇编代码为:

image-20220518220306522

如果把 038EADDS 相加改为相减:

使用 汇编指令和机器码在线转换工具 找到汇编指令对应的 thumb 指令:

image-20220518222405509

将地址 OX对应的内容改为 D01A

image-20220518222901265

patch 代码逐行解释如下:
  1. 读取 0x3E8 的内存地址,这里虽然是 thumb 指令集,但是不用加 1
  2. 写入的代码数据定义 byte 格式的 d01a
  3. 写入此数据,替换代码指令

2.Keystone 简单写法

image-20220518223641291

代码逐行解释如下:
  1. 第一步同样读取目标地址
  2. 设置 Keystonearm 架构的 thumb 模式
  3. 写汇编代码
  4. Keystone 将上面的汇编代码转为机器码
  5. 写入此数据,替换代码指令

评论

回到页面顶部