Obfusk8 是一个轻量级、仅头文件的 C++17 库,旨在显著增强应用程序的混淆程度,使逆向工程变得更具挑战性。它通过一系列编译期和运行期技术来实现这一目标,以保护代码的逻辑和数据。

main 函数包装(_main 宏)应用程序的入口点(main)会被转换为一个复杂的、多层次的混淆引擎:
main_body 代码执行之前,一个迷你虚拟机(模拟 CPU)会运行一系列“加密”指令。这隐藏了真实的入口点和初始操作。VM 的状态(寄存器、程序计数器、分派键)会使用运行期随机化的值进行初始化。_main 宏中的关键循环(无论是序言还是尾声)都会被转换为复杂的状态机。控制流不是直接的,而是由经过高度“加密”的状态变量决定。这些状态变量的编解码键是动态的,来源于 VM 状态、循环计数器、编译期随机性(如 __COUNTER__、__LINE__、__TIME__)以及一个全局不透明种子。这使得对控制流的静态分析异常困难。
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):
__except 块可以改变程序状态,使得调试器跳过异常时难以跟踪程序。Runtime 宏包含一些条件,如果满足(由于特定的 VM 状态或时序),可能触发 __debugbreak() 或抛出异常,旨在干扰调试会话。obf_vm_engine)_main 宏混淆的核心组件:
r0、r1、r2)、程序计数器(pc)和 dispatch_key 的 CPU。它执行自定义的“指令”(处理程序)。reg_dispatch_idx)。get_mem_dispatch_table)。mixed_dispatch_idx)。
dispatch_key 不断变化,使得所执行处理程序的序列极难预测。vm_handler_table)本身会在 _main 序言和尾声中的运行期被修改,进一步模糊 VM 的行为。AES8.hpp 的 OBFUSCATE_STRING)__FILE__、__LINE__)和构建时间(__DATE__、__TIME__)。AES8.hpp 的 MSVC 特定功能)。Resolve8.hpp 的 STEALTH_API_OBFSTR / STEALTH_API_OBF)GetModuleHandle 和 GetProcAddress 进行初始解析——如果这些函数本身尚未被该机制解析的话。CT_HASH)进行查找。这防止了使用这些宏时二进制文件的导入相关数据或字符串表中出现明文的 DLL 和 API 名称。K8_SYSCALL)Obfusk8 现在集成了最先进的间接系统调用机制,以绕过用户态钩子(EDR/AV)和静态分析检查。
K8_SYSCALL("ZwOpenProcess", ...) 代替 NtOpenProcess。OBF_METHOD)Obfusk8 现在通过基于方法的混淆提供对二进制文件安全性的细粒度控制。您不再需要混淆整个项目(这可能会影响性能),而是可以有针对性地保护特定的高价值函数或类方法。
OBF_METHOD 宏定义你的方法: ```cpp
OBF_METHOD(ret_type, func_name, params, method_body)
ret_type:函数的返回类型(例如 bool、int、void*)。func_name:方法的名称。params:函数参数(必须用括号括起来)。method_body:函数中括在 { } 内的实际逻辑。在此示例中,PrintStatus 是一个正常、可读的函数。Obfusk8_PrintStatus 受 Obfusk8 保护。```cpp
#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` 宏和 VM 引擎中:
* **混合布尔算术(MBA)**:将简单的数学和逻辑运算(ADD、SUB、XOR、NOT、MUL)转换为复杂但等价的位运算和算术公式序列(例如 `OBF_MBA_ADD`、`OBF_MBA_XOR`)。这些设计旨在让反编译器极难将其简化回原始形式。
* **不透明谓词**:插入条件分支,其中条件始终评估为真(例如 `OBF_OPAQUE_PREDICATE_TRUE_1`)或始终为假(例如 `OBF_OPAQUE_PREDICATE_FALSE_1`)。这些条件由涉及 `__COUNTER__`、`__LINE__`、`__TIME__` 和 `_obf_global_opaque_seed` 的复杂且难以静态评估的表达式构造而成。它们会创建误导性的代码路径,并可用于保护死代码或强制特定的执行流程。
* **垃圾代码注入**:
* `OBF_CALL_ANY_LOCAL_JUNK`:调用 `obf_junk_ns` 中定义的许多小型随机垃圾函数之一。这些函数执行琐碎且易变(volatile)的操作,并在编译时随机选择。其目的是增加代码熵、打乱简单代码模式,并可能误导基于签名的检测或分析工具。
* `NOP()`:一个宏,插入易变(volatile)操作,旨在防止优化器轻易移除,并微妙地修改全局种子。
* **反汇编与反分析技巧**:
* **混淆跳转(`OBF_JUMP_*` 宏)**:创建条件或目标被混淆的 `goto` 语句,通常依赖不透明谓词或 MBA。
* **混淆状态转换(`OBF_SET_NEXT_STATE_*` 宏)**:在 ICFF 中使用,这些宏使用与混淆跳转类似的混淆技术,为扁平化控制流分发器设置下一个状态变量。
* **栈操作(`OBF_STACK_ALLOC_MANIP`、`OBF_FAKE_PROLOGUE_MANIP`)**:在栈上分配可变大小的块并对其执行虚假操作。伪函数序言试图迷惑栈分析。
* **混淆函数调用(`OBF_CALL_VIA_OBF_PTR`)**:函数指针在使用前后与动态密钥进行 XOR,从而掩盖真实的调用目标。
* `K8_ASSUME(0)`:用于死代码路径,向 MSVC 编译器提示这些路径不可达,从而可能允许不同的优化或代码生成;如果该假设被补丁破坏,则可能进一步迷惑分析。
### 依赖项
Obfusk8 库是模块化的。核心功能依赖于: