aegis_protection.hpp)单头文件 C++20 代码虚拟化、混淆、加密与防篡改 SDK
工业级零依赖单头文件 C++20 软件保护 SDK(单个 .hpp 文件中包含 10,145+ 行代码):具有多态字节码的混合栈-寄存器虚拟机、类 C 脚本到 V-ISA 编译器、25+ 种密码学原语、编译期混淆、反调试、运行时内存完整性监控、加密 VFS 以及硬件绑定许可。
无外部依赖、无复杂构建脚本、无杂乱内容——严格仅包含单头文件 SDK 及其验证测试套件:
├── aegis_protection.hpp # Single-header C++20 SDK (10,145 LOC, 67 integrated subsystems)
├── test_all_in_one.cpp # Complete verification suite (20 test suites + 12 crypto KAT checks)
└── README.md # Bilingual documentation & developer manual (EN / RU)
将 aegis_protection.hpp 直接包含到你的 C++20 项目中:
#include "aegis_protection.hpp"
cl /std:c++20 /EHsc /W4 /O2 test_all_in_one.cpp /Fe:test_all_in_one.exe
.\test_all_in_one.exe
clang++ -std=c++20 -O2 -Wall -Wextra test_all_in_one.cpp -o test_all_in_one
./test_all_in_one
flowchart LR
A["Source Logic / Script"] --> B["AegisScript / BytecodeBuilder"]
B --> C["IR Obfuscation Passes<br/>(Constant Blinding, MBA, Junk)"]
C --> D["Polymorphic Opcode Map<br/>(Compile-Time Shuffle)"]
D --> E["Rolling-Key Cipher<br/>+ BytecodeEnvelope"]
E --> F["Aegis Virtual Machine<br/>(MBA Dispatch + Ephemeral Wipe)"]
G["IntegrityWatchdog + VEH Guard"] --> F
| 类别 | 命名空间 | 关键类与能力 |
|---|---|---|
| 代码虚拟化(VM) | aegis::vm | VirtualMachine、BytecodeBuilder、BytecodeChunk、VMContext、NativeBridge、PolymorphicOpcodeMap(编译期 Fisher-Yates 256 操作码置换)、扩展 V-ISA(OP_BSWAP、OP_POPCNT、OP_VMEMCPY、OP_VMEMSET、OP_REKEY、OP_JUNK) |
| VM 编译器与工具链 | aegis::vm::* | AegisScriptCompiler(将类 C 脚本编译为 V-ISA 字节码)、VmTextAssembler(带标签的文本汇编器)、BytecodeDisassembler(+ CFG 构建器)、BytecodeDecompiler(将字节码提升为 C 伪代码)、BytecodeObfuscationPipeline、SsaLifter(SSA + 线性扫描分配器)、BytecodeAbstractInterpreter、VMProfiler、VMDebugger |
| 编译期混淆 | aegis::obf | Mba(混合布尔算术)、AEGIS_STR / AEGIS_STR_OBJ(constexpr 字符串加密,带自动栈清零)、AEGIS_INT / ObfuscatedInt、Opaque 谓词、FlatteningMachine(控制流平坦化)、EncryptedDispatchTable |
| 对称密码与 AEAD | aegis::crypto | Aes256(ECB/CBC/CTR + PKCS#7)、ChaCha20、ChaCha20Poly1305(RFC 8439 AEAD)、XChaCha20(192 位 nonce)、Salsa20、Camellia256(RFC 3713)、Serpent256(32 轮 SPN)、Threefish512(72 轮)、Blowfish、Rc6_256、Speck128、Simon128、Sm4、XTea |
| 密码学哈希与 KDF | aegis::crypto | Sha256(FIPS 180-4 + HMAC)、Sha512 / Sha384(+ HMAC)、Keccak1600(sha3_256、sha3_512、shake256)、Blake2b、Blake2s、Ascon320(NIST SP 800-232)、Sm3、Poly1305、SipHash24、KdfEngine(pbkdf2_hmac_sha256、hkdf_extract/expand、memory_hard_derive)、ChaCha20Drbg(CSPRNG + UUIDv4) |
| 公钥、秘密共享与 ECC | aegis::crypto / aegis::math | X25519(RFC 7748 Curve25519 ECDH)、Uint256(mod_add、mod_mul、mod_pow)、ShamirSecretSharing($GF(2^8)$ 中的阈值 $(K, N)$)、SelfHealingBuffer(RAM 中的汉明 SEC-DED + XOR 奇偶校验恢复)、MerkleTree(包含证明)、WhiteBoxByteNetwork |
| 反调试与内存防御 | aegis::anti / aegis::veh / aegis::watchdog / aegis::syscall | AntiDebug(PEB、NtGlobalFlag、Dr0–Dr7、RDTSC、ThreadHideFromDebugger、ProcessDebugPort)、AntiVm(CPUID 虚拟机监控程序厂商、MAC、注册表)、EmulatorDetector(IEEE-754 NaN 载荷保真度)、AntiDump(erase_pe_headers)、IntegrityScanner、CodePatchGuard、ApiResolver(无 IAT 的 AEGIS_API)、SyscallResolver(ntdll.dll SSN 提取与钩子检测器)、VehGuard(硬件断点清除器)、IntegrityWatchdog(后台监控线程) |
| 授权、VFS 与水印 | aegis::license / aegis::archive / aegis::watermark | LicenseManager(AEGIS-XXXX-... 密钥,带 HWID 绑定与 ChaCha20-Poly1305)、AegisVfsArchive(带 LZSS 压缩的加密虚拟文件系统)、BytecodeWatermarker(隐写式客户水印)、HardwareId(TPM 2.0 EKPub + CPUID)、PeImageAnalyzer、UniversalBinaryInspector(PE/ELF64/Mach-O)、SecurePacketChannel、EncryptedRingLogger、JsonParser |
aegis_protection.hpp 是 100% 仅头文件的。在 Windows 上,所需的系统库(ncrypt.lib、crypt32.lib、advapi32.lib、psapi.lib、iphlpapi.lib)会通过 #pragma comment(lib, ...) 自动链接。
Visual Studio(.vcxproj):
aegis_protection.hpp 复制到你的项目目录中。ISO C++20 Standard (/std:c++20)。.cpp 文件中添加 #include "aegis_protection.hpp"。CMake(CMakeLists.txt):
cmake_minimum_required(VERSION 3.20)
project(ProtectedApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(ProtectedApp main.cpp aegis_protection.hpp)
| 宏 | 用途 | 示例 |
|---|---|---|
AEGIS_STR("...") | 在编译时(constexpr)加密字符串字面量,并按需将其解密到本地栈缓冲区 | printf("%s\n", AEGIS_STR("Secret Text")); |
AEGIS_STR_OBJ("...") | 创建一个 RAII 加密字符串对象,该对象在离开作用域时自动擦除其栈内存(secure_zero) | auto key = AEGIS_STR_OBJ("Bearer xyz"); |
AEGIS_INT(val) | 使用多态拆分和 MBA 在 IDA/Ghidra 中隐藏整数常量,使其无法被静态分析发现 | int port = AEGIS_INT(8443); |
AEGIS_INT_VAR(T, name, val) | 声明一个类型为 ObfuscatedInt<T> 的混淆变量 | AEGIS_INT_VAR(uint32_t, flags, 0x1337); |
AEGIS_API(mod, func, Type) | 通过 FNV-1a 哈希从已加载的 PE 模块中动态解析导出函数,无需导入地址表(IAT)条目 | auto pBeep = AEGIS_API("kernel32.dll", "Beep", BOOL(WINAPI*)(DWORD, DWORD)); |
AEGIS_DESYNC() | 生成一个带有死字节失步的不透明条件跳转,以破坏 IDA/Ghidra 中的线性反汇编 | AEGIS_DESYNC(); |
"..."_fnv1a | 在编译时计算 64 位 FNV-1a 哈希 | constexpr auto h = "ntdll.dll"_fnv1a; |
BytecodeBuilder + 调用原生 C++ 函数(NativeBridge)#include "aegis_protection.hpp"
#include <iostream>
int main() {
using namespace aegis::vm;
VirtualMachine vm;
// Register a native C++ callback in the VM bridge (returns u64, takes VMContext&)
aegis::u64 check_token_id = vm.native_bridge().register_function([](VMContext& ctx) -> aegis::u64 {
aegis::u64 user_id = ctx.get_reg(VReg::R1);
return (user_id == 42) ? 1ULL : 0ULL;
});
// Build polymorphic bytecode with rolling-key encryption
BytecodeBuilder b(/*polymorphic=*/true);
b.emit_junk(2)
.mov(VReg::R1, 42)
.call_native(check_token_id) // Pushes return value (1) onto the VM stack
.pop(VReg::R0) // Pop result into R0 (VM return register)
.rekey(0x55AA55AAULL) // Dynamically mutate rolling cipher key mid-stream
.halt();
BytecodeChunk chunk = b.build(/*initial_key=*/0x123456789ABCDEF0ULL);
std::cout << "Auth result: " << vm.run(chunk) << "\n"; // 1
}
VmTextAssembler)auto chunk = aegis::vm::assembler::VmTextAssembler::assemble(R"(
mov r1, 10
mov r2, 20
bswap r1
popcnt r1
add r1, r2
mov r0, r1
halt
)", 0xABCDEF123456ULL, /*polymorphic=*/true);
aegis::vm::VirtualMachine vm;
aegis::u64 result = vm.run(chunk);
AegisScriptCompiler)+ 3 层 BytecodeEnvelope将高级脚本(let、if / else、while、return)直接编译为 BytecodeChunk,并将其封装在 3 层加密信封 中(LZSS 压缩 → 白盒 S-Box 网络 → ChaCha20-Poly1305 AEAD):