项目介绍
Obfusheader.h是一个适用于C++14及更高版本的轻量级头文件库,专注于在编译时通过元编程技术实现代码混淆。它提供了字符串与数字加密、控制流扭曲以及函数调用隐藏等功能,旨在增强二进制的安全性,保护敏感数据免受逆向工程。该库自包含,支持Windows与Unix系统,并兼容g++、gcc和Visual C++等多平台编译器。
项目快速启动
要迅速开始使用Obfusheader,首先确保你的开发环境已经配置了支持C++14或更高标准的编译器。以下是将Obfusheader集成到你项目的简单步骤:
步骤1: 添加依赖
克隆仓库到你的项目中:
git clone https://gitcode.com/gh_mirrors/ob/obfusheader.h
步骤2: 引入头文件
在你需要混淆的代码文件中引入obfusheader.h头文件。
#include "obfusheader.h"
int main() {
// 示例:使用RND宏生成编译时常量随机数
constexpr int randomNumber = RND(0, 10);
std::cout << "Random Number: " << randomNumber << std::endl;
// 使用MAKEOBF创建加密字符串并解密显示
const char* obfuscatedString = (char*)MAKEOBF("Hello, Secure World!");
std::cout << "Decrypted String: " << obfuscatedString << std::endl;
return 0;
}
步骤3: 编译与运行
使用支持C++14的编译命令来构建你的程序。
g++ -std=c++14 main.cpp -o myProtectedApp
./myProtectedApp
核心功能详解
编译时常量加密
Obfusheader.h提供了强大的编译时常量加密功能,可以加密字符串、十进制数字和字符等任何支持的类型。加密后的数据在运行时解密,原始值永远不会出现在二进制文件中。
printf("char*: %s\n"
"int (dec): %d\n"
"long long: %llu\n"
"int (hex): 0x%x\n"
"boolean: %d\n",
OBF("test"), OBF(123),
OBF(9223372036854775807),
OBF(0x123), OBF(true));
二进制水印功能
你可以在二进制文件中留下消息和ASCII艺术,这些内容不会影响执行,但会在IDA/GHIDRA等反编译工具中显示。
WATERMARK(" ",
" 00 00 ",
" 00000 0000 ",
" 0 000 0000 0 ",
" 000 000 0000 0 0 ",
" 00 0000 000000 000 00 ",
" 0000000 000 0 000 0 00 00 0 00 ",
" 0 0 0 0 0 00 00000000 000 000000 ",
" 0 0 0 0 0 00 00 00 0 00 0 0 0 0 ",
" 0 0 0 0 0 0 00 000 0 000 0 0 0 ",
" 0 0 0 0 0 0 0 00000 000 0 0 0 0 0000 ",
" 0 0 0 0 0 000 0 0 0 0 ",
" 0 0 0 0 0000000 0 0 0 ",
" 0 00000000 000000 0 0 ",
" 0 00000000000 0 00 ",
" 0 0 0 000 0 0 0 0 ",
" 00000000 ",
" 000000000 ",
" 000000000 ",
" 000 ",
" ");
函数调用隐藏
Obfusheader允许你通过生成编译时随机洗牌的函数指针数组来隐藏对任何内部方法的调用。
CALL(&printf, "Very secure call\n");
导入函数隐藏
你可以在Linux和Windows上隐藏从外部库导出的任何调用。
if (CALL_EXPORT("kernel32.dll", "LoadLibraryA", int(*)(const char*), "user32.dll"))
CALL_EXPORT("user32.dll", "MessageBoxA", int(*)(int, const char*, const char*, int), 0, "Real", "Msgbox", 0);
配置选项
你可以在obfusheader.h文件的开头更改这些设置,这将影响混淆在不同方面的工作方式。
#pragma region CONFIG
// C++ only features
#define CONST_ENCRYPTION 1
#define CONST_ENCRYPT_MODE NORMAL // NORMAL & THREADLOCAL
#define CFLOW_CONST_DECRYPTION 1
// C & C++ features
#define CFLOW_BRANCHING 0
#define INDIRECT_BRANCHING 0
#define FAKE_SIGNATURES 0
#define INLINE_STD 1
#define KERNEL_MODE 0
#pragma endregion CONFIG
实用宏和模块
Obfusheader使用一些独特的宏,可以在程序中使用。**RND(min, max)**可用于在编译时生成随机十进制数。
printf("Some random value: %d\n", RND(0, 10));
INLINE可用于强制内联任何方法。
INLINE void do_something() {
// 该方法将在任何编译器上完全内联
}
Obfusheader还完全内联重新实现了最常见的C方法,包括:strcpy, strlen, strncat, strcmp, strncmp, strstr。你可以使用这些方法来实现更安全的操作,并防止逆向工程人员钩住它们的标准实现。
if (inline_strcmp(password, correctPassword) == OBF(0)) {
printf(OBF("Congratulations! You have successfully cracked the program. \n"));
} else {
printf(OBF("Sorry, the password is incorrect. Try again!\n"));
}
安全注意事项
Obfusheader不使用动态分配。所有解密都发生在堆栈内存中,返回的值将在离开作用域时被释放。
// 不安全,因为字符串在编译优化时可能会被释放
const char* str = OBF("test");
printf("1: %s\n", str);
// 安全,因为字符串直接传递到方法内部
printf("2: %s\n", OBF("test"));
// 安全,因为我们创建加密存储,只在需要时解密字符串
auto obf = MAKEOBF("test");
printf("3: %s\n", (char*)obf);
项目目标
与Windows x86_64上的VMProtect、Themida和其他工具不同,在某些平台上没有好的方法来保护二进制文件,例如Arm64/Arm32 Android或Linux。因此,开发原生ARM软件(例如游戏模组)成为一个大问题 - 你的产品可能被任何人轻易绕过保护。这激发了我使用C++宏、模板和常量表达式创建手工编译时混淆,为包括Android和ARM Linux在内的任何平台提供基本保护措施。
这个简短的指南涵盖了Obfusheader的基本使用,提供了足够的起点以探索其更复杂的功能。记住,混淆并不是绝对的防护措施,但它确实增加了攻击者理解及逆向工程的难度。正确运用Obfusheader,能够有效提升应用程序的安全门槛。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







