刚才整理笔记,发现2024年实践过这篇文章,文章有一些坑,这里贴一下方便后面的同学学习!
文章 217K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4g2A6L8%4m8Q4y4h3k6#2K9h3!0H3i4K6g2X3N6h3W2G2M7q4)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3x3e0x3H3z5o6R3%4x3e0x3H3 是此文章的详细实践版
但是也有坑点,用androistudio失败,用IntelliJ IDEA并且itellij IDEA自带的maven失败
需要指定版本的,最终
vmware
win10
IntelliJ IDEA
maven3.8.8
unidbg-master 2024-01-31版本成功
代码里面的so文件加载失败
我使用android9_r46和unidbg自带的so文件都失败
去安卓官网下和师傅一样的android8 sdk26
b5aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5c8X3&6W2P5s2g2K6i4K6u0r3K9h3#2S2k6$3g2K6
随便找一个Pixel设备的 如8.0.0 (OPR3.170623.013, Nov 2017)
7a2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8q4)9J5k6h3N6G2L8$3N6D9k6g2)9J5k6h3y4G2L8g2)9J5c8X3c8D9i4K6u0r3j5h3&6V1M7X3!0A6k6q4)9J5c8X3q4G2M7%4m8Q4x3V1k6K6j5h3W2D9k6X3W2K6K9q4)9J5k6r3!0H3M7U0y4Q4x3X3f1I4y4K6l9$3x3U0y4Q4x3X3f1H3x3e0y4Q4x3X3c8X3j5h3y4@1L8%4u0&6i4K6u0V1j5X3c8U0y4o6W2T1y4o6m8Q4x3X3g2*7K9i4l9`.
然后解压得到那些so
坑点1:师傅的hook jni_onload指令logIns()没有日志**
解决1:logIns()要写在在callJniOnload()后面,继续修改师傅代码得到
AntiOllvmMy_2024.java,让其可以运行最终得到 libtprt_2024.so
坑点2:f5文件*_1.so发现4个JUMPOUT**
解决2:因为模拟执行时候没有走这4个分支导致,我们强行让其运行
if(instructions.peek().getAddr() - module.base == 0x5E5AC)
{
emulator.getBackend().reg_write(Arm64Const.UC_ARM64_REG_W8,1);
}强行修改后jni_onload返回-1导致unidbg出错,把BaseVM.java出错的地方,注释掉即可,可以改成输出日志,
这样处理后生成文件*_12.so,注意这次输入文件是*_1.so,而不是*_ori.so,这样就解决掉一个JUMPOUT。
坑点3:发现上面解决掉的JUMPOUT不是指定的**
解决:文章写错了,W11=0x6E221A17,W12=0x6E142EC8
如果上面一条指令w8等于0,那么W8=W11>W12,下面会执行B loc_5E678
如果W8不等于0,那么W8=W12,依然会执行B loc_5E678,
b.lt是小于才会跳转,无论W8等于W11还是W12始终无非是进入B.LT loc_5E5CC
师傅修改0x5E5AC处W8为1,也不能让进入B.LT loc_5E5CC分支!
同理最终得到libtprt_2024_2.so,按F5可以看见没有JUMPOUT了
上面处理完毕,发现还有控制流平坦
坑点4:去除控制流平坦化办法缺乏普遍性
这里很多硬编码的值,这些值是师傅肉眼看了,不是自动识别的,先知道运行的流程了,然后写上去的,
知道答案然后再反过来硬编码。
最后于 5天前
被土豆爱学习编辑
,原因: