[原创] 一种简单实用的ollvm反混淆的方案与源码
发表于:
2024-5-11 15:18
24251
[原创] 一种简单实用的ollvm反混淆的方案与源码
我是一名从事反欺诈&风控&设备指纹相关的工作,最近对ollvm的如何逆向的问题进行了学习与思考。 ollvm是一个开源免费的so混淆工具,对于逆向的小白来说简直是灾难性的存在。 这个例子是超简单,我想每个人都可以学会跟掌握,
我使用ollvm混淆了 libmyapplication4.so(附加),这个例子是针对test3()方法进行反混淆 ollvm的混淆打满
将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 跳转
SET
(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -sub"
)
SET
(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -sub"
)
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"
;
}
}
void test3(){
bool
a
=
false;
if
(!a){
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: