关于c#:保护.NET代码免受逆向工程的影响?

Protect .NET code from reverse engineering?

混淆是一种方法,但它无法保护应用程序的盗版保护安全。如何确保应用程序没有被篡改,以及如何确保注册机制不能被反向工程?

此外,将C应用程序转换为本机代码也是可能的,而且Xenocode的成本太高。

C语言提供了很多特性,并且是我的代码的理想语言,所以在C++中再次编写整个代码库是不可能的。

安全证书可以很容易地从.NET中的已签名程序集中删除。


你不能。

您可以采取一些步骤使其变得更加困难,但最终本地计算机上的任何可执行文件都是可破解的。最终,这些代码必须转换为本机代码,并且每个可运行的应用程序都容易受到攻击。

你想做的只是让它变得足够难破解,使它不值得人们的麻烦。

我有一些建议可以帮助您保护您的应用程序:

  • 混淆你的代码。Dotfuscator有一个免费的版本,并随Visual Studio一起提供。
  • 使用公钥/私钥或非对称加密来生成产品许可证。这样可以确保只有您才能生成许可证代码。即使您的应用程序被破解,您也可以确保它们不会为您的应用程序释放密钥生成器,因为无法反转密钥生成算法。
  • 使用第三方打包程序将.NET可执行文件打包到加密的win32包装应用程序中。西米达是其中一个更好的。这会阻止人们在.NET Reflector中反映您的应用程序,并使解包进行反向操作变得困难。
  • 编写自己的自定义打包程序。如果第三方包装商太贵,考虑自己写。有时,定制的打包程序可能非常有效,因为没有很好地发布如何解包它们的方法。关于如何编写自己的win32 packer的教程提供了大量关于编写自己的win32 packer的信息。

最终,如果人们希望你的应用程序被破解,他们会的。看看所有的商业软件,它们有大量的资源来保护它们的应用程序,但是它们在应用程序公开之前就被破解了。

一个熟练的逆向工程师可以启动IDAPro,像切黄油一样切取应用程序,不管你做什么。一个打包的应用程序可以被解包,而混淆只能阻止它在公园里散步。使用复杂的许可证代码所做的所有努力都可以通过一个单字节补丁来撤销。

你只需要承认人们很有可能会盗版你的软件。有些人永远不会为你的申请付钱,不管是什么,这些人是你不需要担心的人。

然而,有许多企业永远不会冒着诉讼的风险,乐意购买软件许可证,还有许多计算机用户,他们要么不想冒风险,要么发现错误,要么不具备足够的技术知识来盗版。这些是您真正的客户,您应该将精力集中在为他们提供良好的用户体验上,而忽略那些破解您的软件的人。

我以前把我的申请盗版过,我把它当作是对个人的侮辱。我在这里,一个小时间的开发人员,把我的心和灵魂倾注到一个应用程序中,而这些人有胆量从我这里剽窃?他们直接从我口袋里拿钱!

我立即添加了一堆严苛的DRM代码,并试图用非法或破解的副本破坏任何人。当然,我应该努力改进我的应用程序,而不是试图阻止不可避免的事情发生。不仅如此,我还伤害了我真正的客户,因为我给他们提供了额外的保护。

经过一场长时间的战斗,我意识到我在和潮汐搏斗,而所有这些浪费的时间都是徒劳的。除了准系统的许可证功能外,我把所有的手机代码都取出来了,再也没有回头看。


您不能完全保护任何应用程序(托管或不托管)。如果像PlayStation和iPad这样的系统能够被破解,那么供应商甚至可以控制硬件,那么您的应用程序有什么希望呢?谢天谢地,你真的不想。在我看来,你需要保证你的应用程序的安全,以防有人无意中盗版你的产品,而且不会再有了。好的。型

例如,如果您使用每台机器的许可证,那么在新的第二台机器上安装它时,它不应该只起作用。您需要一个好的错误消息来防止额外的支持呼叫,但是不要花费额外的时间让工作变得过于困难,也不要用它来攻击用户的头部。好的。型

另一个例子是限时审判。甚至不用担心简单的事情,比如用户是否可以回滚系统时钟。这样做的人知道他们违反了您的许可证,只要用户知道他们什么时候违反了许可证,您就已经做得够多了。好的。型

你需要做很多,因为用户不关心你的许可证。许可证是由别人不关心的东西组成的,除非他们需要。没有人读,他们真的不应该读。因此,告诉用户边界的最佳方法是,应用程序的开箱即用行为是否符合许可证。在第一种情况下,这意味着第二次无法安装或以试用版模式安装。对于后者,可能只意味着检查配置文件中的纯文本日期。无论哪种方式,都要确保你以优雅、乐于助人和尊重的方式处理它。好的。型

所以这就解释了这意味着做那么多。但为什么不进一步呢?为什么不把你能找到的每个小孔都塞住呢?答案分为两部分。首先,如果有人会越过有意识地违反您的许可条款的道德门槛,即使是以简单的方式,他们也会愿意做一些更困难或更危险的事情,例如从Torrent站点拉取您的应用程序,并且运行从不真实下载的应用程序会有一定的危险。Ted来源。对这些用户来说,让它变得更难只是一个小麻烦,而且可能会给付费客户带来问题。保持简单可能会阻止某人深入您的应用程序并释放出更全面的裂缝。第二,你几乎没有眼睛来寻找缺陷;黑客有很多,他们有更多的实践去发现缺陷。你只需要错过一个小小的缺陷,你的应用程序就会像你什么都不做一样在盗版网站上发布。你每次都必须是对的,他们只需要幸运一次。所以所需的努力是非常高的,任何衡量成功的方法的可能性都非常低。好的。

最终,如果有人想要盗版您的应用程序(而不是仅仅使用它),这是他们的主要目标,他们会的。你没办法阻止他们。这就是软件的本质;一旦组成产品的文件在用户的计算机上,他们就可以随心所欲地使用它们。这在Java或.NET等托管环境中尤其相关,但它也同样适用于本机代码。时间站在他们一边,如果有足够的时间,任何数字安全都可能被破坏。好的。

既然你不能阻止用户盗版你的产品,你最好的做法就是让这类用户参与进来,让他们从中受益。通常可以让他们为你工作而不是与你作对。考虑到这一点,不管您的应用程序是什么,保持一个几乎完全正常运行且不会过期的免费版本可能是值得的。即使是1美元的价格标签和免费的价格之间的差异是巨大的,如果没有其他原因,客户不必相信你与他们的信用卡。你的产品的免费版本不仅会有效地杀死盗版发行(当你能以同样的价格合法时,为什么要冒盗版的风险?)它有潜力极大地扩大你的受众。好的。

结果是,你可能需要提高付费版的价格,这样最终你就有了10万个免费用户,而不是2000个20美元的用户,其中500个愿意为"专业版"支付99美元。这比你花大量时间锁定你的产品赚的钱还要多。除此之外,您还可以让这些自由用户参与进来,并以多种重要方式利用这种关系。好的。

一是支持。悲观主义者会利用这个机会抱怨支持100000个免费用户的成本增加,但令人惊讶的是:你的产品基本上是自我支持的。在大型开放源码项目中,您可以一直看到这一点,因为这些项目没有用于支持成本的资金。用户将奋起直追。好的。

免费用户开始时通常会降低支持期望,这是有原因的。你所需要做的就是将免费版标记为只具备社区支持的资格,并为此建立一个用户主持的在线论坛。您的支持知识库是自动生成的,高级用户将为您管理那些需要额外帮助的人。更重要的是,这将使您更快地识别和纠正错误,最终提高产品质量并降低总体支持成本。这在以前是不可能的,因为你的用户群不够大,但当你把免费用户当作客户时,它可以很好地工作。好的。

另一个是反馈。通过观看你的论坛,你会学到一些你可能从未考虑过的重要的改进想法。这可以让你最终把更多的免费用户变成付费用户,创造一个更具吸引力的产品,吸引更多的用户。好的。

最后,你需要考虑市场营销。所有这些免费用户现在都是粉丝而不是对手,他们将采取相应的行动。不仅如此,而且在发布您的下一个版本时,这些用户将通过您批准的分发渠道,而不是其他一些未知机制。这意味着在下一个版本中,你开始与一个更大的、高度感兴趣的、支持你的读者建立联系。好的。

为专业版保留的最佳功能是旨在简化企业部署和管理的工具。一个黑客不会把这些看作是一个足够令人信服的理由来为他自己的使用而入侵它,但是对于一个想要购买300个许可证并将其推出公司范围的企业来说,这是必须的。当然,专业版无论如何都会被盗版,但再次重申:不要担心,因为不管你做了什么,你都可能无法将产品卖给那些盗版者,所以这不会给你带来任何收入。好的。

虽然从心理上讲,很难把你的产品这么多地分给别人,但希望你能理解它到底是什么样的最好方式。不仅如此,从长远来看,这也是唯一的出路。我知道外面有人认为他们不想这样做。毕竟,多年来,他们一直很好地销售他们锁定的20美元产品。但那太糟糕了,因为如果你不这样做,最终会有其他人这样做。而且他们的产品也会和你的一样好,或者说离你足够近,他们就可以不说了。然后突然间,你的价格看起来暴跳如雷,销售量急剧下降,你无能为力。如果必须的话,你可以选择增加一个中间阶层,但这不太可能对你有所帮助。好的。好啊。


根据我的经验,使您的应用程序或库更难破解会伤害到您诚实的客户,而只是稍微延迟不诚实的客户。专注于制造一个伟大的,低摩擦的产品,而不是花大量的精力来延迟不可避免的事情。


你和很多人分享的秘密不是秘密。如果你的代码中有秘密内容,那么混淆它并不是一种保护;它只需要被去除一次身份。如果你有一个不想与客户分享的秘密,那就不要与客户分享。将您的代码作为Web服务编写,并将超级机密代码保存在您自己的服务器上,只有您才能看到它。


从广义上讲,那里有三组人。

  • 那些不会购买你的软件并诉诸于破解的人,或者如果他们找不到,根本就不使用你的软件。不要指望从这个群体中赚钱。他们要么依靠自己的技能,要么依靠黑客(他们倾向于根据你的有用性和你的听众有多大来优先安排他们的时间)。越有用,裂纹越早出现)。

  • 购买(支付)您的软件的合法用户组,与您使用的保护机制无关。不要使用精心设计的保护机制让合法用户的生活变得困难,因为他们无论如何都要为此付出代价。一个复杂的保护机制很容易破坏用户体验,而您不希望这种情况发生在这个组中。就我个人而言,我反对任何硬件解决方案,这会增加您的软件成本。

  • 少数人不会诉诸于"不道德的"破解,并且会为您的软件付费,因为它的功能受到许可机制的保护。你可能不想让这群人很容易规避你的保护。然而,你花在保护软件上的所有努力都会得到回报,这取决于这群人有多大。这完全取决于您正在构建的软件类型。

考虑到你所说的,如果你认为有足够多的少数人可以被推到购买你的软件上,那就去实施某种形式的保护吧。想想你能从这个少数群体中赚多少钱,而不是你花在保护上的时间,或者你花在第三方保护API/工具上的金额。

如果您希望实现自己的解决方案,那么使用公钥加密是一种很好的方法(与对称算法相反),可以防止容易的黑客攻击。例如,您可以对您的许可证(序列号或许可证文件)进行数字签名。解决这一问题的唯一方法就是对代码进行反编译、修改和重新编译(使用Simucal答案中建议的技术可能会更难)。


你不能阻止人们破解你的软件。

但是,你可以让他们制造裂缝,从而减少对你销售的伤害。可以为软件发布有效注册码的密钥生成器比从软件中删除注册激励的简单补丁更糟糕。这是因为一个漏洞只对一个软件版本有效,并且在下一次发布软件更新时将停止工作。密钥生成器将继续工作,直到您更改注册密钥算法,而这是您不想经常做的事情,因为它会让您诚实的客户望而却步。

因此,如果您正在寻找一种方法来为您的软件与非法的密钥生成器作斗争,并且您不想使用非对称加密,因为这会生成较长的注册码,那么您可能会看到部分密钥验证。

部分密钥验证确保每个非法的密钥生成器只对软件的一个特定版本起作用。基本上,您要做的是确保软件的每个版本都只与检查注册码某些数字的代码链接。哪些数字是随机的,所以cracker必须对软件的许多不同版本进行反向工程,并将所有这些内容组合到一个keygenerator中,以便释放一个适用于软件所有版本的keygenerator。

如果您定期发布新的软件版本,这将导致大量的密钥生成器散布在各种软件盗版档案上,而这些档案已经不起作用了。潜在的软件盗版者通常会在最新版本中寻找漏洞或keygen,因此他们可能会尝试其中的一些,最终放弃。

我在我的(C++)更新的共享软件游戏中使用了部分密钥验证,它非常有效。在我们有很多无法抗争的钥匙发生器问题之前。后来出现了许多裂缝和一些只适用于游戏特定版本的密钥生成器,但没有任何密钥生成器可以适用于所有版本。我们定期发布非常小的游戏更新,并使所有以前存在的裂缝无用。

似乎有一个用于部分密钥验证的开源.NET框架,尽管我没有尝试过。


  • 使用联机更新阻止那些未经授权的副本。

  • 验证应用程序不同模块的序列号,不要使用单个函数调用来进行验证(这样cracker就不能轻易地绕过验证)。

  • 不仅检查序列号启动时进行验证保存数据,每周五做一次晚上,在用户空闲时进行…

  • 验证应用程序文件检查SUM,把你的安全支票金额存入不同的地方。

  • 在这种情况下不要太过分技巧,确保你的应用程序切勿碰撞/发生故障验证注册码时。

  • 为用户构建一个有用的应用程序是比不易破碎的二元饼干。


你可以…BR/>

Microsoft SLP Servicesinishtech的软件潜力提供了在不影响应用程序功能的情况下帮助保护代码的能力。

更新:(公开:我在eazfuscator.net上工作)什么使得微软SLP服务的虚拟化能力不同,所以你肯定可以。从最初提出这个问题已经过去了几年;现在有更多的产品也在类似的基础上工作,例如:

  • AGIL.NET
  • EasfStoCARO.NET


.NET Reflector只能打开"托管代码",这基本上意味着.NET代码。因此,你不能使用它来分解COM DLL文件、原生C++、经典Visual Basic 6代码等。编译的.NET代码的结构使得它非常方便、可移植、可发现、可验证等。.Net反射器利用这一点来让你参与编译的程序集,但反编译程序和反汇编程序绝不是.NET A所特有的。只要编译器存在,nd就一直存在。

您可以使用模糊器使代码更难阅读,但如果不使它对.NET不可读,就不能完全阻止它被反编译。有一些产品(通常很贵)声称将托管代码应用程序"链接"到本机代码应用程序,但即使这些产品确实有效,一个有决心的人总会找到一种方法。

然而,当涉及到困惑的时候,你会得到你付出的代价。因此,如果您的代码是如此专有,以至于您必须竭尽全力保护它,那么您应该愿意投资于一个好的模糊器。

然而,在我15年左右的代码编写经验中,我已经意识到过度保护源代码是浪费时间,而且没有什么好处。仅仅在没有支持文档、注释等的情况下阅读原始源代码是很难理解的。再加上反编译器产生的毫无意义的变量名和现代模糊器产生的意大利面代码,你可能不必太担心人们窃取你的知识产权。


如果你想让人们能够运行你的代码(如果你不想,那你为什么要首先编写它?),然后他们的CPU需要能够执行您的代码。为了能够执行代码,CPU需要能够理解它。

由于CPU是哑的,而人类不是,这意味着人类也可以理解代码。

只有一种方法可以确保你的用户不会得到你的代码:不要给他们你的代码。

这可以通过两种方式实现:软件即服务(SaaS),即在服务器上运行软件,并且只允许用户远程访问。例如,这是堆栈溢出使用的模型。我很确定堆栈溢出不会混淆它们的代码,但您无法对其进行反编译。

另一种方法是设备模型:您没有给用户提供代码,而是给他们一台包含代码的计算机。这是游戏机、大多数移动电话和TiVo使用的模式。请注意,只有当您"拥有"整个执行路径时,这才有效:您需要构建自己的CPU、自己的计算机、编写自己的操作系统和自己的CLI实现。然后,只有这样你才能保护你的代码。(但请注意,即使是最微小的错误也会使您的所有保护失效。微软、苹果、索尼、音乐和电影业都可以证明这一点。)

或者,您可以什么也不做,这意味着您的代码将自动受到版权法的保护。


它真的值得吗?只要有足够的决心,就可以破坏每一种保护机制。考虑你的市场、产品价格、客户数量等。

如果你想要更可靠的东西,那就沿着硬件键的路径走,但这相当麻烦(对用户而言),而且更昂贵。软件解决方案可能会浪费时间和资源,它们唯一能给你的就是错误的"安全感"。

再没有什么想法了(没有一个是完美的,因为没有一个是完美的)。

  • 反重复
  • 改变语言,使用Skype作者使用的好技巧
  • 许可证服务器

不要在上面浪费太多时间,因为饼干在典型的技术方面有很多经验,而且离你只有几步之遥。除非您想使用大量资源,否则可能需要更改编程语言(使用Skype方式)。


不幸的是,你不会逃避这个。最好的办法是用C和P/Invoke编写代码。

有一个小的catch-22,有人可以将您的应用程序反编译到cil并终止任何验证/激活代码(例如,对C库的调用)。记住,用C语言编写的应用程序也被更持久的黑客逆向工程(看看现在破解游戏有多快)。没有什么可以保护您的应用程序。

最后,它的工作方式非常像你的家,保护它足够好,以至于它是太多的努力(意大利面条代码将帮助这里),使攻击者只是移动到你的隔壁邻居(竞争:)。看看Windows Vista,一定有10种不同的破解方法。

有一些软件包可以加密您的exe文件,并在允许用户使用它时对其进行解密,但再次说明,这是使用一个毫无疑问已被破解的通用解决方案。

激活和注册机制针对的是"普通人":那些没有足够的技术知识来绕过它的人(或者就这点而言,他们知道自己可以绕过它)。别烦饼干了,他们手头时间太多了。


除了购买保护之外,您(或您的开发人员)还可以学习复制保护。

这些想法是:

首先,尝试编写一个将自己写入控制台的程序。这是一个著名的问题。此任务的主要目的是练习编写自引用代码。

第二,您需要开发一种技术,以某种方式重写一些代码。可依赖于其他方法的CIL。

您可以编写虚拟机(在.NET中)。在里面放一些代码。最终,虚拟机运行另一个运行代码的虚拟机。对于很少调用的函数的一部分来说,这是为了避免过多地降低性能。

将一些逻辑重写为C++ /CLI,并将托管代码与非托管代码混合。这将使拆卸变硬。在这种情况下,也不要忘记提供x64二进制文件。


对。这是真的。如果代码没有混淆,.NET代码非常容易进行反向工程。

模糊化会给那些试图对你的软件进行反向工程的人增加一层烦恼。根据您获得的版本,您将获得不同级别的保护。

Visual Studio包含一个Dotfuscator版本。因为它是捆绑版本,所以您肯定不会得到最强烈的混淆。如果您查看它们的功能列表,您将看到您遗漏了什么(以及应用程序将如何使代码更安全)。

有几个其他的免费或开源的.NET模糊器(但我不能评论它们的质量或使用的各种方法):

  • 笨蛋车
  • Babel.NET

最后,没有什么是完美的。如果有人真的想看看你的软件是如何工作的,他们会的。


好吧,你不能完全保护你的产品不被破解,但是你可以最大化/提高安全级别,让它有点太难被新手和中间人破解。

但请记住,没有什么是不可破解的,只有服务器端的软件得到了很好的保护,并且不能被破解。无论如何,为了增强应用程序中的安全级别,您可以执行一些简单的步骤来防止一些破解程序"并非全部"破解您的应用程序。这些步骤会让这些饼干变得疯狂,甚至绝望:

  • 混淆源代码,显然这会使源代码看起来一团糟,不可读。
  • 在应用程序中触发几个随机检查例程,比如每两小时、24小时、一天、一周等,或者在用户执行每个操作之后。
  • 将发布的应用程序的MD5校验和保存在服务器上,并实现一个例程,该例程可以检查当前文件的MD5校验和与服务器端的实际文件的MD5校验和,并使其随机触发。如果MD5校验和已更改,则表示此副本已被盗版。现在您可以直接阻止它,或者发布一个更新来阻止它,等等。
  • 尝试创建一个例行程序,检查您的一些代码(函数、类或特定的例行程序)是否确实被修改、更改或删除。我称之为(代码完整性检查)。
  • 使用免费的未知打包程序打包应用程序。或者,如果你有钱,去寻求商业解决方案,比如Thamida或.NET reactor。这些应用程序会定期更新,一旦黑客打开应用程序包,您就可以从这些公司获得新的更新,一旦获得新的更新,您就只需打包程序并发布新的更新。
  • 定期发布更新,并强制客户下载最新更新。
  • 最后让你的应用程序非常便宜。别让它太贵了。相信我,你会得到更多快乐的客户,而Cracker只会离开你的应用程序,因为他们花时间破解一个非常便宜的应用程序是不值得的。

这些只是简单的方法,以防止新手和中间饼干破解您的应用程序。如果您有更多的想法来保护您的应用程序,不要羞于实现它们。这只会让crackers生活困难,他们会感到沮丧,最终他们会离开你的申请,因为这不值得他们花时间。

最后,您还需要考虑将时间花在编写优质的应用程序上。不要浪费时间编写复杂的安全层。如果一个好的破解者想要破解你的应用程序,他/她将不管你做什么…

现在去为饼干做些玩具吧…


还有Salamander,它是来自RemoteSoft的本机.NET编译器和链接器,可以在没有.NET框架的情况下部署应用程序。我不知道它有多符合自己的要求。


如果微软能想出一个解决方案,我们将不会有盗版的Windows版本,所以没有什么是非常安全的。下面是一些来自堆栈溢出的类似问题,您可以实现自己的保护方法。如果你发布的是不同的版本,那么你可以对不同的版本采用不同的技术,所以当第一个版本被破解时,第二个版本就可以被接管了。

  • 基于C++应用程序的许可证特征管理

  • 使用许可证文件保护DLL文件

  • 许可/保护软件?


净电抗器

更新

贾里德指出,de4dot声称能够对其进行反编译。

.NET Reactor provides complete protection for your sensitive intellectual property by converting your .NET assemblies into unmanaged processes which cannot be understood as CIL, and which no existing tool can decompile. Hackers have no access to any intelligible form of your source.

Powerful and flexible, the .NET Reactor licensing features allow you to enforce your license conditions and protect your revenue stream by using hardware and software locks. The license manager can build trial or permanent licenses, in a matter of seconds. A fully documented software development kit (SDK), complete with examples, allows you to call the licensing system directly from your code, allowing you to create custom extensions to the licensing system.


这里有一个想法:您可以拥有一个由您的公司托管的服务器,您的软件的所有实例都需要连接到该服务器。仅仅让他们连接并验证一个注册密钥是不够的——他们只会取消检查。除了密钥检查之外,您还需要让服务器执行一些客户机本身无法执行的重要任务,因此不可能删除这些任务。当然,这可能意味着您的服务器部分需要大量的处理,但这会使您的软件很难被窃取,并且假设您有一个好的密钥方案(检查所有权等),那么密钥也很难被窃取。这可能比你想要的更具侵略性,因为它需要你的用户连接到互联网上才能使用你的软件。


在客户机上运行的任何东西都可以被反编译和破解。定影只是让它更难。我不知道你的申请,但99%的时候我只是觉得不值得你这么努力。


混淆代码!在模糊C代码中有一个例子。


如果它是用.NET编写并编译到CIL的,就可以反映出来。如果安全性是一个问题,并且要避免混淆,那么我建议使用非托管语言编写应用程序,这本质上很难进行反向工程。


How to make sure that the application is not tampered with, and how to make sure that the registration mechanism can't be reverse engineered.

两者都有同样简单的答案:不要将对象代码分发给不受信任的方,例如(显然)您的客户。在您的机器上承载应用程序是否可行,只取决于它做了什么。

如果它不是一个Web应用程序,也许您可以允许ssh登录x转发到一个应用服务器(或者远程桌面连接,我猜,对于Windows)。

如果你给书呆子类型的人提供对象代码,他们认为你的程序破解起来可能很有趣,那么它就会被破解。不可能。

如果你不相信我,请指出一个没有被破解和盗版的高知名度应用程序。

如果您使用硬件密钥,它将使生产成本更高,而且您的用户会因此而讨厌您。在地板上爬来爬去,插上27个不同的USB接口,真是个婊子,因为软件制造商不信任你(我想)。

There are packages out there that will encrypt your EXE and decrypt it when the user is allowed to use it

当然,解决这个问题的方法是破解"can-i-use-it"测试,这样它总是返回真值。

一个令人讨厌的技巧可能是以一种肮脏的方式使用在程序中其他地方执行测试的操作码的字节值,除非该值正确,否则很可能会使程序崩溃。但是,它使您链接到一个特定的体系结构:-(


只是要添加一个警告:如果你要使用模糊,请检查所有东西是否仍然工作!模糊可能会改变类和方法的名称。因此,如果您使用反射来调用某些方法和/或类(如在插件体系结构中),您的应用程序可能会在模糊后失败。此外,stacktrace可能无法跟踪错误。


当涉及到.NET时,如果您要发布一个Windows窗体应用程序(或者客户机具有可移植可执行文件的任何应用程序),它就能够被破解。

如果您希望坚持使用.NET,并希望尽可能减少获取源代码的机会,那么您可以考虑将其作为ASP.NET应用程序部署到Web服务器上,而不是将其作为Windows窗体应用程序。


请记住,99%以上的用户不会对检查可执行文件以了解其工作原理感兴趣。

考虑到这么少的人会费心去尝试,而且大多数的混淆器都可以工作,这值得你花时间和精力吗?

你最好把时间花在改进你的产品上,这样会有更多的人想要使用它。


我可以推荐使用模糊器。


只要做一个好的应用程序和代码一个简单的保护系统。不管你选择什么样的保护,它都会被逆转…所以不要浪费太多时间/金钱。


坦率地说,有时我们需要混淆代码(例如,注册许可证类等)。在这种情况下,您的项目不是免费的。在我看来,你应该为一个好的接班人买单。

Dotfuscator隐藏了您的代码,而.NET Reflector在您试图对其进行反编译时会显示一个错误。


很抱歉,完全保护应用程序是不可能的。


最好的答案是小开发人员从他自己的经验中说的第一个,上面讨论的所有反反转技术对于任何一个严重的反向工程师来说都是101个教科书案例。

一些商业的DRM解决方案相当不错,但它们可以在数小时(或数天)内随时用定制的DRM解决方案破解每一个AAA游戏。只有一个全新的DRM解决方案的推出——有时——不可避免地会延迟几周。

充分利用DRM需要花费大量的时间和金钱,而且很容易损害性能、可靠性、兼容性/可移植性和客户关系。要么坚持一些体面的商业数字版权管理,而不是太聪明,采取(少)你的损失或只是完全忘记它…

一个挖掘自己(商业)坟墓的DRM解决方案示例:http://en.wikipedia.org/wiki/starforce


我还在设计中考虑了一些关于黑客安全的问题,并希望添加它们,因为其中一些似乎没有被提及:

我的应用程序中有一个脚本接口。为了确保这一点,脚本只能调用(python)打算调用的方法——脚本i有一个scriptVisibilityAttribute和识别这些属性的system.dynamic.dynamicmetaObjectProvider。

许可证使用公钥/私钥。

视图模型需要解锁,并提供解锁功能的密码。

核心例程可以在加密狗上实现。(周围有支持它的软件狗)

像包装纸这样的大解决方案没有计划。

当然,这种脚本/视图模型Apporach并不会使从代码中解锁和调用脚本不可见的函数变得不可能,但它会使这样做变得更加困难——就像所有与反黑客工作相关的功能一样。


是的,.NET二进制文件(exe和dll)可以很容易地反编译成几乎源代码。检查工具.NET Reflector。只需对任何.NET二进制文件进行尝试。最好的选择是模糊文件,它们仍然可以被.NET Reflector分解,但是它们会造成不可读的混乱。我不认为好的模糊器是免费的或便宜的。一个是随Visual Studio提供的Dotfuscator社区版。


根据微软博客下面的问题:

How to prevent ILDASM from disassembling my .NET code

如何防止ILDASM分解组件?

.NET有一个名为SuppressIldasmAttribute的属性,它可以防止反汇编代码。例如,考虑以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Text;
using System.Runtime.CompilerServices;
[assembly: SuppressIldasmAttribute()]

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world...");
        }
    }
}

正如你所看到的,只有两个不同之处:

  • 我们增加了System.Runtime.CompilerServices名称空间减速。

  • 我们添加了[assembly: SuppressIldasmAttribute()]属性。

  • 在Visual Studio中构建应用程序后,当我们试图在ILDASM中打开生成的exe文件时,现在得到以下消息:

    enter image description here