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

2024-05-25 06:44

本文主要是介绍一种简单实用的ollvm反混淆的方案与源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我是一名从事反欺诈&风控&设备指纹相关的工作,最近对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 跳转

 

这篇关于一种简单实用的ollvm反混淆的方案与源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000762

相关文章

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应