0x1. 预备

  1. 前置条件

    cmake, python (可以通过 homebrew 来安装), Xcode

    详细要求参考 Getting Started with the LLVM System - Requirements

  2. 检出 LLVM 工程

    1
    `git clone --depth=1 https://github.com/llvm/llvm-project.git`
  3. 下载解压 Hikari 的 core 和 header

    Core:基于 pass 的 C++ 混淆代码

    https://github.com/HikariObfuscator/Core

    header:混淆代码的头文件

    https://github.com/HikariObfuscator/Headers

4, 复位 core 和 header

  • 复位 core

    1. 将 core 代码复制到 llvm/lib/Transforms/Obfuscation 文件夹 (需要新建) 中

    2. 其他修改

      修改 Transforms 目录下的 CMakeLists.txt,添加 “add_subdirectory(Obfuscation)”

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      add_subdirectory(Utils)
      add_subdirectory(Instrumentation)
      add_subdirectory(AggressiveInstCombine)
      add_subdirectory(InstCombine)
      add_subdirectory(Scalar)
      add_subdirectory(IPO)
      add_subdirectory(Vectorize)
      add_subdirectory(Hello)
      add_subdirectory(ObjCARC)
      add_subdirectory(Coroutines)
      add_subdirectory(Obfuscation)

      修改 Trasforms 目录下的 LLVMBuild.txt, 在 subdirectories 字段后添加 Obfuscation

      1
      2
      3
      4
      5
      6
      7
      [common]
      subdirectories = AggressiveInstCombine Coroutines IPO InstCombine Instrumentation Scalar Utils Vectorize ObjCARC Obfuscation

      [component_0]
      type = Group
      name = Transforms
      parent = Libraries

      修改 Trasforms 目录下 IPO 文件夹中的 LLVMBuild.txt, 在 required_libraries 字段后添加 Obfuscation

      1
      2
      3
      4
      5
      6
      [component_0]
      type = Library
      name = IPO
      parent = Transforms
      library_name = ipo
      required_libraries = AggressiveInstCombine Analysis BitReader BitWriter Core InstCombine IRReader Linker Object ProfileData Scalar Support TransformUtils Vectorize Instrumentation Obfuscation

      修改 Trasforms 目录下 IPO 目录中的 PassManagerBuilder.cpp,增加如下代码:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // 新增头文件
      #include "llvm/Transforms/Obfuscation/Obfuscation.h"

      // populateModulePassManager 新增 MPM.add(createObfuscationPass());
      // 将 obfuscation 加入到 passManager 中
      void PassManagerBuilder::populateModulePassManager(
      legacy::PassManagerBase &MPM) {
      MPM.add(createObfuscationPass());
      ....
      }

      在 llvm/tools/opt/opt.cpp 注册 Obfuscation

      1
      2
      3
      4
      int main(int argc, char **argv) {
      initializeHardwareLoopsPass(Registry);
      initializeObfuscationPass(Registry);
      }
  • 复位 header

    1. 将 header 中所有的文件复制到 llvm/include/llvm/Transforms/Obfuscation 中 (需要新建)

    2. 其他修改

      修改 llvm/InitializePasses.h,增加方法声明

      1
      2
      void initializeXRayInstrumentationPass(PassRegistry&);
      void initializeObfuscationPass(PassRegistry&);

      修改 llvm/LinkAllPasses.h, 增加头文件以及方法声明

      1
      2
      3
      4
      5
      6
      7
      8
      9
      #include "llvm/Transforms/Obfuscation/Obfuscation.h"

      namespace {
      struct ForcePassLinking {
      ForcePassLinking() {
      (void) llvm::createObfuscationPass();
      }
      }
      }

编译 xcode 工具链

1
2
3
4
5
6
7
cd llvm-project
# 随意命名
mkdir build_with_ninja
cd build_with_ninja
cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_CREATE_XCODE_TOOLCHAIN=on -DCMAKE_INSTALL_PREFIX=~/Library/Developer/ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt" -G Ninja ../llvm
ninja
ninja install-xcode-toolchain

编译完后 toolchain 在 ~/Library/Developer/ 目录中.