unidbg 补环境 — (unidbg 模拟与 java 交互)¶
1. 前提准备:¶
本文前需要以下准备:
jadx
: 主要用于查看目标app
的native
的部分,也可不用ida
: 用于分析目标app
的so
文件idea
: 用于编写和调试unidbg
脚本jdk
: 环境需要- 肉丝 unidbg 知乎教程系列
- unidbg 官方文档
- unidbg github 地址
本文演示的是 unidbg
调用简单的 md5
方法,但是 so
中的函数又调用了 java
层的某些函数,即 so
与 java
层有交互,就需要我们来补这些环境以正常执行出结果。
2. 补环境步骤¶
2.1. 使用 unidbg 初始化¶
手动补环境的方式:
先整体 extends AbstractJni
,然后 vm.setJni(this)
。这个步骤和创建 createDalvikVM(new File("apk 路径"))
时,unidbg
会提前做很多事情,也会做一些通用的处理:env
调用函数的声明,具体如下:
2.2. unidbg 调用 so 方法¶
即 unidbg
调用含与 java
层交互的 so
方法
java 层函数如下:
native
层调用java
层函数的方式:
这里面的代码不再解释,每段代码对应上图 java
层函数的一句。代码看着确实很罗嗦。
则
unidbg
中就需要调用so
中的md52
方法:
运行会报错:
2.3. 手补环境¶
手动补环境的方式:
快捷键 ctrl + o
或者鼠标右键选择 Generate -> Override Methods
或者直接输入 @over
回车即可,然后找对应的带 signature
的方法即可。
上图报错的原因为:缺少 MessageDigest
对象的 update
方法,重写报错日志中的 callVoidMethodV
方法。
解决:
步骤解释:
- 捕获具体报错
- 拿到 dvmObject 对象,即是缺失的 MessageDigest 的对象
- 拿到 vaList 中的参数
- 将参数转成正常格式
- 调用缺失的 MessageDigest 的 update 函数
再运行报错:
缺少 MessageDigest
对象的 digest
方法,重写报错日志中的 callObjectMethodV
方法。
解决:
步骤解释:
- 捕获具体报错
- 拿到 dvmObject 对象,即是缺失的 MessageDigest 的对象
- 调用缺失的 MessageDigest 的 digest 函数
- 但不能直接返回上步骤的结果,它不是基本的数据类型,包装类型需要将 digest 添加到 LocalObject 中才能返回
再运行报错:
缺少 MainActivity
对象的 byte2hex
方法,重写报错日志中的 callObjectMethodV
方法。
解决:
报错中调用了 java
层的方法:
步骤解释:
- 捕获具体报错
- 获取 vaList 中的参数信息
- 将参数转成正常格式
- 调用 byte2Hex 函数
- 同样,上步运行结果不能直接返回,需要转成 StringObject 并添加到 LocalObject 中后才能返回。
到此,则补完所有需要的环境了。
3. 测试结果¶
将补完环境后运行的结果与真是 app
运行结果比对,一致则正常,这里不再截图了。