如何防止我的代码被盗?

时间:2010-02-25 23:05:56

标签: c# .net reverse-engineering managed cil

启动.NET exe时会发生什么?我知道C#被编译为IL代码,我认为生成的exe文件只是启动运行时并将IL代码传递给它的启动器。但是怎么样?它的复杂程度如何?

IL代码嵌入在exe中。我认为它可以从内存中执行而无需将其写入磁盘而普通的exe不是(好的,是的,但它非常复杂)。

我的最终目标是提取IL代码并编写我自己的加密启动器,以防止scriptkiddies在Reflector中打开我的代码并轻松窃取我的所有类。好吧,我无法完全阻止逆向工程。如果他们能够检查内存并抓住我将纯IL传递给运行时的那一刻,那么无论是否是.net exe都没关系,是吗?我知道有几个混淆器工具,但我不想弄乱IL代码本身。

编辑:所以似乎不值得尝试我想要的东西。无论如何他们都会破解它...所以我会寻找一个混淆工具。是的,我的朋友也说,将所有符号重命名为无意义的名称就足够了。毕竟逆向工程并不那么容易。

7 个答案:

答案 0 :(得分:37)

如果您绝对坚持加密程序集,可能最好的方法是将程序代码放入类库程序集并加密它们。然后,您将编写一个小的存根可执行文件,将程序集解密到内存中并执行它们。

这是一个非常糟糕的主意,原因有两个:

  1. 您必须在存根中包含加密密钥。如果1337黑客可以有意义地使用您的反射组件,他可以轻松窃取您的加密密钥并自己解密。 (这基本上是Analog Hole
  2. 没有人关心您的1337代码。对不起,但这是一种强烈的爱。没有人认为任何人的代码几乎和作者一样有趣。

答案 1 :(得分:26)

与数千人分享的“秘密”并不是秘密。请记住,你的攻击者只需打破你的琐碎 - 破解 - 因为关键是正确的“加密”方案一次。

如果您的代码非常有价值,必须保密,那么保密。将代码仅保留在您自己的服务器上;将您的软件编写为Web服务。然后保护服务器。

答案 2 :(得分:20)

  

生成的exe文件只是一个启动运行时并将IL代码传递给它的启动程序。

不完全是。您可以通过不同的方式设置程序,但通常将IL代码编译为与运行时一起运行的本机机器代码。

至于小孩 - 如果你认为你可以向他们或任何使用他们重新分配的东西的人出售,你就是在欺骗自己。如果他们无法解锁您的应用,他们将继续前进并找到他们能够或不能做的事情。它们的潜在销售额恰好为0美元;因为没有投资回报而花费太多精力试图阻挠他们是没有意义的。一个基本的混淆器可能没问题,但不要超过这个。

实际上,大多数开发人员面临着来自默默无闻而非盗版的更大挑战。你做的任何事情都会阻止你对你的产品说出来,这比海盗更能伤害到你。这包括让人们付钱来获得它。大多数情况下,更好的方法是拥有一个免费版本的应用程序,孩子们甚至不需要解锁;已经适合他们的东西,破解你的应用程序只会浪费他们的时间,而不仅仅是时间或功能有限的试用。让他们和尽可能多的其他人广泛传播。

现在我知道你最终需要一些付费用户。关键是现在使用从免费产品中获得的所有关注来追加销售或推广其他更有利可图的产品。这里的一个选择是还有一个高级版本,其中包含主要针对商业用户的附加功能;比如让它易于部署到整个网络并以这种方式管理。企业拥有更大的资金,更有可能支付许可费。然后,您的免费版本可用于宣传您的产品,并为您的企业客户提供合法性。

当然,还有其他型号,但无论你做什么,都值得记住,默默无闻是一个更大的挑战,你的软件的盗版副本永远不会转化为销售。最终(当然这取决于你的执行)你将能够通过一个利用这些积分的商业模式赚取更多的钱,而不是试图与它们作斗争。

答案 3 :(得分:6)

  

“...阻止scriptkiddies打开我的   反射器中的代码,只是窃取所有   我的课很容易。“

不幸的是,无论你如何模糊启动,调试器中的六个命令都要将当前运行的程序集转储到用户选择的文件中。因此,即使您可以像Brian建议的那样启动您的应用程序,也不难将该应用程序的组件运行到Reflector中(如果有人觉得它很有趣,我可以从WinDbg发布一个样本)。

混淆工具是从大量技术经验中创建的,通常旨在使调试程序难以可靠地附加到进程或从中提取信息。正如Brian所说:我不确定为什么你决定保留IL,如果你想要从脚本小子那里得到任何有意义的保护,那么你可能需要改变主意。

答案 4 :(得分:6)

“他们抄袭了他们所能追随的一切,但他们无法复制我的思想,所以我让他们大汗淋漓,偷了一年半。” - R. Kipling

答案 5 :(得分:3)

我个人认为混淆是要走的路。它很简单并且可以有效,特别是如果所有代码都在exe中(我不确定“弄乱IL”的问题是什么)。

但是,如果您觉得这对您不起作用,也许您可​​以加密您的exe并将其作为资源嵌入您的启动器中。处理它的最简单方法是解密exe资源并将其写出文件并执行它。 exe完成执行后,删除该文件。您也可以通过Emit函数运行它。我不知道这是如何工作的,但这里有一篇文章让你开始 - Using Reflection Emit to Cache .NET Assemblies

当然你的解密密钥可能也必须嵌入到exe中,所以有人确实能够解密你的程序集。这就是为什么混淆可能是最好的方法。

答案 6 :(得分:2)

this question复制我的答案(这不是完全重复,但可以用相同的答案回答,因此CW):

Windows EXE包含多个“部件”。 简化,.net代码(= MSIL)只是EXE的一部分,EXE中还有一个“真正的”原生Windows部分,作为.net的某种启动器。然后执行MSIL的框架。

Mono将只接受MSIL并执行它,忽略本机Windows Launcher的东西。

同样,这是一个简化的概述。

编辑:我担心我对深度depp细节的理解对于非常详细的细节来说还不够(我大致知道什么是PE Header,但不是真正的细节),但我发现这些链接有用:

NET Assembly Structure – Part II

.NET Foundations - .NET assembly structure

附录:如果您真的想深入了解,请在Advanced .net Debugging上获取副本。第一章准确解释了.net程序集在Windows XP之前和之后是如何加载的(因为XP,Windows Loader是.net意识到它从根本上改变了.net应用程序的启动方式)