好久没用过unidbg了, 捡起来试试…
0x0 前言
分析过程中发现部分函数无法F5, 读了下指令发现间接跳转, IDA没法解析, 遂搜了一波, 参考了佬的文章解决了
0x1 间接跳转结构
从图中结构来看间接跳转的实现为
- 第一部分通过一些位移和亦或运算得出2个数组的下标值放在两个寄存器里(这里是w8和w10), 通过一个条件判断使用哪个下标
off_4C30D0
是地址数组列表, 并且是固定的, 通过*(baseAryAddr+index)的方式取地址给寄存器, 并通过br reg的方式跳转
0x2 去除间接跳转方案
既然知道间接跳转是通过取数组内容的方式实现的, 那么要做的是
- 拿到条件跳转的具体条件
- 拿到数组下标, 通过固定数组地址+下标的方式拿到要跳转的两个地址
- 覆盖跳转位置, 写一条条件跳转, 写一条绝对跳转, 这样IDA的F5就可以识别了
1 | // 133b04:csel w8, w8, w10, eq |
0x3 Unidbg实现去除
总体实现思路如下
- 模拟执行中保存每条指令和寄存器环境入栈
- 遇到br reg指令, 回溯找到
LDR reg0, [reg1,reg2,UXTW#3]
指令, 取数组首地址 - 再回溯找到
CSEL reg0, reg0, reg1, COND
指令, 取跳转条件和两个数组下标值 - 通过数组首地址+下标的方式取出两个要跳转的地址, 把br reg的位置及上一条修改成要跳转位置
算了
talk is cheap, show the code
1 | package com.mario; |
0x4 处理完的效果
处理前
处理后
参考
感谢大佬文章, 去除思路及代码基本借鉴该文章.
直达连接