vertigo-z/obsidian-protector
GitHub: vertigo-z/obsidian-protector
Obsidian 是一款用 C 语言编写的通用 PE 打包器和可执行文件保护器,支持通过 XOR 混淆和自定义 loader stub 保护 Windows 二进制文件,涵盖 AMD64 与 ARM64 架构。
Stars: 7 | Forks: 2
advanced, open-source obfuscation
## 功能:
**社区版-v1.3:**
* 现已添加 ARM64 支持
* 改进的 XOR 算法
* 基于哈希的导入查找
* 编译好的 xorshift64+ stub (stubs/stub.bin)
* 高熵 ASLR 支持
* stub 模板 (BYOS - bring your own stub)
* 详尽的 debug 输出 (-DDEBUG & --debug 标志)
* 随机化配置标记
* 清零可选头
* 安全密钥生成
* 校验和重新计算
* PE 段操作
* 进度条和颜色
## obsidian pro:
## ce 混淆引擎:
```
void obfuscate_data(uint8_t* data, size_t size, uint64_t key) {
uint8_t key_xor_aa = (uint8_t)(key ^ 0xAA);
uint8_t key_xor_aa_shr8 = (uint8_t)((key ^ 0xAA) >> 8);
for (size_t i = 0; i < size; i++) {
uint64_t subkey = key ^ (i * 0x9E3779B97F4A7C15ULL);
subkey = (subkey ^ (subkey >> 30)) * 0xBF58476D1CE4E5B9ULL;
subkey = (subkey ^ (subkey >> 27)) * 0x94D049BB133111EBULL;
subkey = subkey ^ (subkey >> 31);
uint8_t shift1 = (uint8_t)((i * 8) & 0x3F);
uint8_t shift2 = (uint8_t)((24 + i * 8) & 0x3F);
uint8_t shift3 = (uint8_t)((56 + i * 8) & 0x3F);
uint8_t mask = (uint8_t)(subkey >> shift1)
^ (uint8_t)(subkey >> shift2)
^ (uint8_t)(subkey >> shift3);
data[i] ^= mask;
data[i] += key_xor_aa;
data[i] -= key_xor_aa_shr8;
}
}
```
**混淆过程:**
1. 使用常量推导出 ADD 和 SUB 操作的值
2. 将“黄金比例”常量混合到子密钥中以增加熵
3. 生成移位和最终掩码变量
4. 对数据应用转换
## stub 参考表:
| | stub.bin | stub.Oz.bin | stub.obfuscated.bin | stub.full.obf.bin | stub-arm64.bin |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 描述: | 无优化 | 激进的体积优化 | 控制流平坦化 + 指令替换 | 完全混淆(虚假控制流、拆分、平坦化、替换) | arm64 变体,-O1 优化 |
| 大小: | 17kb | 13kb | 17kb | 57kb | 5kb |
| 工具: | clang/llvm | clang/llvm + Oz | clang/llvm + Oz + [ollvm-22](https://github.com/vertigo6622/ollvm-22) | clang/llvm + Oz + [ollvm-22](https://github.com/vertigo6622/ollvm-22) | clang/llvm + O1 |
| 注意: | 基础 | 最小 / 最快 | 均衡 | 最大 / 最慢 | 现已在 stubs/ 文件夹中提供 |
## 编译:
**要求:**
gcc:
* 可在 `https://winlibs.com/` 获取的 mingw64 工具套件
* windbg 或其他调试器
* 用于 `clean.py` 的 python 解释器
llvm/clang:
* llvm 22 工具链
* mingw64 工具套件
**arm64 要求:**
* arm64 llvm/mingw64 工具链(包含在某些发行版中)
### amd64 命令:
**步骤 1:构建 stub 对象文件**
gcc:
```
.\gcc.exe stub.c -o stub.o -fno-asynchronous-unwind-tables -fno-ident -fno-stack-protector
```
llvm/clang:
```
clang --target=x86_64-pc-windows-gnu \
-I/llvm-mingw-20260311-ucrt-macos-universal/generic-w64-mingw32/include \
-masm=intel \
-fno-asynchronous-unwind-tables -fno-ident -fno-stack-protector -Oz \
-c stub.c -o stub.o
```
**步骤 2:链接并剥离 stub 二进制文件**
两者皆可:
```
.\ld.exe stub.o -o stub.exe -nostdlib --build-id=none -s --entry=_start
```
```
.\objcopy.exe -O binary stub.exe stub.bin
```
```
.\windres.exe resource.rc -o resource.o
```
**步骤 3:构建 obsidian ce**
gcc:
```
.\gcc.exe obsidian.c resource.o -o obsidian.exe -lbcrypt
```
llvm/clang:
```
x86_64-w64-mingw32-clang \
-I/llvm-mingw-20260311-ucrt-macos-universal/generic-w64-mingw32/include -O1 \
obsidian.c resource.o -o obsidian.exe -lbcrypt
```
### arm64 命令:
**步骤 1:构建 stub 对象文件**
```
/llvm/llvm-mingw-20260311-ucrt-macos-universal/bin/aarch64-w64-mingw32-clang \
-fno-asynchronous-unwind-tables -fno-ident -fno-stack-protector -O1 \
-c stub-arm64.c -o stub-arm64.o
```
**步骤 2:链接并剥离 stub 二进制文件**
```
.\ld.lld.exe stub.o -o stub.exe --build-id=none -s --entry=_start
```
```
.\objcopy.exe -O binary stub.exe stub.bin
```
```
.\windres.exe resource.rc -o resource.o
```
**注意:** 资源文件步骤必须在 arm64 和 amd64 stub 均处于 .bin 格式之后进行
**步骤 3:构建 obsidian ce**
gcc:
```
.\gcc.exe obsidian.c resource.o -o obsidian.exe -lbcrypt
```
llvm/clang:
```
x86_64-w64-mingw32-clang \
-I/llvm-mingw-20260311-ucrt-macos-universal/generic-w64-mingw32/include -O1 \
obsidian.c resource.o -o obsidian.exe -lbcrypt
```
标签:ARM64, PE打包器, 代码混淆, 免杀工具, 客户端加密, 执行体保护, 逆向工具