在 LLVM 10.0 下编译 Hikari
0x1. 预备
前置条件
cmake, python (可以通过 homebrew 来安装), Xcode
检出 LLVM 工程
1
`git clone --depth=1 https://github.com/llvm/llvm-project.git`
下载解压 Hikari 的 core 和 header
Core:基于 pass 的 C++ 混淆代码
https://github.com/HikariObfuscator/Core
header:混淆代码的头文件
4, 复位 core 和 header
复位 core
将 core 代码复制到 llvm/lib/Transforms/Obfuscation 文件夹 (需要新建) 中
其他修改
修改 Transforms 目录下的 CMakeLists.txt,添加 “add_subdirectory(Obfuscation)”
1
2
3
4
5
6
7
8
9
10
11add_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// 新增头文件
// populateModulePassManager 新增 MPM.add(createObfuscationPass());
// 将 obfuscation 加入到 passManager 中
void PassManagerBuilder::populateModulePassManager(
legacy::PassManagerBase &MPM) {
MPM.add(createObfuscationPass());
....
}在 llvm/tools/opt/opt.cpp 注册 Obfuscation
1
2
3
4int main(int argc, char **argv) {
initializeHardwareLoopsPass(Registry);
initializeObfuscationPass(Registry);
}
复位 header
将 header 中所有的文件复制到 llvm/include/llvm/Transforms/Obfuscation 中 (需要新建)
其他修改
修改 llvm/InitializePasses.h,增加方法声明
1
2void initializeXRayInstrumentationPass(PassRegistry&);
void initializeObfuscationPass(PassRegistry&);修改 llvm/LinkAllPasses.h, 增加头文件以及方法声明
1
2
3
4
5
6
7
8
9
namespace {
struct ForcePassLinking {
ForcePassLinking() {
(void) llvm::createObfuscationPass();
}
}
}
编译 xcode 工具链
1 | cd llvm-project |
编译完后 toolchain 在 ~/Library/Developer/ 目录中.