You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言编译阶段对二进制文件中的字符串进行混淆隐藏?

针对GCC环境的纯C编译时字符串混淆方案

可以通过GCC预处理特性实现更简洁的调用方式,不需要手动逐个拆分字符套宏,编译时自动完成字符串混淆计算,二进制中不会留存明文常量,完全满足你防十六进制编辑器直接读取的需求。

完整实现代码

// 可自定义混淆偏移,也可替换为异或等其他简单运算规则
#define OBFUSCATION_KEY 0x50

// 单个字符编译时混淆
#define OBF_CHAR(c) ((char)((c) + OBFUSCATION_KEY))

// 字符串展开辅助宏,可根据需要的最长字符串长度扩展层数,以下示例支持最长127字节的字符串
#define STR_EXPAND_1(s, idx)  OBF_CHAR(s[idx])
#define STR_EXPAND_2(s, idx)  STR_EXPAND_1(s, idx), OBF_CHAR(s[idx+1])
#define STR_EXPAND_3(s, idx)  STR_EXPAND_2(s, idx), OBF_CHAR(s[idx+2])
#define STR_EXPAND_4(s, idx)  STR_EXPAND_3(s, idx), OBF_CHAR(s[idx+3])
// 中间层级按需补充,此处省略扩展过程,最终到STR_EXPAND_127即可支持普通URL长度
#define STR_EXPAND_127(s, idx) STR_EXPAND_126(s, idx), OBF_CHAR(s[idx+126])

// 核心混淆宏:直接传入字符串字面量生成混淆后的栈数组
#define OBFUSCATE_STR(arr_name, plain_str) \
    char arr_name[] = { \
        STR_EXPAND_##(sizeof(plain_str)-1)(plain_str, 0), \
        '\0' \
    }

// 运行时解密宏,原地解密字符串
#define DEOBFUSCATE_STR(arr_name) do { \
    for (char *p = arr_name; *p; p++) { \
        *p -= OBFUSCATION_KEY; \
    } \
} while (0)

使用示例

#include <stdio.h>

int main(void) {
    // 直接传入明文字符串即可,无需手动处理每个字符
    OBFUSCATE_STR(submit_url, "https://your-game-hall-of-fame.com/submit");
    // 运行时解密
    DEOBFUSCATE_STR(submit_url);
    // 解密后可正常使用
    puts(submit_url);
    return 0;
}

方案优势

  1. 完全符合纯C语法要求,不依赖C++特性,仅使用GCC预处理扩展,编译时自动完成所有混淆计算,不会在二进制的.rodata段留存明文字符串
  2. 调用方式简洁,不需要手动逐个字符套混淆宏,代码可读性远高于你当前用的方案
  3. 可灵活调整混淆规则:比如把加减偏移替换为异或运算、或者多步简单运算,避免被通用的字符串混淆识别规则命中;也可以在编译脚本中自动生成随机的混淆密钥,每次编译生成的二进制混淆结果都不一样

可选优化

如果需要支持任意长度的字符串,可以把辅助宏的层数扩展到你需要的长度,普通场景下支持256字节长度完全足够覆盖所有URL、提示文本等常用字符串的需求。

内容的提问来源于stack exchange,提问作者neuhaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:36:04