首页
社区
课程
招聘
[原创] 一种简单实用的ollvm反混淆的方案与源码
2024-5-11 15:18 21772

[原创] 一种简单实用的ollvm反混淆的方案与源码

2024-5-11 15:18
21772

我是一名从事反欺诈&风控&设备指纹相关的工作,最近对ollvm的如何逆向的问题进行了学习与思考。
ollvm是一个开源免费的so混淆工具,对于逆向的小白来说简直是灾难性的存在。
这个例子是超简单,我想每个人都可以学会跟掌握,

先上案例看看效果

我使用ollvm混淆了
libmyapplication4.so(附加),这个例子是针对test3()方法进行反混淆
ollvm的混淆打满

1
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -bcf -mllvm -bcf_loop=3 -mllvm  -sub")
1
2
3
4
5
6
7
8
9
10
11
void test3(){
    bool a= false;
    if(!a){
        std::string hello1 = "Hello from C++1";
    }
    __android_log_print(ANDROID_LOG_VERBOSE,"sanbalog","testlog %s","abc");
    bool b= false;
    if(!b){
        std::string hello1 = "Hello from C++b";
    }
}

将libmyapplication4.so拖进ida,ida方法中搜索test3

ollvm混淆后的流程图如下

对应的按F5 返混淆的结果如下,代码没法看,总共两百多行

使用基于unidbg开发的反ollvm 反混淆后的流程图如下:

按F5反汇编代码如下:

相关的unidbg代码在附件中,放到开源的unidbg中运行即可。接下来我讲讲原理吧。

原理篇

首先讲讲网上开源的跟一些前辈的处理方案,网上的处理方案比较复杂,大体流程如下:
1 收集代码块,这个代码块包含cesl指令向左还有向右收集一遍,收集代码块可以使用unidbg,hook代码块并对应执行对应方法,从而将代码块集合收集到
2 利用ollvm虚假代码块的特征将虚假代码块进行过滤,
3 将真实的代码块串联起来。写入so

我也跟着做了一遍,发现第1步非常容易出错,一旦出错某些代码块就没有执行到,得到的结果是代码出现丢失。那么脚本的兼容性就很难。
第2步,网上的前辈针对虚假代码块过滤也是写了一大堆代码,想理解起来也是比较麻烦,而且效果也不佳。
针对以上问题,让问题变得更简单兼容性更好,我的改进如下:
1 我直接执行一遍,将所有的代码块收集起来,不管它cesl指令。这里有个非常关键的地方是,真实的代码块只会执行一遍,如果如果代码块集合中已经存在,则不要添加进去,否则导致的结果是代码丢失
2 根本不需要对虚拟代码块进行过滤,反混淆后,我们将真实执行的代码块串联了起来,它们在F5逆向之后,并不会产生干扰代码。其实最终的目的不就是为了看源码吗
最后如何将代码块串起来可能很多初学者无法理解。其实原理很简单
将收集的代码块进行迭代,取当前的代码块最后一条指令地址,取下个代码块首个指令地址,算出跳转过去要跳几个自己,源码中有,然后将当前代码块的最后一条执行改为B 跳转


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

上传的附件:
收藏
免费 3
打赏
分享
最新回复 (7)
雪    币: 22
活跃值: (3960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
New对象处 2024-5-11 15:26
2
0
有没有发现,你两个if不对劲了
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
xiaoxiaojing 2024-5-11 17:02
3
0
    public static long startaddresstag= 0x10DBC;
    public static long endaddresstag= 0x1167C;
    public static int whileaddresstag = 0x11678;  源码中的三个输入,第一个是要反混淆的起始地址,第二个是结束地址,第三个地址是ollvm混淆后,最低的那个块的B跳转指令所在的地址,目的是把这个B nop调,这样就移除了它的循环
雪    币: 2190
活跃值: (3958)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
method 2024-5-11 18:28
4
0
谁说真实块 只走一遍的 你这代码遇到循环不就遭重了吗
雪    币: 1979
活跃值: (9627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2024-5-13 09:19
5
0
我好奇,如果有很多花指令,这个还能正常还原嘛,萌新被这个东西卡得死死,根本没机会f5,还有加壳的so
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
xiaoxiaojing 2024-5-13 09:50
6
0
你瞒我瞒 我好奇,如果有很多花指令,这个还能正常还原嘛[em_5],萌新被这个东西卡得死死,根本没机会f5,还有加壳的so
看我另一篇文章https://bbs.kanxue.com/thread-281748.htm
雪    币: 1719
活跃值: (920)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wx_Dispa1r 2024-5-16 11:37
7
0
。。。冷饭嗯炒,放1819年还乐意看一下
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
SkyerHw 2024-5-16 16:38
8
0
写的很好,以后别发了,浪费资源
游客
登录 | 注册 方可回帖
返回