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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试问题小结

说说你的项目,从里面学到啥了(随便说) CAS 线程池 的各个方面 线程咋创建(4种方式) 说一下聚集索引和非聚集索引 50w男 50w女 ,在B树中咋存储的(类似下面的图,变通一下就行了&a…

本是梦中人,常作花下客。心中自往来,知我有几个。

我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然, 其实是竭尽所能之后的不强求, 而非两手一摊的不作为。 一花凋零荒芜不了整个春天, 一次挫折也荒废不了整个人生。 多年后&#x…

近临算法(个人总结版)

背景 近邻算法(Nearest Neighbor Algorithm)是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出,经过几十年的发展和改进,已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则&#x…

通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求

目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码: 1.2.2、自定义文档目录(实现鼠标悬浮显示完整名称、用icon区分文件和文件夹) ①效果(直接效…

find 几招在 Linux 中高效地查找目录

1. 介绍 在 Linux 操作系统中,查找目录是一项常见的任务。无论是系统管理员还是普通用户,都可能需要查找特定的目录以执行各种操作,如导航文件系统、备份数据、删除文件等。Linux 提供了多种命令和工具来帮助我们在文件系统中快速找到目标目…

浅谈后端整合Springboot框架后操作基础配置

boot基础配置 现在不访问端口8080 可以吗 我们在默认启动的时候访问的是端口号8080 基于属性配置的 现在boot整合导致Tomcat服务器的配置文件没了 我们怎么去修改Tomcat服务器的配置信息呢 配置文件中的配置信息是很多很多的... 复制工程 保留工程的基础结构 抹掉原始…

朴素贝叶斯+SMSSpamCollections

1. 打开 Jupyter 后,在工作目录中,新建一个文件夹命名为 Test01 ,并且在文件夹中导入数据 集。在网页端界面点击 “upload” 按钮,在弹出的界面中选择要导入的数据集。然后数据集出现 在 jupyter 文件目录中,此时…

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString,std::string不行吗?那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗&#xff…

python:__class_getitem__使用以及cached_property源码分析

python:__class_getitem__使用以及cached_property源码分析 1 前言 Python中如何模拟泛型类型? 当使用类型标注时,使用 Python 的方括号标记来形参化一个 generic type 往往会很有用处。 例如,list[int] 这样的标注可以被用来表…

K8S集群再搭建

前述:总体是非常简单的,就是过程繁琐,不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…

wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网

WordPress,作为一款强大且灵活的开源内容管理系统,已成为许多网站开发者与运营者的首选。其强大的功能、丰富的插件以及易于上手的特点,使得无论是初学者还是专业开发者都能轻松构建出个性化的网站。然而,对于初学者来说&#xff…

JUnit5标记测试用例

使用场景: 通过Tag对用例分组: 环境分组:测试环境、预发布环境阶段分组:冒烟用例版本分组:V1.1、V1.2 Tag标记用例: 设置标签根据标签执行 结合Maven执行结合测试套件执行 设置标签: 通过T…

【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式

文章目录 推送模式本地文件持久化(拉模式)配置yml编写处理类添加配置演示 配置中心持久化(推模式)修改nacos在sentinel中生效引入依赖配置文件 修改sentinel在nacos中生效下载源码更改代码演示 总结 推送模式 Sentinel 规则的推送…

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后,再生成网表,导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中, 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日,2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题,以大模型应用为核心、以 AI 落地为导向,展示了火山引擎在大模型、云计算领域的实践应用,携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…

2024042102-array-list

数组 Array 一、前言 数组是数据结构还是数据类型? 数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数据,而…

js积累三(web页面一段时间未操作,退出登录)

//核心代码,已封装function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds,可自行修改时长var time_time maxTime;/* 鼠标点击事件 */$(document).mousedown(function(){time_time maxTime; //…

EI会议的最佳论文奖是什么?如何申请?

EI会议的最佳论文奖通常是指在EI(工程索引,Engineering Index)收录的学术会议中,评选出的表现最优秀的论文奖项。以下是关于该奖项的一些基本信息及申请步骤: 最佳论文奖的含义 评选标准:最佳论文奖通常基…

多线程、进程、线程五种状态、synchronized、volatile、Lock、CAS、死锁、ThreadLocal

1、并发编程 并发编程三要素 原子性:只一个操作要么全部成功,要么全部失败可见性:一个线程对共享变量的修改,其他线程能够立刻看到有序性:程序执行的顺序按照代码的先后顺序执行 synchronized,Lock解决原…

前端vue 动态加载ts文件,动态调用ts内的方法

业务场景: 在某个业务场景中, 我们需要在数据库配置ts文件路径,和需要调用的函数名称, 前端需要再指定的场景下,触发对应的函数, 并执行处理逻辑,返回结果. 实现: 这是一个数据库配置生成的动态表单 动态校验的例子, 需要引用动态的函数校验 任意一个js文件, common1.ts c…