有什么方法可以混淆基于 C 的可执行文件或库以防止反编译?
13 回答
不,你可以让反编译变得更加困难,但你不能阻止它。我的建议是停止浪费您的时间,而应专注于提供具有不断改进功能的出色产品。
那么人们就会愿意为此付出代价。
您的主要问题是,使您的代码无法破译的唯一方法是使其无法运行。任何可以加载到 PC 中的东西都可以被破解。那些为了乐趣、利润或名声而进行逆向工程的人通常都非常擅长逆向工程,并且真的不会因为你试图阻止他们所做的任何事情而分阶段进行。
他们可以使用工具,使破译您的代码的工作比您混淆它的工作容易得多:-) 更好地说服全世界您的软件值得购买,并将盗版视为可能转换的机会“盗贼”给正版用户。
例如,找出他们不为您的软件付费的原因并尝试解决这个问题。你永远不会 100% 的人转换,有些人会盗版你的代码只是为了好玩。
查看 techdirt 上关于 CwF+RtB 的系列文章(与粉丝联系以及购买理由)。我发现那里提出的许多观点可能适用于软件行业。
最简单的方法:购买打包器/加密器/混淆器产品。有些价格昂贵并用于游戏,有些则不然。用“复制保护”等流行词为他们谷歌。
快速方法:使用UPX打包,然后在某处破坏标头,以便它仍会加载到内存中并运行良好,但 upx 实用程序将失败并出现错误(尝试版本字段)。如果 upx 实用程序失败,95% 将放弃。
困难的方法:编写自己的打包程序。
哦,我忘记了:
真正简单的方法:按原样发货。不是真的 - 无论你做什么,人们仍然可以对你的代码进行逆向工程。你付出的努力只会限制有多少人可以扭转它。
完全优化编译。
反编译(No More Gotos)和混淆实践(Flowtables)和理论(Indistinguishability Obfuscation)都是活跃的研究领域,因此没有解决方案——只有工具、技术和专业知识。如果您真的希望您的代码不受反编译的影响,请创建一个 Web 应用程序,并将敏感代码放在服务器端。但是,如果您坚持给某人提供二进制文件的模型,那么您必须明智地判断您想要在安全性和性能之间做出的权衡。混淆是有代价的,而且永远都不是完美的。一些选项
- 使用 UPX 以外的打包程序(UPX 安装在许多 Linux 发行版中)。性能成本低,大多数人不具备手动解压缩二进制文件进行静态分析的技能。但对于经验丰富的逆向者来说,拆包的成本并不重要
- 查看 Tigress,这是一个多样化的虚拟化器/混淆器,具有丰富的 C 源代码到源代码混淆功能。为了获得更好的性能,依赖于支持的转换、控制流扁平化、函数合并/拆分、文字编码
- 如果您想要更大的保护,请查看 Tigress 的主要转换:虚拟化、JITing 等,但我相当肯定这些更昂贵,如果您使用这些转换,您的用户可能会注意到速度变慢。
不要对 Barak 等人关于黑盒混淆不可能性的开创性工作感到气馁。他只证明了黑盒混淆器的不可能性,而不是许多实用且有价值的混淆器的不可能性。(黑盒混淆是程序的内部运作完全无法理解)也不要被盗版者气馁。如果产品好的话,总会有人认为购买你的产品很重要。
使用优化编译器编译 C 代码使得无法恢复原始源代码或任何与它相近的东西。它比当今流行的任何 Java 或 .NET 混淆器都安全得多。如果您想让可执行文件变小并在发布前隐藏任何符号名称,请务必剥离可执行文件。但是,请注意,这也使得调试(当应用程序崩溃时)几乎不可能。
即便如此,如果有人真的想破解你的软件,他会在汇编层面这样做,可能使用加载软件或其他诡计——无论你试图做什么来阻止他。许多公司都尝试过,但没有一家成功。使用这样的 hack 只会让最终用户感到沮丧,因为他们可能会使应用程序崩溃,甚至会使 Windows 的内置调试器崩溃。
不要浪费时间考虑混淆,而应该改进程序。
“混淆的可执行文件”没有意义。硬件必须能够“理解”能够执行它的代码,并且硬件可以理解它,逆向工程人员可以理解它。你能做的最多就是让理解变得更加乏味,但可能不会太多,而且是有代价的。
让它变得更难?当然。请不要那样做。
为了防止它?不。任何要运行二进制文件的系统都需要该软件来解密您提出的任何方案。他们将能够对其进行反编译,然后查看您的模糊二进制文件是如何被解释的。
如果有商业利益,为什么要混淆代码?老实说,假设商业代码已经足够优化和混淆,并且可以工作,那么所有令人尴尬的事情的母亲发生了 - 一个小故障......你被卡住了恕我直言,因为生产二进制代码被混淆了,这使得它更难调试发生故障且难以复制的位置,它将永远停留在 BUGS 列表中...
例如,试图找到堆栈跟踪,你最终会失去更多的头发,然后试图找出反汇编代码来计算 WTF 正在那里发生,无尽的意大利面条循环。简而言之,不要!
你最终会在尝试调试故障时赔钱......要么你必须是一位出色的汇编专家才能读取内存转储并从混淆代码中解决......不要把它扔掉,只是让你的漂亮产品工作并出售它......当然,有很多人有时间通过逆向工程代码来破坏它......
打败的秘诀就是经常发布,经常发布,在发布中不断改进,这样最新最好的功能就会比破解者拆机的时间更新和工作!查看 linux 源代码,补丁进来,然后发布......如果你牢记这个原则,通过以更快的速度发布具有更多功能的新版本,那么你就赢了!
修改后的微型 C 编译器以生成混淆代码:http: //blogs.conus.info/node/58
使事情变得稍微困难的一种方法是打包它们。 UPX将打包您的二进制文件,这使得开箱即用的反编译变得更加困难。从技术上讲,可以解包然后反编译,但它会提高一点标准。假设您在普通用户操作系统上运行,那么在不使用讨厌的技巧的情况下,您可以做很多事情来防止反编译。
如果你真的想把它弄乱,你需要一个单独的程序来做。作为开发人员,您以最简洁、最易读的形式编写代码。编译后运行单独的应用程序来进行混淆。您可以以大约 10 万美元的价格购买此类应用程序。
如果您的意图是阻止代码被逆向工程,那可能会起作用。如果您的目的是阻止某人破解安全性,那么仅靠混淆不会阻止坚定的攻击者。在某些时候,有一个是/否的决定,他们不需要理解代码来找到它,也不需要规避它。
为这里的答案提供一些理论支持:2001 年Barak 等。人。证明了程序混淆在一般情况下是不可能的。