在内存调试中隐藏 C 中的字符数组值



背景:

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

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

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

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

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

  • 对于每个元素 i,secret[i] = x1[i] XOR x2[i]
  • 仅在内存中定义和存储字符 x1[ ] 和字符 x2[ ]
  • 当每次都需要使用机密[ ]时,调用x1[ ] XOR x2[ ]。所以通过内存调试(动态分析)找不到secret[ ]

还是其他方式?

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

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

保护敏感数据,首先不要将其置于非特权手中。 如果您将数据传送到不可信的设备或程序,则应将其视为已泄露。

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

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

与其单独混淆,不如使用散列或加密。这实际上取决于字符串/键的用途。如果您愿意评论更多细节,我可以提供更多帮助。

以下是一些很棒的资源: - 堆栈交换:保护存储在二进制中的数据 - C 语言中的二进制/字符串混淆

相关内容

  • 没有找到相关文章

最新更新