OLLVM环境搭建-Ubuntu20.04

OLLVM环境搭建-Ubuntu20.04

注:这里没有使用配置NDK环境

什么是混淆和OLLVM?

关于OLLVM介绍这里极力推荐直接看这个Deobfuscation: recovering an OLLVM-protected program

早在1997年,学术界就开始了代码混淆的研究。目前使用最广泛的混淆分类方式是Collberg于1997年针对JAVA程序的安全问题提出的。根据Collbreg的定义,混淆可以分为以下四种类型:布局混淆预防性混淆数据混淆控制混淆。布局混淆指删除或修改源代码中的对攻击者由于的信息,如变量名、调试信息等。显然,布局混淆在二进制代码混淆中可以忽略不计。预防性混淆指预先针对特定的反编译工具,解混淆方法进行防备。

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加逆向工程的难度。只不过Ollvm仅更新到llvm的4.0,2017年开始就没再更新。

Ollvm混淆主要分成三种模式,这三种模式主要是流程平坦化,指令替换,控制流伪造。
流程平坦化 :这个模式主要通过将if-else语句替换成do-while语句,然后通过switch语句来对流程的控制,这样就能模糊基本块之间的前后关系。
指令替换 :这个模式主要通过使用更复杂的指令序列来替换一些标准的二元运算符,从而增加逆向的难度。
控制流伪造 :这个模式主要是会在一个简单的运算中外包好几层if-else的判断,从而增加逆向的难度。
原理就是在不改变源代码的功能前提下,将C或C++代码中的if、while、for、do等控制语句转换成switch分支语句。这样做的好处是可以模糊switch中case代码块之间的关系,从而增加分析难度。具体做法是首先将要实现平坦化的方法分成多个基本块(就是case代码块)和一个入口块,为每个基本快编号,并让这些基本块都有共同的前驱模块和后继模块。前驱模块主要是进行基本块的分发,分发通过改变switch变量来实现。后继模块也可用于更新switch变量的值,并跳转到switch开始处。

环境搭建准备

Ubuntu20.04虚拟机、虚拟机中处理器数量为4个、运行内存4G,分配硬盘空间50g、CMake 3.16.6、g++/gcc为g+±9/gcc-9;顺手保存一个快照,感觉用Docker来编译OLLVM更方便!!!

更新一手

sudo apt update && sudo apt upgrade -y

1.换国内源
方法一:
软件和更新 -> ubuntu软件 -> 在下载自:框内选择 位于中国的服务器或者 手动选择国内源
方法二:
更改 source.list : 链接1
2.Ubuntu 扩容
Ubuntu虚拟机安装是默认为20G,如果未更改,则需要扩容,防止在交叉编译过程中出现空间不足(如果虚拟机关机后 扩展 选项为灰色 则需要删除快照)
方法见 链接2
3.(可选)查看 /dev/loop0至/dev/loopx(x=2、3、4…)占用率是否为100%

df -h

/dev/loopn这些设备在Linux下被称为回环设备。
如果为100%,则清理
清理方法:

sudo apt autoremove --purge snapd

再次查看磁盘使用情况:

df -h

4.(可选)清理
make clean #清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件
sudo apt autoclean #清理旧版本的软件缓存
sudo apt autoremove #删除系统不再使用的孤立软件

OLLVM环境搭建

主要参考下面两位大佬的来做的

  1. 跟着铁头干混淆2 ubuntu20.04编译ollvm
    链接3
  2. OLLVM环境搭建-编译x86指令集可执行程序-Ubuntu 20.04
    链接4

顺手更新一下

sudo apt update && sudo apt upgrade -y

1.gcc8 g++8 camke 安装
安装camke

sudo apt-get install cmake -y

安装 gcc8 g++8 降低版本
如果环境 gcc 和 g++的版本如果就是 8.x.x
这里就可以直接下一步了

gcc9 g++9 编译一定会失败,这时需要降低版本(这里真踩坑了)
安装gcc-8 g++8

sudo apt-get install gcc-8 g++-8 -y

安装完之后,配置一下优先级,方便调用gcc g++的时候,默认调用的是 gcc8 g++8
配置软件的优先级,可以根据需要去选择默认的版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9

**gcc切换版本 默认gcc 8 **

 sudo update-alternatives --config gcc  

在这里插入图片描述

g++切换版本 默认g++ 8

sudo update-alternatives --config gcc  

在这里插入图片描述

2.git LLVM源码
git源码时可能会出现超时或者网速很慢的情况,超时就多试几次,慢就耐心等待,直至完成

git clone -b llvm-4.0  https://github.com/obfuscator-llvm/obfuscator.git

如果没有git ,安装git

sudo apt install git

查看git 是否安装成功

git --version

需要对源码进行修改
ollvm目录/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h

690行char修改为uint8_t

690   Expected<std::vector<uint8_t>> readMem(char *Dst, JITTargetAddress Src,uint64_t Size) {// Check for an 'out-of-band' error, e.g. from an MM destructor.if (ExistingError)return std::move(ExistingError);return callB<ReadMem>(Src, Size);}

2.编译安装
该过程比较长,需要耐心等待
这里着重说明一下/特别强调一下,不要急着复制粘贴命令,先把 编译安装 这个看完,因为有两种方式:make install和sudo make install,然后自己看情况选择
make install是普通用户安装软件的命令,它会将软件安装到当前用户的目录下,而sudo make install则是使用root用户权限安装软件,它会将软件安装到系统的全局目录下,以便所有用户都可以使用。
在源码同级目录
这里着重说明一下/特别强调一下,不要急着复制粘贴命令,先把

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
make
sudo make install 

如果 make 过慢,可以ctrl+C 停止 ,然后

make clean 
make -j2 #亦可以make -j4 等加速编译

如果怕崩溃,建议直接make

如果直接 make install ,可能会出现

CMake Error at cmake_install.cmake:41 (file): file INSTALL cannot make direc

所以直接 sudo make install
sudo make install 之后就不用在bin目录下编译程序,如果怕冲突,可以在bin目录编译程序或者指定clang路径

在bin目录下应该这样编译程序

./clang -mllvm -fla test.c -o test1

将clang作为一个程序执行即可成功完成混淆

3.检验安装是否完成
如果安装完成了,赶紧建个快照吧,如果你还想回味一下过程,那就随意了

clang --version

4.检验ollvm是否可用
如果没有进行 sudo make install ,则需要在 bin 目录下编译源程序或者指定clang路径, 详见此链接
在桌面新建一个test文件夹,并新建文件test.cpp

mkdir test
cd test
touch test.cpp

打开test.cpp,键入或者粘贴测试代码:

#include <stdio.h>
#include <stdlib.h>int encryptFunc(int inputNum_1,int inputNum_2){int tmpNum_1 = 666, tmpNum_2 = 888, tmpNum_3 = 777;return tmpNum_1 ^ tmpNum_2 + tmpNum_3 * inputNum_1 - inputNum_2;
}int main(int argc,char *argv[]){int printNum = 55;if (argc > 1){printNum = encryptFunc(printNum, atoi(argv[1]));}else{printNum = encryptFunc(printNum, argc);}printf("Hello OLLVM %d\r\n", printNum);return 0;
}

然后进行混淆(控制流扁平化、指令替换、控制流伪造随便选一个)
(1)控制流扁平化

clang -mllvm -fla test.cpp -o test1

(2)指令替换

clang -mllvm -sub test.cpp -o test2

(3)控制流伪造

clang -mllvm -bcf test.cpp -o test3

这里选择控制流扁平化

混淆前:
混淆前
混淆后:
在这里插入图片描述

OLLVM基本用法

参考 链接4

控制流平坦化(Control Flow Flattening)
可用选项:

-mllvm -fla : 激活控制流平坦化
-mllvm -split : 激活基本块分割
-mllvm -split_num=3 : 指定基本块分割的数目

clang -mllvm -fla -mllvm -split -mllvm -split_num=3 test.cpp -o test_fla

在这里插入图片描述

虚假控制流(Bogus Control Flow)
可用选项:

-mllvm -bcf : 激活虚假控制流
-mllvm -bcf_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1
-mllvm -bcf_prob=40 : 每个基本块被混淆的概率,这里每个基本块被混淆的概率为40%,默认为 30 %

clang -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -bcf_prob=40 test.cpp -o test_bcf

在这里插入图片描述

指令替换(Instruction Substitution)
可用选项:

-mllvm -sub : 激活指令替代
-mllvm -sub_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1次

clang -mllvm -sub -mllvm -sub_loop=3 test.cpp -o test_sub

OLLVM去除

OLLVM的基本原理是添加分发器来控制流程的执行。针对这种混淆方式的还原也有了许多研究和工具,大致思路分为动态和静态两种:

  • 动态:通过Unicorn模拟执行的方式获取各真实块的关系
  • 静态:通过符号执行、中间语言分析等方式获取真实块之间的关系。
  • AI:Chatgpt,据说还行

静态方式进行OLLVM反混淆的工具,许多是依赖于Binary Ninja, IDA Pro等商业软件提供的中间语言API接口。

这里贴出反OLLVM的几个链接,仅供参考
(1)利用符号执行去除控制流平坦化
tx的这个delfat是基于python2的
(2)cq674350529的deflat from github
这个是基于SnowGirls的deflat,利用angr框架实现去除控制流平坦化,这个deflat用的相对较多,但是在使用过程中发现处理for的逻辑不太好。
(3)2022祥云杯CTF babyparser 这里使用模拟执行unicorn来去除OLLVM,作者也给了文章中的unicorn deflat,可作参考
(4)ARM64 OLLVM反混淆 基本思路就是文中提到的采用模拟执行的方式来寻找两个真实块的关系
(5)使用unidbg去ollvm虚假分支反混淆
(6)OLLVM控制流平坦化的改进
(7)使用unicorn engin还原Armariris字符串混淆
(8)吾爱破解2016安全挑战赛cm7 Android CrackMe 分析详解
(9)使用IDA microcode去除ollvm混淆(上)
(10)AndroidNativeEmu和unidbg对抗ollvm的字符串混淆
(11)antiOllvm

部分参考资料

[1]参考1 OLLVM混淆环境搭建详细教程
[2]参考2 在虚拟机上的Ubuntu20.04进行LLVM的编译安装
[3]参考3 基于二进制代码的代码混淆研究
[4]参考4 简单介绍vmp,ollvm
[5]参考5 利用ollvm进行代码混淆
[6]参考6 OLLVM代码混淆移植与使用
[7]参考7 OLLVM混淆学习(0)——环境搭建及混淆初体验

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

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

相关文章

Android音乐播放器的设计与实现

课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性33 2.4 可行性分析结论33 3 系统需求分析44 3.1 功能分析44 3.2 数据流程分析44 4 系统功能设计66 4.1 播放器…

A Survey on Multimodal Large Language Models

本文是LLM系列的文章之一&#xff0c;主要是讲解多模态的LLM。针对《A Survey on Multimodal Large Language Models》的翻译。 多模态大语言模型的综述 摘要1 引言2 概述3 方法3.1 多模态指令调整3.1.1 引言3.1.2 前言3.1.3 模态对齐3.1.4 数据3.1.5 模态桥接3.1.6 评估 3.2 …

云存储,为 AI 创新提速

当下&#xff0c;如火如荼的 AI 大模型对算力和数据存储提出了更高的要求。在 6 月 1 日结束的“阿里云峰会粤港澳大湾区”上&#xff0c;阿里云智能资深产品专家彭亚雄在 AI 新范式与商业创新论坛上做了《云存储&#xff0c;为 AI 创新提速》的主题分享。彭亚雄认为&#xff0…

聊聊 AI 平台存储方案和选型

最近火爆全网的 ChatGPT 再次带来一股 AI 热潮。 过去的五年&#xff0c;AI 快速发展并应用到很多领域中。作为一家存储企业&#xff0c;我们也感受到了 AI 行业的活力&#xff0c;和我们交流团队中&#xff0c;AI 企业越来越多&#xff0c;有自动驾驶、蛋白质结构预测、量化投…

详解 Redisson 分布式限流的实现原理

本文分享自华为云社区《详解 Redisson 分布式限流的实现原理》&#xff0c;作者&#xff1a; xindoo。 我们目前在工作中遇到一个性能问题&#xff0c;我们有个定时任务需要处理大量的数据&#xff0c;为了提升吞吐量&#xff0c;所以部署了很多台机器&#xff0c;但这个任务在…

AI日报|哈佛“AI教授”即将上线;首个生成式AI技能专业证书来了;电话推销员很烦?AI帮你“制裁”他

今日值得关注的人工智能新动态&#xff1a; 将GPT-4用在课程设计中 哈佛大学“AI教授”即将上线 微软推出首个生成式AI技能专业证书 纽约州议会&#xff1a;伤害或羞辱他人的deepfake是非法的 阿诺德施瓦辛格&#xff1a;《终结者》中的AI已成现实 AI诊断“老年痴呆”&…

甜品网站界面

最开始就是logo部分和导航栏部分 logo部分就是用的div里面写img然后给浮动就可以了 第二个是导航栏部分 用的也是无序标签 代码如下&#xff1a; 轮播图部分 没做出来效果 甜蜜约会品牌简介 红色框框以外的我用的是 div img 和 p标签做的 这些很简单 就不展示代码了 红色边…

教你简单学会用Python画长草颜团子

相信大家都知道可爱的长草颜团子&#xff0c;它应该在很多人的表情包中占有一席之地&#xff0c;那么就今天我们试着用Python的turtle模板来画一个长草颜团子吧&#xff01; 这么可爱的团子谁不想要试着自己画出来呢哈哈哈 源码如下&#xff1a; #8X_I import turtle as t t.…

鱼香肉丝(集锦)

1&#xff1a; 鱼香肉丝的简单制作 2 &#xff1a;鱼香肉丝的来历与制作 3&#xff1a; 鱼香肉丝制作 4&#xff1a;鱼香肉丝 1 鱼香肉丝的简单制作 作者&#xff1a; 时间&#xff1a; 2006-1-17 10:17:00 摘自&#xff1a;http://www.517sc.com/food/xyz/17_54_51330.html 材…

用 Python 画如此漂亮的插图 ,So easy

人生苦短&#xff0c;快学Python&#xff01; 今天我们进行一次实战案例分享&#xff0c;以全球预期寿命与人均 GPD数据为例&#xff0c;写一篇 Python 中漂亮散点图的快速指南。除了正常的数据清洗/处理、还会进行简单的统计分析&#xff0c;实现数据处理-统计分析-可视化一条…

做个合格的吃货~Python爬取全国火锅店,并利用地图可视化展示~

导语&#xff1a;天越来越冷啦~ 前段时间又刮起了入冬四件套&#xff08;烤红薯、热奶茶、糖炒栗子、糖霜山楂&#xff09;的热风~ 小编也紧跟着潮流下班兴冲冲的跑去买~&#xff08;附近店面的排队的人实在是太多了~风还大&#x1f637;&#x1f637;&#xff09; 一到手…

美食杰项目(七)菜谱大全

本文目录 前言&#xff1a;1.具体样式2.实现的具体功能和代码思路3.element ui具体样式的网址4.相关代码5.总结&#xff1a; 前言&#xff1a; 本文给大家讲的是美食杰项目中菜谱大全项目的具体样式&#xff0c;代码思路和具体代码&#xff0c;希望能帮助到你 1.具体样式 2.实…

鱼香肉丝里到底有没有鱼?

鱼香肉丝&#xff0c;算是我最爱的一道菜了&#xff0c;无论饭店大小&#xff0c;他都是我首先就要找的菜&#xff0c;可谓痴迷&#xff0c;但是鱼香肉丝里到底有没有鱼&#xff1f;这是个千古之谜&#xff0c;这篇来自三个料理人的文章《千古之谜&#xff0c;鱼香肉丝里到底有…

Python爬虫:简单爬取粤菜菜谱

项目场景&#xff1a; 简单爬取粤菜菜谱。 实现思路&#xff1a; 访问主页&#xff0c;获取每个菜品的菜名、图片、详情页面网址。 访问上一步中获得的所有详情页面&#xff0c;获取工艺、口味、时间、主料、辅料信息。 清洗所获得的数据。 保存至本地文件。 实现过程&a…

文心一言的魔性作图,我头都笑掉了...

这几天看到网友们用文心一言作的图&#xff0c;看了后我都愣住了。。。 AI 作画 -- 三得利乌龙茶 AI 作画 -- 娃娃菜 AI 作画 -- 车水马龙 AI 作画 -- 驴肉2火烧 AI 作画 -- 唐伯虎点秋香 AI 作画 -- 鱼香肉丝 AI 作画 -- 胸有成竹 AI 作画 -- 夫妻肺片 AI 作画 -- 红烧狮子头 …

使用chrome浏览器插件postman模拟post、get请求

使用chrome浏览器插件postman模拟post、get请求 postman为chrome浏览器的一个插件&#xff0c;用来模拟post请求&#xff0c;get请求等。可以在chrome浏览器里安装插件&#xff08;前提是你得访问了Google应用商店&#xff09;。 如果不能访问Google&#xff0c;那个下载一个p…

chrome浏览器无法开启同步功能 request cancel

找了很多亲测最新100版本可用&#xff01;&#xff01;&#xff01; 步骤 1、从下面链接提取google插件【Chrome-Sync-Helper】 链接: https://pan.baidu.com/s/1FTxrQ-IRjRmYdW5HcNateA 提取码: htga &#xff08;如链接失效&#xff0c;请留言反馈&#xff01;&#xff09; …

Chrome 添加【微信 / QQ】内置浏览器(解决 “请在微信客户端打开链接” 提示)

前言 有些链接&#xff0c;是需要在微信客户端内才能打开的&#xff0c;那么想在 PC 端的浏览器上打开&#xff0c;怎么办呢&#xff1f; UA 不明白的话先不用管&#xff0c;继续往下看。 【安卓QQ内置浏览器UA】 Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V…

chrome浏览器控制台发送post请求

谷歌浏览器&#xff0c;点击F12&#xff0c;在控制台中输入下面代码&#xff0c;直接回车即可&#xff1a;&#xff08;需要修改一下Admin-Token的值即可&#xff09; 设置访问的Controller路径&#xff0c;“http://127.0.0.1:8090/api/dwStandard/superUploadBigFile” met…

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

大家好&#xff0c;我是老赵! 一、概述 当我们想提供可靠的 API 接口&#xff0c;对参数的校验&#xff0c;以保证最终数据入库的正确性&#xff0c;是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数&#xff0c;写了一大堆的 if else 进行校验&…