【问题标题】:How do i prevent my code from being stolen?如何防止我的代码被盗?
【发布时间】:2011-01-21 06:05:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请参阅 MSDN,了解具体的 CorBindToRuntimeEx 函数和一般的 CLR 非托管 API。
  • 只是好奇:您是否考虑过使用混淆器来阻止逆向工程?它并不完美……但它几乎是开箱即用的
  • @David:.NET 未被解释。你从哪里得到那个的想法? IL 代码被即时编译成机器语言,并针对运行它的机器进行了优化。这与解释完全相反!
  • 我真的很想看到一些这种惊人的超级秘密代码,很多人认为它非常重要,不能被窥探。甚至 .NET Framework 本身也基本上是完全开放的。这里一定有一些令人兴奋的东西。
  • @JDMX:当然,他们得到了完整的源代码……没有文档、变量名或任何其他有助于真正理解翻译后的 IL 的东西。如果这就是某人敲诈你的全部,我不得不相信逆向工程几乎同样容易。

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


【解决方案1】:

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

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

  1. 您必须在存根中包含加密密钥。如果 1337 黑客可以有意义地使用您反射的程序集,他可以很容易地窃取您的加密密钥并自己解密它们。 (这基本上是Analog Hole
  2. 没有人关心您的 1337 代码。对不起,那是艰难的爱。没有人认为任何人的代码都像作者那样有趣。

【讨论】:

  • #2 - 当然。您能否使用数字证书进行解密,以替代嵌入加密密钥?
  • @Russell 我不确定数字证书会有什么帮助。如果代码要被执行,那么你不能永远对 CPU 隐藏它。迟早你必须给 CPU 代码,当你这样做时,一个可以访问机器的坚定的攻击者会在那里刷它。我真正的意思是,没有人有足够的决心去打扰甚至 ROT-13 解码某些东西,除非它会拉出金块。
  • 不用加密程序集——你可以只用 Perl 编码。
  • 我不同意“非常糟糕的主意”。我不在乎是否有人查看我的代码。我只是想让注册码检查更难被撕掉。如果这就像通过工具运行我的二进制文件一样简单,那么它完全值得。
  • “没人关心你的代码”——最差评论奖。这是商业、货币化、知识产权。
【解决方案2】:

与成千上万人分享的“秘密”并不是秘密。请记住,您的攻击者只需破坏您的微不足道的破解,因为密钥就在那里“加密”方案恰好一次。

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

【讨论】:

  • +1 用于网络服务。这是我阅读问题后的第一个想法。
  • 如果负责 Windows 激活和 WGA 的团队能够解决这个问题,那就太好了...... :)
【解决方案3】:

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

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

至于孩子们——如果你认为你可以卖给他们或任何使用他们重新分配的东西的人,那你就是在自欺欺人。如果他们无法解锁您的应用程序,他们会继续前进并找到一个他们可以或没有的应用程序。它们恰好代表 0 美元的潜在销售额;花太多精力试图阻止它们是没有意义的,因为您的投资不会有任何回报。一个基本的混淆器可能没问题,但不要超出这个范围。

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

现在我知道您最终确实需要一些付费客户。关键是现在利用你从免费产品中获得的所有注意力来追加销售或推广其他更有利可图的东西。这里的一种选择是还拥有一个高级版本,其中包含主要针对商业受众的附加功能;诸如使其易于部署到整个网络并以这种方式进行管理之类的事情。企业财力雄厚,更有可能支付您的许可费。然后,您的免费版本将用于推广您的产品并为您的企业客户提供合法性。

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

【讨论】:

    【解决方案4】:

    "...防止脚本小子打开我的 反射器中的代码,只是偷走所有 我的课很轻松。”

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

    混淆工具是根据大量技术经验创建的,通常旨在使调试器难以可靠地附加到进程或从中提取信息。正如布赖恩所说:我不知道你为什么决心保护 IL,如果你想要任何有意义的保护免受脚本小子的影响,那么你可能必须改变主意。

    【讨论】:

      【解决方案5】:

      “他们复制了他们能跟随的所有东西,但他们无法复制我的想法,所以我让他们流汗和偷窃一年半。” -- R.吉卜林

      【讨论】:

        【解决方案6】:

        我个人认为混淆是要走的路。它既简单又有效,尤其是当您的所有代码都在一个 exe 中时(我不确定“弄乱 IL”有什么顾虑)。

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

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

        【讨论】:

          【解决方案7】:

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

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

          Mono 只会获取 MSIL 并执行它,而忽略本机 Windows 启动器的内容。

          再次,这是一个简化的概述。

          编辑:我担心我对深度 depp 细节的理解不足以提供很多细节(我大致知道 PE Header 是什么,但不是真正的细节),但我发现了这些有用的链接:

          NET Assembly Structure – Part II

          .NET Foundations - .NET assembly structure

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-05
            • 2018-10-21
            • 1970-01-01
            • 1970-01-01
            • 2019-08-09
            相关资源
            最近更新 更多