我已经讨论了为什么我不认为混淆是防止破解的有效手段:
保护 .NET 代码免遭逆向工程 https://stackoverflow.com/questions/506282/protect-net-code-from-reverse-engineering/506301#506301
但是,您的问题具体是关于来源盗窃,这是一个有趣的话题。在埃尔达德·埃利亚姆斯的书中,“逆向:逆向工程的秘密 https://rads.stackoverflow.com/amzn/click/com/0764574817”,作者在前两章中讨论了源盗窃作为逆向工程背后的原因之一。
基本上,归根结底,您成为源盗窃目标的唯一机会是,如果您拥有一些与您的领域相关的非常具体的、难以设计的算法,这些算法可以让您在竞争中占据优势。这几乎是唯一一次尝试对应用程序的一小部分进行逆向工程具有成本效益的情况。
因此,除非您拥有一些您不希望竞争对手拥有的绝密算法,否则您无需担心源代码被盗。从应用程序中反转任何大量源代码所涉及的成本很快就会超过从头开始重写它的成本。
即使您确实有一些您不希望他们拥有的算法,您也无法采取太多措施来阻止意志坚定且技术熟练的个人获取它(如果应用程序正在他们的计算机上执行)。
一些常见的防逆转措施有:
- 混淆 - 在保护源代码或防止其被破解方面没有多大作用。但我们也可能不会让它变得完全容易,对吧?
- 第 3 方包装商 -Themida http://www.oreans.com/是较好的之一。将可执行文件打包到加密的 win32 应用程序中。如果应用程序也是 .NET 应用程序,则防止反射。
- 自定义加壳器 - 有时,如果您有能力的话,编写自己的加壳器是有效的,因为在破解场景中关于如何解压应用程序的信息非常少。这可以阻止没有经验的 RE。这tutorial http://www.codebreakers-journal.com/downloads/cbj/2006/CBM_1_2_2006_BigBoote_Own_Packer.pdf提供了一些有关编写自己的打包程序的好信息。
- 让行业秘密算法远离用户机器。将它们作为远程服务执行,因此指令永远不会在本地执行。唯一“万无一失”的保护方法。
然而,加壳程序可以被解包,并且混淆并不会真正妨碍那些想要查看您的应用程序正在做什么的人。如果该程序在用户计算机上运行,则它很容易受到攻击。
最终,它的代码必须作为机器代码执行,通常需要启动调试器、设置一些断点并监视相关操作期间正在执行的指令,并花一些时间仔细研究这些数据。
您提到您花了几个月的时间为您的应用程序编写约 20kLOC。如果您采取最低限度的预防措施,那么将应用程序中那些等效的 20kLOC 反转为可用源将花费几乎一个数量级的时间。
这就是为什么从您的应用程序中逆向小型的、行业特定的算法才具有成本效益。别的什么,都不值得。
以下面虚构的例子为例:假设我刚刚为 iTunes 开发了一款全新的竞争应用程序,该应用程序有大量的附加功能。假设需要几个 100k LOC 和 2 年的时间来开发。我的一个关键功能是一种根据您的音乐聆听品味向您提供音乐的新方式。
苹果(他们就是盗版者)听到了这一消息,并认为他们真的很喜欢你的音乐推荐功能,所以他们决定扭转它。然后,他们将只专注于该算法,逆向工程师最终将提出一种可行的算法,在给定相同数据的情况下提供等效的建议。然后他们在自己的应用程序中实现上述算法,称之为“天才”,并赚取下一个 10 万亿美元。
就是那样来源盗窃下跌降落。
没有人会坐在那里反转所有 100k LOC 来窃取已编译应用程序的大量内容。这样做成本太高,而且太耗时。大约 90% 的情况下,他们会逆向那些无聊的、非行业秘密的代码,这些代码只是处理按钮按下或处理用户输入。相反,他们可以聘请自己的开发人员以更少的钱从头开始重写大部分内容,并简单地反转难以设计且给你带来优势的重要算法(即音乐建议功能)。