LLVM中期报告

2024-05-14 02:28
文章标签 报告 llvm 中期

本文主要是介绍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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于LLVM中期报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 所以大部分网站及App 都采取图形验证码或滑动验证码等交互解决方案, 但在机器学习能力提高的当下,连百度这样的大厂都遭受攻击导致点名批评, 图形验证及交互验证方式的安全性到底如

hdu1879(解题报告)

继续畅通工程                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

hdu2033(解题报告)

人见人爱A+B                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

HDU3791(解题报告)

二叉搜索树                      Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                          Total Subm