加密二进制文件中的文本

逆向工程 混淆 C C++
2021-06-23 07:03:37

使用任何支持十六进制值的 ASCII 编码的编辑器,通常可以轻松地在二进制文件中读取文本字符串。逆向工程师可以轻松地研究和更改这些文本片段。

开发人员有哪些选项可以在运行时加密和解密这些文本片段?

1个回答

根据您的需要,一些可能适用也可能不适用的选项:

  1. 尽可能避免使用字符串泄露有趣的信息。例如,如果您使用字符串来显示错误信息或日志信息,这可以为任何逆向工程师提供有关您的应用程序中可能发生的情况的有价值的详细信息。而是用数字错误代码替换这些字符串。

  2. 使用某种对称算法(如简单的 XOR 例程)或加密算法(如 AES)混淆所有字符串。这将防止在对二进制文件进行随意检查时发现该字符串。我说“混淆”,因为您可能会将加密/异或密钥存储在您的二进制文件中。任何稍微努力一点的逆向工程师肯定会恢复混淆的字符串。

  3. 加密所有字符串(使所有字符串链接到可执行文件中的单独部分并加密此部分)并将解密密钥存储在二进制文件之外。您可以远程存储密钥并在可能的情况下限制访问服务器端。因此,如果逆向工程师确实获得了您的二进制文件,他们可能无法访问密钥。解密密钥也可以根据有关该用户机器的几个可预测因素在用户计算机上动态生成,基本上只允许在该特定机器(或机器类型)上运行时解密加密数据。政府恶意软件已使用此技术来加密特定目标的有效负载(如果我记得我在其中阅读的论文链接,我将更新答案)。

  4. 获得创意,将所有字符串存储为外语,然后在运行时使用在线翻译服务将字符串翻译回您期望的母语。这当然不是很实用。

当然,如果您的字符串确实在运行时被解码/解密,那么逆向工程师可以从内存中转储该过程以查看字符串。因此,最好仅在需要时解码/解密单个字符串(可能将解码后的字符串存储在临时位置并在使用后将其归零)。