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

开发人员必须在运行时使用哪些选项来加密这些文本片段并将其解密?

#1 楼

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


尽可能避免使用字符串泄漏出有趣的信息。例如,如果您使用字符串显示错误信息或日志记录信息,则这可以为任何反向工程师提供有关应用程序中可能发生的情况的宝贵详细信息。而是用数字错误代码替换这些字符串。
用某种对称算法(例如简单的XOR例程或AES等加密算法)混淆所有字符串。这样可以防止在随意检查二进制文件时发现字符串。我说“混淆”是因为您可能会将加密/异或密钥存储在二进制文件中。任何稍加努力的逆向工程师肯定会恢复被混淆的字符串。
加密所有字符串(使所有字符串链接到可执行文件的单独部分并加密此部分),并将解密密钥存储在二进制文件之外。您可以远程存储密钥,并在可能的情况下限制访问服务器端。因此,如果逆向工程师确实获取了您的二进制文件,则他们可能无法访问密钥。解密密钥还可以基于有关该用户计算机的几个可预测因素在用户计算机上动态生成,实质上仅允许在此特定计算机(或计算机类型)上运行时对加密数据进行解密。政府恶意软件已使用此技术对特定目标的有效负载进行加密(如果我记得我在论文中所读到的链接,我将在此更新答案)。在运行时,使用在线翻译服务将字符串翻译回您期望的母语。这当然不是很实用。

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

评论


有关防止未加密字符串从内存中转储的技术,请参见此stackoverflow问题。

– amccormack
13年3月28日在18:03

为“获得创意” +1。阻止尝试理解程序的最好方法是使用在线问答网站中未记录的技术...

–丹尼尔·W·斯坦布鲁克(Daniel W. Steinbrook)
13年3月29日在2:14