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个步骤
- 源字符逐个异或替换,异或key为随机生成
- 添加一个解密函数,函数命名开头.datadiv_decode+ 随机字符 ,并添加到 init_arrary 内,保证加载后源字符串还原
针对方式,静态patch 或者运行dump即可
sub 继承 FunctionPass
- runOnFunction Pass回调
- 指令等价替换,参考下图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
- 保存函数中所有指令到vector
- 创建一个大循环,把所有指令放到switch分发
- 修复堆栈
bcf 继承 FunctionPass
在原先正常流程下,添加一些虚假流程代码
addBogusFlow(basicBlock, F);