llvm迁移到ollvm

llvm迁移到ollvm步骤

总的概念
pass开发,熟悉llvm接口,操作IR中间码

LegacyPass

wget https://heroims.github.io/obfuscator/LegacyPass/ollvm14.patch
git clone --depth 1 -b release/14.x [email protected]:llvm/llvm-project.git
cd llvm-project
git apply --reject --ignore-whitespace ../ollvm14.patch

NewPass

wget https://heroims.github.io/obfuscator/NewPass/ollvm14.patch
git clone --depth 1 -b release/14.x [email protected]:llvm/llvm-project.git
git apply --reject --ignore-whitespace ../ollvm14.patch

LegacyPass方式更改如下

在这里插入图片描述

Obfuscation 源码解析

LegacyPass 方式

结构

位于LLVM 解决方案 Libraries 目录
在这里插入图片描述

sobf 继承ModulePass

非函数级别,针对整个模块操作
总的来说就2个步骤

  1. 源字符逐个异或替换,异或key为随机生成
  2. 添加一个解密函数,函数命名开头.datadiv_decode+ 随机字符 ,并添加到 init_arrary 内,保证加载后源字符串还原

针对方式,静态patch 或者运行dump即可

sub 继承 FunctionPass

  1. runOnFunction Pass回调
  2. 指令等价替换,参考下图add指令2种实现方式,原始指令 a=b+c
    在这里插入图片描述
    在这里插入图片描述

这块补充的是与或非转换的规则

 ① 与
Y=A · B =AB

② 或
Y=A+B

③ 非
Y=A'

④ 异或
Y=A⊕B= AB' + A'B

逻辑运算符,优先级 非 与 或

部分推导过程

andSubstitution

 a = b & c => a = (b^~c)& b
a = bc = bc + 0 = bbc + b'bc' = (bc + b'c')b
= (b⊕c')b  

xorSubstitutionRand

a = a ^ b = a ^ b ^ r ^ r = (a ^ r) ^ (b ^ r)
= (a'r + ar') ^ (b'r + br')
= (a⊕r)(b⊕r) // 异或公式
= a⊕b

fla 继承 FunctionPass

  1. 保存函数中所有指令到vector
  2. 创建一个大循环,把所有指令放到switch分发
  3. 修复堆栈

bcf 继承 FunctionPass

在原先正常流程下,添加一些虚假流程代码
addBogusFlow(basicBlock, F);

附录

编译
参考

猜你喜欢

转载自blog.csdn.net/u012787710/article/details/131403743