首页
社区
课程
招聘
[讨论]unidbg模拟执行的去除ollvm混淆
发表于: 2025-1-22 13:54 4180

[讨论]unidbg模拟执行的去除ollvm混淆

2025-1-22 13:54
4180

0.前言

本文是对 https://bbs.kanxue.com/thread-277086.htm 帖子中去ollvm混淆的实践记录

1.实践

ida 看so是被混淆了
图片描述
然后用unidbg 模拟执行代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public wvvvuwwu() {
    emulator = AndroidEmulatorBuilder  .for64Bit()  .build();
    Memory memory = emulator.getMemory();
    memory.setLibraryResolver(new AndroidResolver(23));
    //创建DalvikVM,利用apk本身,可以为null
    //如果用apk文件加载so的话,会自动处理签名方面的jni,具体可看AbstractJni,这就是利用apk加载的好处
    vm = emulator.createDalvikVM(new File("unidbg-android/src/test/resources/example_binaries/mi.apk"));
    vm.setJni(this);
    vm.setVerbose(true);
    DalvikModule dm = vm.loadLibrary("shpssdk", true);
    module = dm.getModule();
 
    cWvvvuwwu = vm.resolveClass("com/shopee/shpssdk/wvvvuwwu");
    wvvvuvvv = vm.resolveClass("com/shopee/shpssdk/wvvvuvvv");
    processFlt(module.base + 0x22F694, module.base + 0x23001C);
   // processFlt(module.base + 0x230020, module.base + 0x231148);
    dm.callJNI_OnLoad(emulator);
    System.out.println("");
}

跟作者的区别就是第二个参数需要设置成true,执行init去解密,要不然后面的步骤都会失败
DalvikModule dm = vm.loadLibrary("shpssdk", true);

跑完就能看到jni_onload执行了
图片描述

接下来就是去混淆代码了,主要逻辑就是找到真实代码块,先找有辨识度的函数确定是真实块然后看他是怎么执行过来的
图片描述
这个真实块是0x230020
图片描述
对应汇编是比较w8的值然后beq,然后我们就可以unidbg中 判断对应代码是不是真实块,其中两个寄存器要相等
图片描述

找完真实块就要找分支块,分支快是调用CSEL W8 跳到分发器的地方
图片描述
看汇编他是最后把w9给到了w8,然后再分发器的时候用w8的值和w24比较,所以unidebg代码是
图片描述

真实块和分支快都找到以后,最后一步把主分发器的地方打patch直接跳转到第一个真实块就ok了
图片描述

最后真实效果是这样
图片描述

根据 乐子人 大佬教程就能完整去除ollvm了。感谢大佬提供的思路和开源代码


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2025-1-22 14:48 被skyun编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 3
活跃值: (711)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-1-23 10:27
0
雪    币: 1449
活跃值: (2716)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大佬给个完整代码呀~
2025-5-5 18:26
0
游客
登录 | 注册 方可回帖
返回