繁体   English   中英

如何防止我的代码被盗?

[英]How do i prevent my code from being stolen?

启动.NET exe时会发生什么情况? 我知道C#已编译为IL代码,并且我认为生成的exe文件只是启动器,用于启动运行时并将IL代码传递给它。 但是如何? 这个过程有多复杂?

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

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

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

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

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

  1. 您将必须在存根中包含加密密钥。 如果1337年的黑客可以有意义地使用您反映的程序集,则他可以轻松地窃取您的加密密钥并自己解密。 (这基本上是模拟孔
  2. 没人关心您的1337代码。 对不起,那是艰难的爱情。 没有人认为任何人的代码都像作者一样有趣。

与成千上万的人共享的“秘密”不是秘密。 请记住,由于密钥是正确的,因此攻击者只需破坏一次琐碎就可以了,因为“加密”方案只发生了一次。

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

生成的exe文件只是启动器,该启动器启动运行时并将IL代码传递给它。

不完全是。 设置程序的方法有很多,但是通常IL代码会编译为在运行时进程中运行的本机代码。

至于小子,如果您认为自己可以卖给他们或使用他们再分配产品的任何人,那就是在自欺欺人。 如果他们无法解锁您的应用,他们会继续前进,找到他们可以或不需要的应用。 它们的潜在销售额恰好是$ 0; 花太多的精力去阻止它们是没有意义的,因为您的投资没有回报。 一个基本的混淆器可能很好,但不要超出此范围。

实际上,大多数开发人员面临的挑战是默默无闻,而不是盗版。 您所做的任何阻止您对产品进行宣传的行为都会比海盗造成的伤害更大。 这包括使人们付钱获得它。 大多数情况下,更好的方法是拥有免费版本的应用程序,而孩子们甚至都无需解锁。 对于他们来说已经足够好的东西了,破解您的应用只会浪费他们的时间,而不仅仅是时间或功能有限的试用。 让他们和尽可能多的其他人广泛传播。

现在我知道您最终确实需要一些付费客户。 关键是现在要利用您从免费产品获得的所有注意力来追加销售或推广其他更有利可图的产品。 这里的一个选择是也有一个高级版本,其附加功能主要针对商业受众。 例如简化部署到整个网络并以这种方式进行管理。 企业财大气粗,更有可能支付您的许可费用。 然后,您的免费版本可用来推广您的产品,并为您的商业客户提供合法性。

当然,还有其他模型,但是无论您做什么,都应该记住,晦涩难懂是更大的挑战,盗版软件永远都不会转化为销售。 最终(当然,这取决于您的执行情况),您将能够利用利用这些要点的商业模式赚取更多的钱,而不是尝试与之抗衡。

“ ...防止脚本对象在Reflector中打开我的代码,并轻松窃取我所有的类。”

不幸的是,无论您如何模糊启动,调试器中的六个命令都可以将当前正在运行的程序集转储到用户选择的文件中。 因此,即使您可以按照Brian的建议启动应用程序,也不难在运行该应用程序的组件后将其放入Reflector中(如果有人发现它很有趣,我可以从WinDbg发布示例)。

混淆工具是基于大量的技术经验而创建的,通常设计成使调试器难以可靠地附加到进程或从进程中提取信息。 正如Brian所说:我不确定为什么要下决心保留IL,并且,如果您想对脚本小子提供任何有意义的保护,那么您可能必须改变主意。

“他们复制了他们可以遵循的一切,但他们无法复制我的想法,所以我让他们流汗并偷窃了一年半。” -R.吉普林

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

但是,如果您觉得这样对您不起作用,则可以加密exe并将其作为资源嵌入到启动器中。 处理它的最简单方法是解密exe资源,并将其写出并执行文件。 exe完成执行后,删除文件。 您也许还可以通过Emit函数运行它。 我不知道这将如何工作,但是这里有一篇文章可以帮助您入门- 使用反射发射来缓存.NET程序集

当然,您的解密密钥也可能必须嵌入到exe中,以便真正确定的人无论如何都可以解密您的程序集。 这就是为什么混淆可能是最好的方法的原因。

这个问题中复制我的答案(并非完全重复,但是可以用相同的答案来回答,因此是CW):

Windows EXE包含多个“部分”。 简化后 ,.net代码(= MSIL)只是EXE的一部分,并且EXE中还有一个“真实的”本机Windows部件,它充当.net Framework的某种启动器,然后执行MSIL。

Mono将仅使用MSIL并执行它,而忽略本机Windows Launcher。

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

编辑:我担心我对深入的depp详细信息的理解不足以包含很多详细信息(我大致了解什么是PE标头,但不是真正的详细信息),但是我发现这些链接很有帮助:

NET组装结构–第二部分

.NET基础-.NET程序集结构

附录:如果您真的想更深入,请在Advanced .net Debugging上获取一个副本。 第一章准确地解释了Windows XP之前和之后如何加载.net程序集(从XP开始,Windows Loader就知道.net了,这从根本上改变了.net应用程序的启动方式)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM