一种简单实用的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

相关文章

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja