Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Obfusk8 — Obfusk8:基于 C++17 的轻量级混淆库 / 仅头文件,用于 Windows 二进制文件 | Kitploit
工具/GitHubGitHub/x86byte/obfusk8
漏洞利用框架逆向工程Shellcode密码学渗透测试红队Payload 开发
GitHubx86byte/obfusk8

Obfusk8

Obfusk8:基于 C++17 的轻量级混淆库 / 仅头文件,用于 Windows 二进制文件

查看仓库
79382233个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Obfusk8:基于 C++17 的混淆库

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

banner


目录

  1. 核心混淆策略
  2. 依赖项
  3. 可视化
  4. 引擎分析与检测特征
  5. 结构与取证特征
  6. 用法
  7. 构建
  8. 演示
  9. 贡献与反馈

核心混淆策略

1. main 函数包装(_main 宏)

应用程序的入口点(main)会被转换为一个复杂的、多层次的混淆引擎:

  • 虚拟机(VM)执行(概念性):在实际的 main_body 代码执行之前,一个迷你虚拟机(模拟 CPU)会运行一系列“加密”指令。这隐藏了真实的入口点和初始操作。VM 的状态(寄存器、程序计数器、分派键)会使用运行期随机化的值进行初始化。
  • 间接控制流平坦化(ICFF):_main 宏中的关键循环(无论是序言还是尾声)都会被转换为复杂的状态机。控制流不是直接的,而是由经过高度“加密”的状态变量决定。这些状态变量的编解码键是动态的,来源于 VM 状态、循环计数器、编译期随机性(如 __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 宏包含一些条件,如果满足(由于特定的 VM 状态或时序),可能触发 __debugbreak() 或抛出异常,旨在干扰调试会话。

2. 虚拟 ISA 引擎(obf_vm_engine)

_main 宏混淆的核心组件:

  • 自定义迷你 CPU 模拟:模拟一个具有易失性寄存器(r0、r1、r2)、程序计数器(pc)和 dispatch_key 的 CPU。它执行自定义的“指令”(处理程序)。
  • 混淆指令:VM 指令处理程序执行的操作通过混合布尔算术(MBA)和位操作进行高度伪装。处理程序包括算术、位逻辑、密钥篡改、垃圾序列、条件更新、内存模拟和 PC 篡改。
  • 动态分派:下一个 VM 指令处理程序的选择通过多种分派机制随机化:
    • 基于寄存器的分派(reg_dispatch_idx)。
    • 基于内存表的分派(加扰的函数指针表 get_mem_dispatch_table)。
    • 混合分派(mixed_dispatch_idx)。 dispatch_key 不断变化,使得所执行处理程序的序列极难预测。
  • 处理程序表变异:VM 指令处理程序表(vm_handler_table)本身会在 _main 序言和尾声中的运行期被修改,进一步模糊 VM 的行为。

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 进行初始解析——如果这些函数本身尚未被该机制解析的话。
  • 哈希名称:使用 DLL 和 API 名称的编译期哈希(自定义算法 CT_HASH)进行查找。这防止了使用这些宏时二进制文件的导入相关数据或字符串表中出现明文的 DLL 和 API 名称。

5. 间接系统调用引擎(K8_SYSCALL)

Obfusk8 现在集成了最先进的间接系统调用机制,以绕过用户态钩子(EDR/AV)和静态分析检查。

  • “分院帽”解析:该引擎不是读取 ntdll.dll 的 .text 节(该节通常被挂钩或监控),而是解析导出目录。它过滤以 Zw 开头的函数,按内存地址排序,并根据其索引推导系统调用号(SSN)。这使得无需接触可执行代码即可解析 SSN。
  • 横向小工具执行:该引擎在其自身的二进制文件中不包含 syscall(0F 05)指令。相反,它在运行期于 ntdll.dll 内存中定位一个有效的 syscall; ret 小工具。
  • 干净调用栈:分配一个自定义 thunk,跳转到 ntdll 小工具。对于操作系统内核和安全传感器而言,系统调用看起来像是合法地源自 ntdll.dll,从而保持干净的调用栈。
  • 用法: 只需使用 K8_SYSCALL("ZwOpenProcess", ...) 代替 NtOpenProcess。

6. 基于方法的混淆(OBF_METHOD)

Obfusk8 现在通过基于方法的混淆提供对二进制文件安全性的细粒度控制。您不再需要混淆整个项目(这可能会影响性能),而是可以有针对性地保护特定的高价值函数或类方法。


使用方法

  1. 包含该 Pass
    确保在项目中包含方法混淆逻辑: ```cpp #include "../transform/PASSES/obf_cmethods.cxx"
  2. 宏语法
    使用 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 库是模块化的。核心功能依赖于:
下载工具