LLVM中期报告

1.主要开展的工作

研究对LLVM IR层面进行代码混淆,分析IR的指令 ,并且实现混淆
从LLVM代码混淆的角度出发,函数之间的正常调用构成了待混淆程序的原始控制流,不同的基础代码块构成了一个个的函数,每个基础代码块又是由一条一条程序语句构成的,每条程序语句可以看做是一条指令。这些细节可以帮助理解算法并实现代码混淆,基于LLVM的代码混淆就是通过对函数、代码块、程序语句和指令的处理,来混淆程序的控制流、数据流和逻辑等

2.研究成果

2.1实验环境的搭建
操作系统 Ubuntu 20.04.6
编译器版本 Obfuscator-LLVM 4.0.1
前端 Clang、clang++、others
编程语言 C、C++
目标平台 x86_64-unknown-linux-gnu
安装LLVM的方式有很多,可以从官方上下载预编译好的包,也可以用源码进行编译。这里我们用源码进行编译,版本是4.0.1的版本
我们使用如下命令进行了构建:
$cd llvm-project
$mkdir build && cd build
$cmake -G “Unix Makefiles” -DLLVM_ENABLE_PROJECTS=“clang” -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=“X86” -DBUILD_SHARED_LIBS=On …/llvm
$make

-G 指定为 Unix Makefiles
使用 DCMAKE_BUILD_TYPE 选项指定编译的版本为 Release,一共有四种模式可选,分别为Debug, Release, RelWithDebInfo和MinSizeRel。使用 Release 可以节省空间,省略调试信息。
DLLVM_TARGETS_TO_BUILD 指定目标平台的架构。
-DLLVM_ENABLE_PROJECTS表明还需要编译的项目,这里指定 clang,可以根据需要加入其他子项目。
-DBUILD_SHARED_LIBS 指定使用动态链接来链接LLVM的库,默认取值Off代表静态链接

2.2 LLVM IR
LLVM的核心就是LLVM IR,LLVM项目从一系列围绕LLVM IR工具
IR有三种等价的表达形式:
1.内存表示(Instruction类等)
2.被压缩的磁盘表示(位码文件)
3.人工可读文本的磁盘表示(LLVM汇编文件)
我们用编写的sum.c样本作为示例
int sum(int x,int y)
{
return x+y;
}
生成位码
clang sum.c -emit-llvm -c -o sum.bc
生成汇编
clang sum.c -emit-llvm -s -c -o sum.ll
汇编上述LLVM IR 汇编文本
llvm-as sum.ll -o sum.bc
从位码转换为IR汇编文本,反汇编程序:
llvm-dis sum.bc -o sum.ll

在LLVM IR中只有 .ll文件是人为可读的文件
在这里插入图片描述

2.3 LLVM IR基本块分割技术

基本块分割即将一个基本块分割为等价的若干个基本块,在分割后的基本块之间加上无条件跳转
在这里插入图片描述
基本块分割不是纯正的代码混淆技术,但是在以基本块为基本单位的代码混淆技术中,基本块的数量越多,进行代码混淆后的复杂度越大,通过人为增加基本块的数量,可以达到提高代码混淆效果的目的。其实现思路即判断和遍历每个函数中不包含PHI指令的基本块,研究根据指定的一个基本块会被分裂成几个基本块的个数,计算出对每一个基本块进行分割的次数再进行分割即可

待混淆的函数F,混淆后的函数为O(F)
输入:待混淆函数F
输出:混淆后的函数O(F)
步骤:
Begin
if(toObfuscate(&F))then
do split(Function &F)
for basic blocks in iterator do
containsPHI()
shuffle()
……
splitBasicBlock()
end
endif
end
主要函数 功能描述
bool toObfuscate(Function &F) 检测是都启动了split功能
bool containsPHI(BasicBlock *b) 检测如果它的size(即包含的指令数)只有1个或者包含PHI节点,则不分割该block
Void shuffle(std::vector<int

&vec) 用shuffle打乱指令的顺序
BasicBlock *splitBasicBlock(Instruction *I, const Twine &BBName = “”,bool Before = false) 基本块分割即将一个基本块分割为等价的若干个基本块,在分割后的基本块之间加上无条件跳转

给出指令
$clang sum.c -S -emit-llvm -o sum.ll
$clang sum.c -S -emit-llvm -o sumpass.ll -mllvm -split
以sum.c为示例
在这里插入图片描述
在这里插入图片描述
2.4控制流平坦化混淆技术
在这里插入图片描述
算法生成一个选择指令swtichl,并将原有的基本块均作为switch指令的后继跳转,由选择指令的选择变量switchVtr参数决定在每一次的选择中哪一个基本块作为其后继跳转。
为了实现这一目标,在所有原基本块的开头增加选择标识数指令,在基本块的尾部添加新生成选择变量的指令。此外,算法还生成一个调度分发块,作为所有原基本块的后续跳转。调度分发块的后继节点为选择指令,调度分发块会将所有原基本块传递的选择变量传递给选择指令,选择指令继续下一个循环,直到将所有原基本块执行完毕。
此外,由于LLVM IR作为一种静态单赋值(SSA)形式的代码表示[9],即每个变量都只能被赋值一次,而控制流平坦化算法在执行后,所有原基本块的前驱块都变成了分发块,因此PHI指令发生了损坏。同时,平坦化后原基本块之间会不存在确定的前后关系(由分发块决定),因此某些变量的引用可能会损坏,称之为逃逸变量,这些逃逸变量在编译时会出现分不清定义和引用顺序的问题。所以在算法的最后需要修复所有的PHI指令和逃逸变量。
这种混淆算法可以有效增加程序的复杂性和安全性,大大提升逆向分析者的分析难度。混淆后程序的控制流为:
(1)从入口块进入,执行入口块,然后跳转到分发块;
(2)根据分发块中switch指令跳转到对应的基本块;
(3)执行完分发的基本块后跳转到统一的返回块;
(4)返回块跳转到分发块,分发块读取基本块中switch指令的case值,继续进行下一次分发和跳转。

待混淆函数为F,混淆后的函数为O(F)
步骤:
Begin
createLowerSwitchpass()
for basic block in function iterator do
save original basic block
end
AllocaInst() and ConstantInst::Get(…)
BasicBlock::Create()
SwitchInst::Create()
caesVar
loopEntry
loopEnd
for basic blocks in original basic block iterator do
put all basic block in switch,
change terminator instruction,
addCase(numCase,i)
reaalculate switch variable
end
end
主要函数 功能描述
createLowerSwitchPass() LLVM底层Switch指令创建口
AllocaInst() LLVM创建指令,并为指令分配地址空间创建了一个switch用的变量
ConstantInst::get() 创建常量,并为常量赋值
BasicBlock::Create() 创建基本块的接口
SwithchIns::Create(&f->begin(), swDefault, 0, loopEntry) 创建上层Switch指令接口
addCase(numCase,i) 创建Switch指令的各个分支的接口
给一个样例test.c进行展示
int test(int a, int b)
{
while(a!=0)
{
a=a+b;
}
if (b>5)
{
b-=1;
b=a+b;
}
return 0;
}
给出指令:
$clang test.c -S -emit-llvm -o test.ll
$clang test.c -S -emit-llvm -o testpass.ll -mllvm -split -mllvm -fla
在这里插入图片描述
在这里插入图片描述
2.5 LLVM IR指令替换技术
指令替换技术可以将指定的IR指令替换为功能相同但更复杂的指令,从而实现对IR的混淆。
指令替换的方式众多,其中最主要的方式是对运算指令的替换。在对运算指令的替换中,首先遍历需要混淆的函数或基本块中的指令,当检测到指定的指令后,在对应的位置创建混淆的指令,并取代原来的指令。同样的运算指令可以有多种不同的替换方式,混淆的强度主要取决于具体的实现过程,将不同的替换方式进行搭配可以提高代码混淆的效果。
在这里插入图片描述
待混淆的指令I,混淆后的指令为O(I)
输入:待混淆的指令I
输出:混淆后的指令O(I)
步骤:
Begin
if(I.getOpcode() == Instruction::
**)
Substitution(I)
ToRemove(I)
endif
end
主要函数 功能描述
unsigned getOpcode() const {
return getValueID() - InstructionVal;
} 检测指令的运算类型
void Substitution(Instruction& I) 对指令进行替换
void ToRemove(Instruction& I) 删除原有的指令
以test.c为例,进行两种不同的指令替换:
#include <stdio.h>
int main() {
int x = 0;
int y = x + 1;
printf(“%d\n”, y);
return 0;
}
$clang test.c -s -emit-llvm o -test.ll
$clang test.c -s -emit-llvm -subtest -o -test.ll
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyQt6--Python桌面开发(12.QpushButton按钮控件)

一.按钮类控件 二.QpushButton按钮控件 2.1QAbstractButton类属性 2.2QpushButton类属性

Git系列:Git Stash临时保存与恢复工作进度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ncs sdk nrf5340 运行DFU

nrf5340 运行DFU 1. dfu介绍 Nordic 的 DFU&#xff08;Device Firmware Update&#xff09;是一种用于更新设备固件的技术和协议。Nordic Semiconductor 是一家专门设计和制造无线芯片的公司&#xff0c;他们的产品主要用于物联网&#xff08;IoT&#xff09;和无线连接应用…

无线网卡网络老断网

无线网卡网络老断网 设置 Intel AX210 无线网卡 路由器华为 AX3 问题及解决 问题 无线网卡连接到 wifi &#xff0c;连接不通&#xff0c;或者连接上后网络很慢&#xff0c;延时大&#xff0c;掉包。 解决方案 调整如下界面&#xff0c;调整信道后&#xff0c;连接正常。…

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

armbian 安装libreoffice 转换word为PDF

安装libreoffice sudo apt-get install libreoffice安装JVM sudo apt-get install default-jre #验证 java -version尝试转换&#xff1a; libreoffice --convert-to pdf /root/printFiles/f.docx发现问题乱码 从Windows 拷贝字体到debian上&#xff0c;windows字体路径是&a…

Postman基础功能-断言与日志

若能脱颖而出&#xff0c;何必苦苦融入。大家好&#xff0c;在 API 测试的领域中&#xff0c;Postman 是一款极为强大且广泛使用的工具。其中&#xff0c;断言和日志调试功能扮演着至关重要的角色。 一、介绍 断言允许我们在测试过程中验证 API 的响应是否符合预期。通过设定各…

vue从入门到精通(一):初始Vue

一&#xff0c;Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代…

基于SpringBoot+Vue的教师个人成果管理系统

初衷 在后台收到很多私信是咨询毕业设计怎么做的&#xff1f;有没有好的毕业设计参考? 能感觉到现在的毕业生和当时的我有着同样的问题&#xff0c;但是当时的我没有被骗&#xff0c; 因为现在很多人是被骗的&#xff0c;还没有出学校还是社会经验少&#xff0c;容易相信别人…

猫头虎分享已解决Error || ERROR: Failed building wheel for XXX

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

物联网设计竞赛_3_Jetson Nano连接摄像头

ls /dev/video* 查看是否有摄像头 camorama 开启摄像头 关闭摄像头用&#xff1a; ctr c结束进程 若有camorama被启动用ps aux 或者 ps aux l grep camorama 找到对应进程用 kill -9 <PID>杀死进程再启动 必要的时候也能重启系统再试试&#xff1a; shutdown -r …

AI试衣IDM-VTON,Windows11本地安装配置记录!

昨天我们已经介绍过IDM-VTON这个开源项目了。 通过这个软件可以轻松实现一键换衣服。 昨天&#xff0c;简单演示了一下在线使用。 今天&#xff0c;来演示如何安装到本地电脑上&#xff01; 本地配置会有一定的专业性&#xff0c;懂的人可以参考下。 不懂得直接拉到最后&am…

【MySQL数据库开发设计规范】之字段设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

强化训练:day7(字符串中找出连续最长的数字串、岛屿数量、拼三角)

文章目录 前言1. 字符串中找出连续最长的数字串1.1 题目描述1.2 解题思路1.3 代码实现 2. 岛屿数量2.1 题目描述2.2 题目描述2.3 代码实现 3. 拼三角3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 字符串中找出连续最长的数字串   2. 岛屿数量   3. 拼三角 1. 字符串…

嵌入式和单片机的区别在哪?

嵌入式和单片机是两个不同的概念&#xff0c;它们在很多方面都存在着差异。嵌入式系统是一种专用的计算机系统&#xff0c;通常用于控制和监测其他设备。它通常由微处理器、存储器、输入/输出接口和其他外围设备组成。嵌入式系统可以运行各种操作系统&#xff0c;如 Linux、Win…

java spring boot动态数据库获得配置信息连接多数据源(数据库)

数据库 数据库文件和代码文件 https://download.csdn.net/download/qq_34631220/89304173 链接&#xff1a;https://pan.baidu.com/s/1xoh6xiSRx4nW_gKvR1QPjg 提取码&#xff1a;i7b7 –来自百度网盘超级会员V5的分享 文章位置 添加链接描述 说明&#xff1a;事务只能单库…

小程序常用组件

小程序常用组件 1.组件的定义2.常用组件3.引入外部字体图标库4.组件样式5.示例代码 1.组件的定义 组件就是指微信定义的具有特殊功能的标签&#xff0c;在wxml中只能使用微信定义的标签。 2.常用组件 <view>&#xff1a;用于页面布局的块级组件&#xff0c;类似于html中的…

【3dmax笔记】021:对齐工具(快速对齐、法线对齐、对齐摄影机)

文章目录 一、对齐二、快速对齐三、法线对齐四、对齐摄影机五、注意事项3dmax提供了对齐、快速对齐、法线对齐和对齐摄像机等对齐工具: 对齐工具选项: 下面进行一一讲解。 一、对齐 快捷键为Alt+A,将当前选择对象与目标对象进行对齐。 最大对最大:

基于SpringBoot+Vue的法律咨询系统

课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的传播速度极慢&#xff0c;信息处理的速…

7B2 PRO主题5.4.2 免授权开心版源码 | WordPress主题

简介&#xff1a; B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;和正版一样上传安装就可以激活。 直接在WordPress上传安装即可 点击下载