llvm简要介绍:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6567a92a-87da-46c1-a4ec-cca5063b9c10/Untitled_picture.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/76e46349-28ca-451e-a947-09400b69fa35/Untitled.png

通常,llvm后端和clang或其他前端配合使用,clang前端负责将c文件生成IR代码,这时候llvm后端可以对IR进行优化等操作,最后生成目标文件。这样,只需要配置不同的前端,就可以将各种语言的源码生成出统一的IR代码给llvm优化操作,可以做到解耦编译。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/17fea924-5f8d-4e4d-833e-bdec69be4264/Untitled.png

OLLVM简介:

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具。github:https://github.com/obfuscator-llvm/obfuscator

OLLVM主要是对IR进行混淆,这样对任何语言都具有通用性,因为前端会生成统一的IR代码,然后对IR进行编译生成汇编源码。这样子ollvm通用性就很高,可以支持很多平台架构,比如x86,x64,arm等。毕竟IR代码是通用的嘛。

Windows 上安装:

编译完成后添加环境变量,并安装mingw,输入clang -v可以看到已经添加了ollvm的llvm

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5b674040-b722-40c8-92e2-91b480fb036e/Untitled.png

通过llvm设置生成IR代码:

int add(int a,int b){
    int sum = 0;
    for (int i = 0; i < 10;++i){
        sum += a+b;
    }
    return sum;
}

int main(){
    printf("hello \\n");
    int a = add(1,9);
    printf("%d \\n",a);
    return 0;
}

clang .\1.c -emit-llvm -S -o 1.ll 生成无混淆的IR

clang .\1.c -emit-llvm -S -o 2.ll -mllvm -sub -mllvm -bcf -mllvm -fla

fla(Control Flow Flattening控制流平坦化)

bcf(Bogus Control Flow,虚假控制流)