Skip to content

A step-by-step tutorial for building an LLVM sample pass

License

Notifications You must be signed in to change notification settings

am009/llvm-pass-tutorial

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ollvm/armariris/hikari port to llvm10 in 2020

配置环境

安装Vscode的Remote-Containers插件,Ctrl-Shift-P执行build and open in devcontainer

编译

export CC=clang-12 CXX=clang++-12
cmake -S . -B build
cmake --build build

运行

首先使用wllvm获取程序的LLVM-IR字节码文件。如tshd.bc,转换为可读的IR文件

llvm-dis-12 ./tshd.bc -o tshd.ll

执行运算指令替换:

opt-12 -load build/ollvm/libollvm.so --substitution --sub_loop=1  < ./tshd.bc > out.bc

最后再转换为可读的IR文件,

llvm-dis-12 ./out.bc -o out.ll

最后用vscode diff一下两个ll文件查看变化了哪里

再最后编译成可执行文件看能不能运行

clang-12 ./out.bc -lutil -o tshd.out
./tshd.out --help

执行混淆的命令

可以在help里面搜索对应的命令行。

opt-12 -load build/ollvm/libollvm.so --help > help.txt
  1. Pass的开启

    代码中命令行的注册是

    static RegisterPass<Flattening> X("flattening", "Call graph flattening");

    开启的时候就使用 --flattening 即可。

  2. Pass的命令行参数

    Pass的命令行参数在代码中通过cl::opt注册。

  3. 常用命令

opt-12 -load build/ollvm/libollvm.so --flattening  < ./tshd.bc > out.bc # 控制流平坦化
opt-12 -load build/Armariris/libArmariris.so --GVDiv < ./tshd.bc > out.bc # Armariris里有全局变量字符串加密Pass

混淆哪些函数

主要看bool Flattening::runOnFunction(Function &F)这种runOnFunction函数。

那些被包围在if (toObfuscate(flag, tmp, "fla"))里的代码基本上都不会执行到,因为它需要在源码给函数标attribute。所以都注释了。

  1. 让Pass只跑某一个函数:用F.getName().compare
  auto name = F.getName();
  if (name.compare("file_chmod") == 0) {
    substitute(tmp);
    return true;
  }
      if(toObfuscate(flag,&F,"bcf") || F.getName().compare("file_chmod") == 0) {
        bogus(F);
        doF(*F.getParent());
        return true;
      }
  1. 让Pass跑所有函数:把包围在if (toObfuscate(flag, tmp, "fla"))里的代码拿出来即可。

About

A step-by-step tutorial for building an LLVM sample pass

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 99.4%
  • Other 0.6%