首页
社区
课程
招聘
[原创]记一次基于unidbg模拟执行的去除ollvm混淆
发表于: 2023-5-3 23:00 68576

[原创]记一次基于unidbg模拟执行的去除ollvm混淆

2023-5-3 23:00
68576
收藏
免费 77
支持
分享
最新回复 (64)
雪    币: 1371
活跃值: (2259)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
51
太棒了,非常感谢分享!
2024-6-20 16:04
0
雪    币: 1371
活跃值: (2259)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
52
qdesy 请问reorderblock()函数中最后的这段代码里,toend和0x5E674L都是怎么得到的。toend被硬编码成private static final long toend = 0x5E6B ...

2.获取索引值顺序中的第一个值,找到对应的真实块。将主分发器处patch为跳转向第一个真实块的跳转指令。 



3.根据真实块结束时的新的索引值,寻找到对应的真实块,将结尾处patch为跳转到下一个真实块


【这里应该有两个真实块:True真实块、False真实块, 所以通过控制前面的 

来控制分支走向。


假设认为W8 == 1 是走的【False真实块】分支


 当修改程序走向来说时(更改W8的值为1),带有ret的最后一个真实块的起始地址为0x5E77C,其前一个真实块地址是0x5E6BC


那么需要将结尾处patch为跳转到下一个真实块

即直接跳转到带有ret的真实块(不经过主分发器了)


——————————————————————

同理W8 == 0的【真实块分支】,也是如此。

最后于 2024-6-20 16:32 被教教我吧~编辑 ,原因:
2024-6-20 16:27
0
雪    币: 1371
活跃值: (2259)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
53
New对象处 按照我说的,加入造成死循环,那么就按照楼主说的,标志当前位置,下次调用procBr时就patch,退出
我是每次搞掉一个BR X9就生成一个so,这样可以防止死循环吧
2024-6-20 16:35
0
雪    币: 797
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
54
mark,向大佬学习
2024-6-22 10:13
0
雪    币: 1602
活跃值: (4198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
赞,感谢分享!
2024-7-5 14:25
0
雪    币: 1602
活跃值: (4198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
感谢分享
2024-7-11 18:03
0
雪    币: 287
活跃值: (688)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
57
在执行 vm.loadLibrary(new File("libc.so"),false);   的时候,
Exception in thread "main" java.lang.ArithmeticException: / by zero
       at net.fornwall.jelf.ElfDynamicStructure.<init>(ElfDynamicStructure.java:321)

int num_entries = pltRelSize / relEntrySize; 这行代码relEntrySize为0引发了异常
2024-7-15 16:30
0
雪    币: 4061
活跃值: (6168)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
58
dkxzl 在执行 vm.loadLibrary(new File("libc.so"),false); 的时候, Exception in thread "main" ...
这个手动把relEntrySize赋值为0x18
2024-7-15 21:56
0
雪    币: 227
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
59
heyonly 感谢大佬的分享,在还原平坦化的时候,代码中的tbs.add(new TrueBlock(0x6e142ec8L,0x5E6B0)); 这个 0x5E6B0,不知道怎么来的,要是上传在分析时的样本就好了 ...
大哥,这个值哪来的能教下吗
2024-11-8 11:08
0
雪    币: 29
活跃值: (1385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
60
感谢分享
2025-3-27 20:18
0
雪    币: 2698
活跃值: (2732)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
61
大佬请问有修改后的文件和so案例学习一下吗
2025-3-31 21:56
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
62
加载so提示这个要怎么搞呢,Exception in thread "main" java.lang.ArithmeticException: / by zero
       at net.fornwall.jelf.ElfDynamicStructure.<init>(ElfDynamicStructure.java:321)
       at net.fornwall.jelf.ElfSegment$3.computeValue(ElfSegment.java:153)
       at net.fornwall.jelf.ElfSegment$3.computeValue(ElfSegment.java:150)
       at net.fornwall.jelf.MemoizedObject.getValue(MemoizedObject.java:21)
       at net.fornwall.jelf.ElfSegment.getDynamicStructure(ElfSegment.java:255)
       at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:434)
       at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:477)
       at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:175)
       at com.github.unidbg.linux.AndroidElfLoader.loadInternal(AndroidElfLoader.java:63)
       at com.github.unidbg.spi.AbstractLoader.load(AbstractLoader.java:237)
       at com.github.unidbg.linux.android.dvm.BaseVM.loadLibrary(BaseVM.java:333)
       at com.test.test2.AntiOllvm.<init>(AntiOllvm.java:71)
       at com.test.test2.AntiOllvm.main(AntiOllvm.java:112)
2025-4-24 16:47
0
雪    币: 71
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
63
牛逼666
2025-6-20 09:18
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
64
大佬请问下直接拿代码来跑libtprt.so文件加载系统库那里就异常了,去掉的话就跑到jni_onlad函数的时候返回非法版本-1,这个主要是什么原因呀,希望可以解答下疑惑
2025-11-17 23:52
0
雪    币: 246
活跃值: (406)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
65

刚才整理笔记,发现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天前 被土豆爱学习编辑 ,原因:
5天前
0
游客
登录 | 注册 方可回帖
返回