x86byte/Obfusk8
GitHub: x86byte/Obfusk8
一款基于 C++17 的 header-only Windows 二进制代码混淆库,通过虚拟化、控制流平坦化、字符串加密和隐蔽 API 调用等技术保护应用程序逻辑免受逆向工程。
Stars: 780 | Forks: 80
# Obfusk8:基于 C++17 的代码混淆库
**Obfusk8** 是一个轻量级、仅包含头文件(header-only)的 C++17 库,旨在显著增强应用程序的代码混淆效果,使逆向工程变得极具挑战性。它通过一系列多样的编译时和运行时技术来实现这一目标,以保护代码的逻辑和数据。

## 目录
1. [核心混淆策略](#core-obfuscation-strategies)
2. [依赖项](#dependencies)
3. [可视化](#visualisation)
4. [引擎分析与检测特征](#engine-analysis-and-detection-profile)
5. [结构与取证特征](#structural-and-forensic-characteristics)
6. [用法](#usage)
7. [构建](#building)
8. [演示](#demo)
9. [贡献与反馈](#contribution--feedback)
### 核心混淆策略
### 1. `main` 函数包装(`_main` 宏)
应用程序的入口点(`main`)被转换为一个复杂的多层混淆引擎:
* **虚拟机(VM)执行(概念性)**:在你实际的 `main_body` 代码被执行之前,一个微型虚拟机(模拟的 CPU)会运行一系列“加密”的指令。这隐藏了真实的入口点和初始化操作。虚拟机的状态(寄存器、程序计数器、调度密钥)使用运行时随机生成的值进行初始化。
* **间接控制流平坦化(ICFF)**:`_main` 宏内部的关键循环(无论是在序言还是尾声部分)都被转换为复杂的状态机。控制流不是直接的,而是由经过严格“加密”的状态变量决定。这些状态变量的编码/解码密钥是动态的,由虚拟机状态、循环计数器、编译时随机性(如 `__COUNTER__`、`__LINE__`、`__TIME__`)以及一个全局不透明种子派生而来。这使得控制流的静态分析变得极其困难。
* 使用了两个截然不同的 ICFF 引擎(`obf_icff_ns_dcff` 和 `obf_icff_ns_epd`),它们具有不同的状态转换逻辑和密钥生成机制,进一步复杂化了分析过程。
* **虚假控制流(`OBF_BOGUS_FLOW_*` 宏)**:在 `_main` 中注入了大量误导性的跳转模式和复杂的条件结构。它们将 `goto` 语句与不透明谓词(始终评估为真或假,但在计算上极其昂贵或难以静态确定的条件)结合使用。这为反汇编器和反编译器创造了一个虚假路径的迷宫。
* 包含 `OBF_BOGUS_FLOW_LABYRINTH`、`OBF_BOGUS_FLOW_GRID`、`OBF_BOGUS_FLOW_SCRAMBLE`、`OBF_BOGUS_FLOW_WEAVER`、`OBF_BOGUS_FLOW_CASCADE` 和 `OBF_BOGUS_FLOW_CYCLONE`,用于生成多样化且复杂的虚假控制流。
* **反分析与反调试技巧(`Runtime` 宏,SEH)**:
* **强制异常与 SEH**:使用结构化异常处理(SEH)来创建涉及强制异常的路径。`__except` 块可以改变程序状态,如果调试器跳过异常,将导致流程难以跟踪。
* **调试器检查(概念性)**:`Runtime` 宏包含一些条件,如果满足这些条件(由于特定的虚拟机状态或时序),将会触发 `__debugbreak()` 或抛出异常,旨在干扰调试会话。
### 2. 虚拟 ISA 引擎(`obf_vm_engine`)
`_main` 宏混淆的核心组件:
* **自定义微型 CPU 模拟**:模拟一个带有易失性寄存器(`r0`、`r1`、`r2`)、一个程序计数器(`pc`)和一个 `dispatch_key` 的 CPU。它执行自定义的“指令”(处理程序)。
* **混淆指令**:虚拟机指令处理程序执行的操作通过混合布尔算术(MBA)和按位操作进行了深度伪装。处理程序包括算术运算、位逻辑、密钥缠绕、垃圾序列、条件更新、内存模拟和 PC 缠绕。
* **动态调度**:通过多种调度机制对下一个虚拟机指令处理程序的选择进行随机化:
* 基于寄存器的调度(`reg_dispatch_idx`)。
* 基于内存表的调度(打乱的函数指针表 `get_mem_dispatch_table`)。
* 混合调度(`mixed_dispatch_idx`)。
`dispatch_key` 会不断发生突变,使得执行处理程序的顺序变得高度不可预测。
* **处理程序表突变**:虚拟机指令处理程序表(`vm_handler_table`)本身也会在运行时于 `_main` 的序言和尾声中发生突变,进一步掩盖了虚拟机的行为。
### 3. 编译时字符串加密(来自 `AES8.hpp` 的 `OBFUSCATE_STRING`)
* **隐藏字符串**:在编译时使用修改过的 AES 密码对所有字符串字面量进行加密。
* **动态密钥**:每个字符串实例的加密密钥都是唯一的,由字符串内容、文件位置(`__FILE__`、`__LINE__`)和构建时间(`__DATE__`、`__TIME__`)派生而来。
* **即时解密**:字符串仅在运行时被访问时才在栈上进行解密,最大限度地减少了它们在内存中以明文存在的时间。
* **(可选)诱饵 PE 节区**:可以将加密字符串存储在自定义的 PE 节区中,这些节区被设计为模仿常见的加壳工具特征,从而可能误导分析人员(这是来自 `AES8.hpp` 的 MSVC 专属特性)。
### 4. 隐蔽的 Windows API 调用(来自 `Resolve8.hpp` 的 `STEALTH_API_OBFSTR` / `STEALTH_API_OBF`)
* **IAT 隐蔽性**:避免在导入地址表(IAT)中为 Windows API 留下直接且易于识别的表项。
* **基于 PEB 的解析**:通过在运行时直接解析进程环境块(PEB)数据结构,动态查找已加载 DLL 的基址和 API 函数的地址。如果 `GetModuleHandle` 和 `GetProcAddress` 本身尚未通过此机制解析,这可以绕过它们进行初始解析。
* **哈希名称**:使用编译时哈希(自定义算法 `CT_HASH`)对 DLL 和 API 名称进行查找。这可以防止在使用这些宏时,在二进制文件的导入相关数据或字符串表中出现明文的 DLL 和 API 名称。
### 5. 间接系统调用引擎(`K8_SYSCALL`)
Obfusk8 现在集成了最先进的间接系统调用机制,以绕过用户态 Hook(EDR/AV)和静态分析检查。
* **“分院帽”解析**:引擎不再读取 ntdll.dll 的 .text 节区(通常被 Hook 或监控),而是解析导出目录。它过滤出以 Zw 开头的函数,按内存地址对其进行排序,并根据它们的索引推导出系统调用号(SSN)。这使得 SSN 解析完全无需触碰可执行代码。
* **横向 Gadget 执行**:引擎在其自身的二进制文件中不包含 syscall (0F 05) 指令。相反,它会在运行时于 ntdll.dll 的内存中定位一个有效的 `syscall; ret` gadget。
干净的调用栈:分配一个自定义的 thunk 来跳转到 ntdll gadget。对于操作系统内核和安全传感器来说,该系统调用似乎合法地源自 ntdll.dll,从而保持了干净的调用栈。
* **用法**:
只需使用 `K8_SYSCALL("ZwOpenProcess", ...)` 而不是 `NtOpenProcess` 即可。
### 6. 基于方法的混淆(`OBF_METHOD`)
Obfusk8 现在通过**基于方法的混淆**提供了对二进制文件安全性的精细控制。你不再需要混淆整个项目(这可能会影响性能),而是可以选择性地保护特定的、高价值的函数或类方法。
### **如何使用**
1. **包含 Pass**
确保在项目中包含方法混淆逻辑:
#include "../transform/PASSES/obf_cmethods.cxx"
2. **宏语法**
使用 `OBF_METHOD` 宏定义你的方法:
OBF_METHOD(ret_type, func_name, params, method_body)
* **`ret_type`**:函数的返回类型(例如 `bool`、`int`、`void*`)。
* **`func_name`**:方法的名称。
* **`params`**:函数参数(必须包含在括号中)。
* **`method_body`**:包含在 `{ }` 中的函数实际逻辑。
### **示例:标准方法 vs 混淆方法**
在这个示例中,`PrintStatus` 是一个普通的、可读的函数。`Obfusk8_PrintStatus` 则受到 Obfusk8 的保护。
```
#include "../Instrumentation/materialization/state/Obfusk8Core.hpp"
#include "../Instrumentation/materialization/transform/K8_UTILS/k8_utils.hpp" // for the printf_, u can change the printf_ with anything else...
class Obfusk8_C
{
public:
// standard method which is visible to reverse engineers
void PrintStatus(void)
{
printf_("method\n");
}
// Obfuscated method protected by Obfusk8
OBF_METHOD_(void, Obfusk8_PrintStatus, (void),
{
printf_("same method but Obfuscated\n");
})
};
_main({
Obfusk8_C *pp = new Obfusk8_C;
pp->PrintStatus();
pp->Obfusk8_PrintStatus();
delete pp;
})
```
*你可以在这里查看完整的示例:[obfusk8_methods.cpp](https://github.com/x86byte/Obfusk8/blob/main/Obfusk8/EXAMPLES/obfusk8_methods.cpp)*
### 6. 内置隐蔽性的 API 抽象类
Obfusk8 提供了封装常用 Windows API 集合的辅助类。这些类在构造期间会自动使用隐蔽的 API 解析机制(`STEALTH_API_OBFSTR`),确保底层的 Windows 函数在解析时不会留下明显的静态导入痕迹。
- **`K8_ProcessManipulationAPIs::ProcessAPI` (`k8_ProcessManipulationAPIs.hpp`)**:
* 为进程操作相关的 Windows API 提供了便捷的访问方式,例如 `OpenProcess`、`TerminateProcess`、`CreateRemoteThread`、`VirtualAllocEx`、`WriteProcessMemory`、`ReadProcessMemory`、`GetProcAddress`、`GetModuleHandleA`、`NtQueryInformationProcess`、`SuspendThread` 和 `GetCurrentProcessId`。
* **自动隐蔽解析**:隐蔽地从 `kernel32.dll` 和 `ntdll.dll` 解析所需的函数。
* 简化了执行进程相关操作的过程,同时减少了静态分析的痕迹。包含了用于 `NtQueryInformationProcess` 的 `PROCESSINFOCLASS` 枚举。
- **`k8_CryptographyAPIs::CryptographyAPI` (`k8_CryptographyAPIs.hpp`)**:
* 提供了对常见 Windows 加密 API (CAPI/CNG) 函数的封装。(具体功能取决于该文件的实际实现——提供的片段是重复的。假设包含典型的 CAPI 函数,如 `CryptAcquireContextA`、`CryptCreateHash` 等。)
* **自动隐蔽解析**:隐蔽地主要从 `advapi32.dll`(以及核心功能所需的 `kernel32.dll`)解析所需函数。
* 促进了加密操作的执行,同时最大限度地减少了加密 API 使用情况的暴露。
- **`k8_NetworkingAPIs::NetworkingAPI` (`k8_NetworkingAPIs.hpp`)**:
* 提供了对来自 `wininet.dll`(例如 `InternetOpenA`、`HttpOpenRequestA`、`FtpPutFileA`)、`urlmon.dll`(例如 `URLDownloadToFileA`)、`ws2_32.dll`(例如 `socket`、`connect`、`WSAStartup`)、`shell32.dll`(例如 `ShellExecuteA`)、`dnsapi.dll`(例如 `DnsQuery_A`)和 `mpr.dll`(例如 `WNetOpenEnumA`)的广泛网络函数的轻松访问。
* **自动隐蔽解析**:在其构造函数中,它使用 `STEALTH_API_OBFSTR` 和 `OBFUSCATE_STRING` 从各自的 DLL(以及用于 `LoadLibraryA`/`GetLastError` 的 `kernel32.dll`)中解析所有所需的函数,而不留下明显的导入痕迹。
* 简化了发起混淆的网络请求和执行其他网络相关任务的过程。
- **`RegistryAPIs::RegistryAPI` (`k8_RegistryAPIs.hpp`)**:
* 封装了常用的 Windows 注册表函数,如 `RegSetValueExA`、`RegCreateKeyExA`、`RegOpenKeyExA`、`RegQueryValueExA`、`RegCloseKey` 等。
* **自动隐蔽解析**:在构造期间隐蔽地从 `advapi32.dll`(以及 `kernel32.dll`)解析函数。
* 有助于以更难追踪的 API 调用执行注册表操作。
### 7. 核心混淆原语(`Obfusk8Core.hpp` 中的宏)
这些是整个库中广泛使用的构建块,特别是在 `_main` 宏和虚拟机引擎中:
* **混合布尔算术(MBA)**:将简单的数学和逻辑运算(ADD、SUB、XOR、NOT、MUL)转换为复杂但等效的按位和算术公式序列(例如 `OBF_MBA_ADD`、`OBF_MBA_XOR`)。这些设计使得反编译器极难将其简化回原始形式。
* **不透明谓词**:插入条件分支,其中的条件始终评估为真(例如 `OBF_OPAQUE_PREDICATE_TRUE_`)或始终评估为假(例如 `OBF_OPAQUE_PREDICATE_FALSE_1`)。这些条件由涉及 `__COUNTER__`、`__LINE__`、`__TIME__` 和 `_obf_global_opaque_seed` 的复杂且难以静态评估的表达式构成。它们会创建误导性的代码路径,并可用于保护死代码或强制执行特定的执行流程。
* **垃圾代码注入**:
* `OBF_CALL_ANY_LOCAL_JUNK`:调用在 `obf_junk_ns` 中定义的众多小型、随机化的垃圾函数之一。这些函数执行琐碎的、易失性的操作,并在编译时随机选择。它们的目的是增加代码熵,打破简单的代码模式,并可能误导基于特征的检测或分析工具。
* `NOP()`:一个插入易失性操作的宏,旨在防止优化器轻易将其移除,并微妙地修改全局种子。
* **反汇编与反分析技巧**:
* **混淆跳转(`OBF_JUMP_*` 宏)**:创建条件或目标被混淆的 `goto` 语句,通常依赖于不透明谓词或 MBA。
* **混淆状态转换(`OBF_SET_NEXT_STATE_*` 宏)**:在 ICFF 中使用,这些宏使用与混淆跳转类似的混淆技术,为平坦化的控制流调度器设置下一个状态变量。
* **栈操作(`OBF_STACK_ALLOC_MANIP`、`OBF_FAKE_PROLOGUE_MANIP`)**:在栈上分配可变大小的块,并对它们执行虚假的操作。虚假的序言试图干扰栈分析。
* **混淆函数调用(`OBF_CALL_VIA_OBF_PTR`)**:函数指针在使用前后都会与动态密钥进行异或运算,掩盖了真实的调用目标。
* `K8_ASSUME(0)`:在死代码路径中使用,向 MSVC 编译器暗示这些路径是不可达的,从而可能允许进行不同的优化或代码生成,如果由于补丁破坏了该假设,可能会进一步干扰分析。
### 依赖项
Obfusk8 库是模块化的。核心功能依赖于:
- `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`:(此文件)编排并提供主要混淆宏和原语的核心头文件。
- `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`:提供基于 AES 的编译时字符串加密和可选的 PE 节区操作功能。
- `Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp`:实现基于 PEB 的隐蔽 Windows API 解析。
* `Obfusk8/Instrumentation/materialization/transform/k8_indsys.hpp`:编排**间接系统调用引擎**。它管理转换存根的生命周期,并提供通过横向内存 gadget 执行系统调用的接口。
* `Obfusk8/Instrumentation/materialization/transform/getpeb8.hpp`:促进初始引导和 **PEB 发现**。它包含自定义哈希逻辑、原生结构定义以及用于 SSN 推导的“分院帽”算法。它是所有模块枚举任务的低层基础。
可选的辅助 API 类在单独的头文件中提供,通常位于子目录中:
- `k8_ProcessManipulationAPIs/k8_ProcessManipulationAPIs.hpp`:用于隐蔽的进程操作 API。
- `k8_CryptographyAPIs/k8_CryptographyAPIs.hpp`:用于隐蔽的加密 API。
- `k8_NetworkingAPIs/k8_NetworkingAPIs.hpp`:用于隐蔽的网络 API。
- `k8_RegistryAPIs/k8_RegistryAPIs.hpp`:用于隐蔽的注册表 API。
### 可视化
* **ida graph**:

* **来自 ida pro 的一些块**:



* **detect it easy 特征结果**:

* **来自 virustotal 的众包 YARA 规则**:

* **内存映射(来自 die)**:

* **节区**:

* **绑定的文件**:

### 引擎分析与检测特征
Obfusk8 旨在优先绕过静态基于特征的检测引擎。针对行业标准供应商的测试表明,核心混淆逻辑仍然未被主要安全产品检测到,包括:
* **Microsoft Defender**:未检测到
* **Kaspersky**:未检测到
* **ESET-NOD32**:未检测到
* **BitDefender**:未检测到
虽然绕过了静态特征,但某些下一代防病毒软件(AV)和 EDR(例如 CrowdStrike 或 Symantec)可能会生成启发式标记,将其标记为“可疑”或“高可信度恶意”。这些检测通常是由极高的架构复杂性和自定义 PE 节区的存在触发的,而不是由于识别出了恶意代码。
### 结构与取证特征
* **熵管理**:当前的实现产生的全局熵约为 6.2。这是有意平衡的,既高到足以掩盖逻辑,又低到足以避免由高于 7.0 的熵水平触发的常见“加壳文件”警报。
* **节区自定义**:默认配置包含 23 个 PE 节区,其中一些使用诱饵名称(例如 `.themida`、`.vmp0`、`.enigma2`)来模仿已知的商业保护工具。
* **启发式优化**:为了进一步降低可疑度评分,用户可以将这些节区重命名为通用字符串(例如 `.data_01`、`.rdata_aux`)。标准化节区名称通常会降低启发式“唯一性”评分,使二进制文件看起来更像传统的编译应用程序。
* **导入混淆**:该库成功消除了关键 Windows API 的导入地址表(IAT)痕迹。通过利用进程环境块(PEB)进行解析以及间接系统调用引擎,二进制文件保持了干净的调用栈,防止行为监控器将系统调用追踪回受保护的代码区域。
- **简要说明**:
* **ssn 推导**:为了绕过通常放置在 ntdll.dll 指令流上的用户态 Hook,引擎利用了相对排序算法。通过解析导出目录并按内存地址对所有以 Zw 为前缀的函数进行排序,引擎根据它们的相对索引推导出系统服务号(SSN)。这使得框架能够在完全不读取函数序言中被 Hook 字节的情况下识别正确的 syscall 索引。
动态系统调用存根:该库不再利用用户态二进制文件中的静态 syscall 指令,而是动态分配可执行内存来托管瞬态转换存根。引擎用自定义的 shellcode 序列(`mov r10, rcx; mov eax, ssnnumber; syscall; ret`)填充这些存根,以间接执行系统调用。
* **链式引导**:解析过程是自举的;引擎使用初始解析的调用来为后续的间接系统调用建立环境。这确保了进程的整个生命周期——从模块枚举到函数执行——对行为监控器保持不透明,并维护干净的调用栈。
* **反取证**:混合布尔算术(MBA)和多层虚拟指令集架构(V-ISA)的使用确保了即使获取了内存转储,通过自动化反混淆工具重构底层逻辑也并非易事。
### 用法
1. 将 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 包含在你的主项目文件中(例如 `main.cpp`)。
#include "Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp" // 根据需要调整路径
2. 使用 `_main` 包装你的 `main` 函数体:
_main({
// 你的应用程序的原始主要代码放在这里
// 示例:
// OBFUSCATE_STRING("Hello, Obfuscated World!").c_str();
// 使用 API 包装类
k8_NetworkingAPIs::NetworkingAPI* netAPI = new k8_NetworkingAPIs::NetworkingAPI;
if (netAPI->IsInitialized() && netAPI->pInternetOpenA) {
HINTERNET hInternet = netAPI->pInternetOpenA(OBFUSCATE_STRING("MyAgent").c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hInternet) {
// ... 使用 hInternet ...
netAPI->pInternetCloseHandle(hInternet);
}
}
delete netAPI;
})
3. 对所有重要的字符串字面量使用 `OBFUSCATE_STRING("your string")`。如果需要进行 API 调用,请通过其 `.c_str()` 方法访问解密后的字符串,或者使用 `Obfusk8/Instrumentation/materialization/transform/AES8.hpp` 提供的其他方法(如 `.print_to_console()`)。
4. 使用 `STEALTH_API_OBFSTR("dll_name.dll", "FunctionNameA")` 进行直接的隐蔽 API 调用,或者为了方便和内置的隐蔽性,最好使用 API 包装类(例如 `K8_ProcessManipulationAPIs::ProcessAPI`、`k8_NetworkingAPIs::NetworkingAPI`)。
5. 在代码中对性能不敏感的关键部分散布 `OBF_BOGUS_FLOW_*`、`OBF_CALL_ANY_LOCAL_JUNK`、`NOP()` 和其他原语,以增加混淆层。
* 请参阅 main.cpp 文件。
### 构建
* **编译器要求**:本库专为 C++17 设计。主要目标对象是 Microsoft C++ 编译器(`cl.exe`),特别是在使用 PE 节区特性和 SEH 时。
* **在 Windows 上获取 `cl.exe`(MSVC 编译器)**:
1. **安装 Visual Studio**:获取 `cl.exe` 最简单的方法是安装 Visual Studio。你可以从 [Visual Studio 网站](https://visualstudio.microsoft.com/downloads/) 免费下载 Visual Studio Community 版本。
2. **选择工作负载**:在安装过程中,确保勾选“使用 C++ 的桌面开发”工作负载。这将安装 C++ 编译器、Windows SDK 和其他必需的工具。
3. **使用 Developer Command Prompt**:安装完成后,在“开始”菜单中搜索“Developer Command Prompt for VS”(例如“x64 Native Tools Command Prompt for VS 2022”)并运行它。此命令提示符会自动设置使用 `cl.exe` 所需的环境变量(PATH、INCLUDE、LIB)。
* **包含路径**:
* 确保包含 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 的目录位于编译器的包含路径中。
* 如果 `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`、`Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp` 以及 API 包装目录(例如 `k8_NetworkingAPIs/`)与 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 不在同一目录下,请确保也正确配置了它们的路径。`Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 在内部包含 API 包装器时使用了诸如 `../Obfusk8Core.hpp` 的相对路径,因此目录结构非常重要。如果 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 位于你包含此库的目录的根目录下,那么 API 包装器应位于相对于 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 预期位置的子目录(例如 `k8_NetworkingAPIs/`)中,或者直接调整 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 内的包含路径。
* **编译示例(使用 Developer Command Prompt)**:
假设你的 `main.cpp` 和 Obfusk8 头文件结构正确,你可以使用类似于以下的命令进行编译:
cl /std:c++17 /EHsc main.cpp
* 打开 `x64 Native Tools Command Prompt for VS 2` 之后:

* `/std:c++17`:指定 C++17 标准。
* `/EHsc`:指定 C++ 异常处理模型。
* `main.cpp`:你的主源文件。
* `/I"path/to/your/obfusk8_includes"`:(可选,如果头文件不在默认路径中)添加 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 及其依赖项所在的目录。如果它们位于子目录中,请确保 `Obfusk8Core.hpp` 内的相对路径与你的布局相匹配。
* **关于库的说明**:虽然隐蔽 API 解析旨在避免对混淆函数进行静态链接,但 Windows SDK 头文件本身可能需要链接器使用特定的 `.lib` 文件,以解析任何未混淆的 SDK 用法或内部类型(例如 `Ws2_32.lib`、`Wininet.lib`、`Advapi32.lib` 等)。对于像 `cl /std:c++17 /EHsc main.cpp` 这样的简单项目,如果它们是标准的 Windows 库,链接器通常会自动解析它们。
* **CMAKE**:你也可以使用 cmake 构建 Obfusk8。
1. 克隆并进入仓库:`git clone https://github.com/x86byte/Obfusk8.git`,然后进入目录 `cd Obfusk8`
2. 配置并生成文件:`cmake CMakeLists.txt`
3. 自动选择构建工具并编译:`cmake --build .`
* 打开 `x64 Native Tools Command Prompt for VS 2022` 之后:

* **CMAKE && Microsoft Visual Studio**:
* 打开 `microsoft visual studio` 后,点击 `Ctrl + B` 编译项目:

* **关于二进制大小和未来增强功能的考量**:
* **体积影响**:请注意,大量使用仅限头文件的混淆,特别是在使用内联垃圾代码、MBA 扩展和平坦化控制流等技术时,可能会导致最终二进制文件体积显著增加。一个小程序可能会从几 KB 增长到潜在的 2MB 或更多,具体取决于所应用的混淆强度。
* **自定义和加壳(未来方向)**:
* 目前,Obfusk8 专注于代码内混淆。如果二进制文件大小是关键限制,用户可能需要微调各种宏的使用(例如降低 `OBF_CALL_ANY_LOCAL_JUNK` 的密度或 `_main` 循环的复杂性)。
* 为了在混淆后大幅减小体积,集成或使用外部的 PE 加壳工具(如 UPX、MPRESS 或自定义解决方案)将是一个单独的步骤。
* Obfusk8 的未来开发可能会探索对混淆强度进行更精细控制的方法,甚至直接在库中集成轻量级的加壳/压缩存根,尽管这会显著增加其复杂性。
### 构建后 PE 混淆
Obfusk8 包含一个构建后脚本,通过移除取证工件来进一步加固编译后的二进制文件。
* **脚本位置**:`Obfusk8/SCRIPTS/obfuscate_pe.ps1`
* **它的作用**:
1. **剥离 Rich Header** — 移除揭示编译器版本和工具链详细信息的 MSVC 构建环境指纹。
2. **伪造 TimeDateStamp** — 将 PE 头时间戳替换为固定值,以掩盖构建时间。
3. **清除调试目录** — 清除可能泄露 PDB 路径或构建元数据的调试目录项。
* **用法**:
在编译后作为构建后步骤运行:
PowerShell -NoProfile -ExecutionPolicy Bypass -File Obfusk8/SCRIPTS/obfuscate_pe.ps1 -Path "path\to\Obfusk8.exe"
该脚本会直接修改二进制文件,不会创建备份。
### 演示
[[Obfusk8:基于 C++17 的混淆库 - IDA pro 图形视图] ~视频演示](https://youtu.be/B9g4KSg3tHQ)
### 特别感谢
* [sadMosquito](https://github.com/sadMosquito) — 感谢其报告问题并测试项目
**免责声明**
混淆是一层防御,而不是万无一失的解决方案。拥有足够技能和时间的坚定攻击者通常能够对混淆代码进行逆向工程。Obfusk8 旨在显著提高此类工作的门槛。请与其他安全措施结合使用。
**取得联系**
如果你想分享反馈、讨论混淆技术、报告逆向工程尝试,或者只是进行技术交流,请随时直接联系。我始终欢迎建设性的对话与合作(我很乐意参与与混淆相关的项目或其他任何合作)。
- x : https://x.com/x86byte
- telegram: https://t.me/x86byte
- discord: @x86byte
标签:C++17, Chrome扩展, HTTP头分析, 代码混淆, 安全意识培训, 控制流平坦化, 编译期计算, 防逆向工程