从0到1的ollvm (1)ndk与llvm pass调试环境搭建

两只羊 Lv2

最近在学习ollvm魔改的过程中,首先就被配环境困扰了好久现在就来总结一下

主要参考的是这位大佬的博客,照理来说跟着就可以了,这里补充自己的一些踩坑点

【清羽】Windows10下编译OLLVM-14.x_ollvm 编译优化后-CSDN博客

cmake,ninja用最新版的就好了

ollvm版本使用该大佬的

https://github.com/yangyiyu08/ollvm-project

gcc用visuial studio的会疯狂报错,必须使用llvm的clang工具

https://github.com/mstorsjo/llvm-mingw/releases/download/20220323/llvm-mingw-20220323-ucrt-x86_64.zip

接着环境变量的设置,必须只保留llvm,将Visual studio的gcc删去

image-20250531165853375

然后才能成功构建

1
2
3
cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF

cmake --build build -j16

image-20250531170050271

编译好后,如果想直接添加ollvm混淆,又必须重新将Visual studio的gcc环境置顶,否则编译好的ollvm-clang将会无法编译

image-20250531170137940

ollvm调用成功,且自己添加的pass部分也能执行

image-20250531170411508

在android stdudio的环境也也能成功编译

image-20250531170727076

使用参数说明

  1. -fla
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    用于控制流平坦化(control flow flattening)的Pass

    - `-mllvm -fla`: 激活控制流平坦化
    - `-mllvm -split`: 激活基本块分割。一起使用时可提高平坦度。
    - `-mllvm -split_num=3`: 如果激活这个Pass,则在每个基本块上应用 3 次。默认值:1

    2. ```
    -sub
    用于指令替换(instruction substitution)的Pass - `-mllvm -sub`: 激活指令替换 - `-mllvm -sub_loop=3`: 如果这个Pass被激活,则每个函数使用 3 次。默认值:1。
  2. -bcf
    

    用于虚假控制流(bogus control flow)的Pass

    • -mllvm -bcf: 激活虚假控制流
    • -mllvm -bcf_loop=3: 如果这个Pass被激活,则每个函数使用 3 次。默认值:1。
    • -mllvm -bcf_prob=40: 如果激活这个Pass,基本区块将以 40% 的概率被混淆。默认值:30%
  • 标题: 从0到1的ollvm (1)ndk与llvm pass调试环境搭建
  • 作者: 两只羊
  • 创建于 : 2025-05-31 16:50:46
  • 更新于 : 2025-06-01 12:53:02
  • 链接: https://twogoat.github.io/2025/05/31/从0到1的ollvm-1-ndk与llvm-pass调试环境搭建/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
从0到1的ollvm (1)ndk与llvm pass调试环境搭建