跳转至

unidbg 补环境 — (unidbg 模拟与 java 交互)

1. 前提准备:

本文前需要以下准备:

本文演示的是 unidbg 调用简单的 md5 方法,但是 so 中的函数又调用了 java 层的某些函数,即 sojava 层有交互,就需要我们来补这些环境以正常执行出结果。

2. 补环境步骤

2.1. 使用 unidbg 初始化

手动补环境的方式:

先整体 extends AbstractJni,然后 vm.setJni(this)。这个步骤和创建 createDalvikVM(new File("apk 路径")) 时,unidbg 会提前做很多事情,也会做一些通用的处理:env 调用函数的声明,具体如下:

image-20220517223448042

2.2. unidbg 调用 so 方法

unidbg 调用含与 java 层交互的 so 方法

java 层函数如下:

image-20220517230637981

image-20220517231339288

native 层调用 java 层函数的方式:

这里面的代码不再解释,每段代码对应上图 java 层函数的一句。代码看着确实很罗嗦。

image-20220517230836649

unidbg 中就需要调用 so 中的 md52 方法:

image-20220517232028149

运行会报错:

image-20220514155410258

2.3. 手补环境

手动补环境的方式:

快捷键 ctrl + o 或者鼠标右键选择 Generate -> Override Methods 或者直接输入 @over 回车即可,然后找对应的带 signature 的方法即可。

上图报错的原因为:缺少 MessageDigest 对象的 update 方法,重写报错日志中的 callVoidMethodV 方法。

解决:

image-20220514155521347

步骤解释:

  • 捕获具体报错
  • 拿到 dvmObject 对象,即是缺失的 MessageDigest 的对象
  • 拿到 vaList 中的参数
  • 将参数转成正常格式
  • 调用缺失的 MessageDigest 的 update 函数

再运行报错:

缺少 MessageDigest 对象的 digest 方法,重写报错日志中的 callObjectMethodV 方法。

image-20220514160235180

解决:

image-20220514161046931

步骤解释:

  • 捕获具体报错
  • 拿到 dvmObject 对象,即是缺失的 MessageDigest 的对象
  • 调用缺失的 MessageDigest 的 digest 函数
  • 但不能直接返回上步骤的结果,它不是基本的数据类型,包装类型需要将 digest 添加到 LocalObject 中才能返回

再运行报错:

image-20220514161208450

缺少 MainActivity 对象的 byte2hex 方法,重写报错日志中的 callObjectMethodV 方法。

解决:

image-20220514161623513

报错中调用了 java 层的方法:

image-20220514161821712

步骤解释:

  • 捕获具体报错
  • 获取 vaList 中的参数信息
  • 将参数转成正常格式
  • 调用 byte2Hex 函数
  • 同样,上步运行结果不能直接返回,需要转成 StringObject 并添加到 LocalObject 中后才能返回。

到此,则补完所有需要的环境了。

3. 测试结果

将补完环境后运行的结果与真是 app 运行结果比对,一致则正常,这里不再截图了。

评论

回到页面顶部