从内存调试中隐藏 C 中的 char 数组值
Hide char array values in C from memory debug
背景:
我有一个混淆的 C 代码。混淆只能保护算法逻辑,不能隐藏变量值不被动态分析。我想在内存调试中进一步隐藏一些值(例如,一个字符数组)。
平台:移动客户端(与远程服务器无关)
假设我有一个秘密字符数组:
char secret[15] = {"hide this value"};
是否可以通过这种方式隐藏这个值:
- 对于每个元素 i,secret[i] = x1[i] XOR x2[i]
- 只在内存中定义和存储char x1[ ]和char x2[ ]
- 每次都需要用到secret[ ]时,调用x1[ ] XOR x2[ ]。所以通过内存调试(动态分析)无法找到secret[ ]
或者其他方式?
您现在讨论的任何内容都只是混淆数据的方法。如果有人要调试或反汇编,他们会清楚地看到发生了什么,并能找到关键。即使没有反汇编,看到两个字符串,出于好奇,有人也可以对每个字符进行异或运算。鉴于此,XOR 仍然是一个不错的选择,并且当两个字符串都不可打印时,它会使您的数据非常模糊。为了进一步实现这一点,如果您使用文件或字符串的特定哈希来生成 XOR 的密钥,那将会很有趣。
现在,鉴于此,您可以研究许多关于二进制文件和 C 中的字符串混淆的资源。
与其本身进行混淆,不如使用散列或加密。这实际上取决于 string/key 的用途。如果您愿意评论更多细节,我可以提供更多帮助。
这里有一些很棒的资源:
- Stack Exchange: Protect Data Stored in Binary
- Binary/String Obfuscation in C
如果对手有能力自由地检查您程序的工作内存,例如通过调试器,那么在程序中就没有秘密可逃。特别是,在内存中加密数据并不是一个可靠的保障,因为你必须de加密才能使用它,此时它很容易被拦截。而且,解密密钥必须在内存中的某个位置,您的对手可以找到它,从而获得随意解密您的 in-memory 加密数据的能力。
混淆代码也不是可靠的保护措施。它可能会减慢你的对手的速度,但凭借技能和/或好的工具,他们会及时找出什么是什么。事实上,假设您从可执行文件中删除调试符号并且不提供源代码,唯一可见的混淆是外部函数和变量名称(所以不要费心混淆其他任何东西)。
保护敏感数据,首先不要将其置于无特权的人手中。如果您将数据传送到不可信的设备或程序,那么您应该认为它已受到威胁。
背景:
我有一个混淆的 C 代码。混淆只能保护算法逻辑,不能隐藏变量值不被动态分析。我想在内存调试中进一步隐藏一些值(例如,一个字符数组)。
平台:移动客户端(与远程服务器无关)
假设我有一个秘密字符数组:
char secret[15] = {"hide this value"};
是否可以通过这种方式隐藏这个值:
- 对于每个元素 i,secret[i] = x1[i] XOR x2[i]
- 只在内存中定义和存储char x1[ ]和char x2[ ]
- 每次都需要用到secret[ ]时,调用x1[ ] XOR x2[ ]。所以通过内存调试(动态分析)无法找到secret[ ]
或者其他方式?
您现在讨论的任何内容都只是混淆数据的方法。如果有人要调试或反汇编,他们会清楚地看到发生了什么,并能找到关键。即使没有反汇编,看到两个字符串,出于好奇,有人也可以对每个字符进行异或运算。鉴于此,XOR 仍然是一个不错的选择,并且当两个字符串都不可打印时,它会使您的数据非常模糊。为了进一步实现这一点,如果您使用文件或字符串的特定哈希来生成 XOR 的密钥,那将会很有趣。
现在,鉴于此,您可以研究许多关于二进制文件和 C 中的字符串混淆的资源。
与其本身进行混淆,不如使用散列或加密。这实际上取决于 string/key 的用途。如果您愿意评论更多细节,我可以提供更多帮助。
这里有一些很棒的资源: - Stack Exchange: Protect Data Stored in Binary - Binary/String Obfuscation in C
如果对手有能力自由地检查您程序的工作内存,例如通过调试器,那么在程序中就没有秘密可逃。特别是,在内存中加密数据并不是一个可靠的保障,因为你必须de加密才能使用它,此时它很容易被拦截。而且,解密密钥必须在内存中的某个位置,您的对手可以找到它,从而获得随意解密您的 in-memory 加密数据的能力。
混淆代码也不是可靠的保护措施。它可能会减慢你的对手的速度,但凭借技能和/或好的工具,他们会及时找出什么是什么。事实上,假设您从可执行文件中删除调试符号并且不提供源代码,唯一可见的混淆是外部函数和变量名称(所以不要费心混淆其他任何东西)。
保护敏感数据,首先不要将其置于无特权的人手中。如果您将数据传送到不可信的设备或程序,那么您应该认为它已受到威胁。