从内存调试中隐藏 C 中的 char 数组值

Hide char array values in C from memory debug

背景:

我有一个混淆的 C 代码。混淆只能保护算法逻辑,不能隐藏变量值不被动态分析。我想在内存调试中进一步隐藏一些值(例如,一个字符数组)。

平台:移动客户端(与远程服务器无关)

假设我有一个秘密字符数组:

char secret[15] = {"hide this value"};

是否可以通过这种方式隐藏这个值:

或者其他方式?

您现在讨论的任何内容都只是混淆数据的方法。如果有人要调试或反汇编,他们会清楚地看到发生了什么,并能找到关键。即使没有反汇编,看到两个字符串,出于好奇,有人也可以对每个字符进行异或运算。鉴于此,XOR 仍然是一个不错的选择,并且当两个字符串都不可打印时,它会使您的数据非常模糊。为了进一步实现这一点,如果您使用文件或字符串的特定哈希来生成 XOR 的密钥,那将会很有趣。

现在,鉴于此,您可以研究许多关于二进制文件和 C 中的字符串混淆的资源。

与其本身进行混淆,不如使用散列或加密。这实际上取决于 string/key 的用途。如果您愿意评论更多细节,我可以提供更多帮助。

这里有一些很棒的资源: - Stack Exchange: Protect Data Stored in Binary - Binary/String Obfuscation in C

如果对手有能力自由地检查您程序的工作内存,例如通过调试器,那么在程序中就没有秘密可逃。特别是,在内存中加密数据并不是一个可靠的保障,因为你必须de加密才能使用它,此时它很容易被拦截。而且,解密密钥必须在内存中的某个位置,您的对手可以找到它,从而获得随意解密您的 in-memory 加密数据的能力。

混淆代码也不是可靠的保护措施。它可能会减慢你的对手的速度,但凭借技能和/或好的工具,他们会及时找出什么是什么。事实上,假设您从可执行文件中删除调试符号并且不提供源代码,唯一可见的混淆是外部函数和变量名称(所以不要费心混淆其他任何东西)。

保护敏感数据,首先不要将其置于无特权的人手中。如果您将数据传送到不可信的设备或程序,那么您应该认为它已受到威胁。