保护.NET代码免受逆向工程?


491

混淆是一种方法,但是它不能防止破坏应用程序的盗版保护安全性。如何确保应用程序不受篡改,如何确保注册机制不能进行反向工程?

也可以将C#应用程序转换为本地代码,而Xenocode的成本太高。

C#提供了很多功能,并且是我的代码的理想语言,因此不再需要用C ++编写整个代码库。

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



@Andreas:太棒了!我去试试看。有人用吗?
2015年

1
@Jack仅适用于窗口商店应用程序。目前,桌面应用程序没有时间表(据我所知)。
泰勒·朗

如果您希望本机没有过时的C ++,请使用Delphi。无论如何,.Net的易用性来自Delphi。
William Egge

Answers:


671

你不能

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

您要做的就是使破解变得足够困难,使之不值得人们为之烦恼。

我为您提供一些有助于保护您的应用程序的建议:

  • 混淆您的代码。Dotfuscator有一个免费版本,并带有Visual Studio。
  • 使用公钥/私钥或非对称加密来生成您的产品许可证。这样可以确保只有才能生成许可证代码。即使您的应用程序破解,您也可以确保他们不会为您的应用程序释放密钥生成器,因为不可能反转密钥生成算法。
  • 使用第三方打包程序将.NET可执行文件打包到加密的Win32包装器应用程序中。Themida是更好的之一。这使人们无法在.NET Reflector中反映您的应用程序,并且使拆包变得困难。
  • 编写自己的自定义包装器。如果第三方包装机太昂贵,请考虑自己编写。有时,自定义包装器可能非常有效,因为关于如何解压缩它们的方法还不完善。《如何编写自己的打包程序》教程提供了有关编写自己的Win32打包程序的大量有用信息。

最终,如果人们希望您的应用程序被破解,他们会这样做。看看那里所有具有大量资源来保护其应用程序的商业软件,但在将这些应用程序公开发布之前,它们已经被破解。

无论您做什么,熟练的逆向工程师都可以像黄油一样启动IDA-Pro并切入整个应用程序。打包的应用程序可以解压缩,而混淆只会阻止它在公园中散步。您可以用一个字节的补丁程序来完成所有复杂的许可证代码的工作。

您只需要接受人们非常有可能会盗版您的软件。有一些人无论如何都不会为您的应用程序付费,而这些人是您无需担心的。

但是,那里有许多企业永远不会冒险提起诉讼,并乐于购买软件许可证,而许多计算机用户要么不想冒险,要么发现它错了,或者没有足够的技术来盗版。这些是您的真正客户,因此您应该集中精力为他们提供良好的用户体验,而不必理会破解您软件的人员。

我以前曾盗版过我的应用程序,因此我个人冒犯了它。在这里,我是一个小开发人员,将我的心灵投入到一个应用程序中,这些人有幸从我这里盗版?他们直接从我的口袋里拿钱!

我立即添加了一堆严苛的DRM代码,并试图破坏使用非法或破解副本的任何人。我当然应该一直在努力使我的应用程序更好,而不是试图阻止不可避免的事情。不仅如此,而且我伤害了我的真正客户,我将投入的所有这些额外保护措施。

经过漫长的战斗,我意识到自己正在与潮流搏斗,而所有这些浪费的时间都是徒劳的。我除去了准系统许可功能以外的所有电话归属代码,再也没有回头。


67
因此+1几乎等于+2。我希望更多的人最终会明白,您根本无法保护软件免受坚定的攻击者的侵害。
孟买

102
您已经达到了软件保护的必杀技:这不是增加更多的保护,而是专注于产品并使其变得如此好,以至于人们希望为此付费。对于那些盗版者,他们永远也不会付钱,就好像它们根本不存在一样。
亚瑟·查帕里安

6
@Arthur Chaparyan,我同意。到这里花了很长时间,但我终于看到了曙光。我走了更严格的保护措施并与饼干战斗。我学会了所有关于逆向工程的知识,以防止自己的失败。我终于想通了正确的思想
mmcdole

50
地狱,我很荣幸发现有人认为我的软件值得盗版...
Erik Forbes,2009年

10
当您开始主要依靠软件销售获得收入时,它将改变一切。感觉好像有人在从您那里偷东西。我明白你在说什么。当我第一次在洪流站点上发现软件漏洞时,我感到震惊。
mmcdole 2009年

265

您不能完全保护任何应用程序(是否托管)。如果像Playstation和iPad这样的系统可能会被破解-由供应商甚至控制硬件,那么您的应用程序有什么希望?值得庆幸的是,您并不是真的想要。在我看来,您需要确保应用程序的安全性足以使他人不会意外盗版您的产品,并且仅此而已

例如,如果您使用每台计算机的许可证,则在将其安装在新的第二台计算机上时,它不应该只是工作而已。您会希望得到一条好的错误消息,以防止拨打额外的支持电话,但不要花费额外的时间使工作变得太辛苦,也不要使用户遭受沉重打击。

另一个例子是限时试用。甚至不用担心简单的事情,例如用户是否可以回滚系统时钟。这样做的人知道他们正在破坏您的许可证,并且只要用户知道何时违反他们,您就已经做了足够的事情。

您需要做很多事情,因为用户不在乎您的许可证。许可证是伪造的东西,直到有人需要时才在乎。没有人读过它们,而且他们真的不必读。因此,告诉用户边界在哪里的最佳方法是应用程序的即用型行为是否符合许可证。在第一种情况下,这意味着无法安装或第二次以试用版模式安装。对于后者,这可能仅意味着检查配置文件中的纯文本日期。无论哪种方式,请确保以优雅,有用和尊重的方式进行处理。

这就解释了那么多意味着什么。但是为什么不走得更远呢?为什么不堵塞您可以找到的每个小孔呢?答案分为两部分。首先,如果有人会突破道德门槛(即使以一种简单的方式)有意识地破坏您的许可条款,他们也会愿意做更困难或更危险的事情,例如从洪流中提取您的应用程序网站-运行从不受信任的来源下载的应用程序会带来一定的危险。加大难度对这些用户来说只是一个小麻烦,并且有可能给您的付费客户带来麻烦。保持简单可能会阻止某人深入研究您的应用程序并发布更全面的破解。其次,您几乎没有眼睛可以寻找缺陷。黑客有很多,而且他们有更多练习来找到它们。您只需要错过一个小缺陷,您的应用程序在盗版网站上的分布将与您什么都不做一样。每次都必须是对的;他们只需要幸运一次。因此,所需的努力非常高,并且任何成功度量的可能性都非常低。

最终,如果有人想要盗版您的应用程序(而不是仅仅使用它),那是他们的主要目标,那么他们会。您无法阻止他们。这就是软件的本质;一次,使您的产品的文件是用户的计算机上,他们能够按照自己的意愿与他们无关。这在Java或.NET之类的托管环境中尤其重要,但它当然也适用于本机代码。时间在他们身边,只要有足够的时间就可以破坏任何数字安全性。

由于您不能阻止用户盗版产品,因此,最佳的做法是吸引此类用户,使他们受益。通常有可能让他们为您工作而不是与您对抗。考虑到这一点,无论您的应用程序是什么,保留几乎完全可用且不会过期的免费版本可能是值得的。即使是1美元的价格标签与免费标签之间的差额也是巨大的,如果客户没有其他理由不必用信用卡来信任您的话。产品的免费版本不仅可以有效地阻止盗版发行(为什么您可以以相同的价格合法使用盗版,还可以冒险使用盗版),还可以极大地扩大受众范围。

结果是您可能需要提高付费版的价格,以便最终有100,000个免费用户而不是2,000个用户(每个20美元),其中100,000个免费用户,其中500个愿意为“专业”版支付99美元。 。与您花费大量时间锁定产品相比,这可以为您带来更多的收入。不仅如此,您还可以吸引这些免费用户并以几种重要方式利用这种关系。

一种是支持。悲观主义者会借此机会抱怨支持100,000个免费用户的成本增加,但是却发生了一些令人惊讶的事情:您的产品在很大程度上变成了自我支持。在大型开源项目中,您无时无刻不在看到这种情况,因为这些项目没有任何支持费用。用户将加紧努力,实现这一目标。

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

另一个是反馈。通过观看您的论坛,您可以学到其他您可能从未考虑过的重要改进想法。这可以使您最终将更多的免费用户转变为付费用户,并创建更具吸引力的产品,从而吸引更多的受众。

最后,您需要考虑营销。所有这些免费用户现在都是粉丝,而不是对手,他们将采取相应行动。不仅如此,当发布您的下一个版本时,这些用户将全部通过您认可的发行渠道,而不是其他一些未知的机制。这意味着在您的下一个版本中,您将开始与更多的,高度感兴趣的和支持性的受众群体建立联系。

为专业版保留的最佳功能是旨在简化企业部署和管理的工具。破解者不会将其视为足以诱骗自己使用的足够理由,但是对于希望购买300个许可证并将其在公司范围内推出的企业来说,这是必须具备的。当然,专业版仍然会被盗版,但还是要再次声明:不要汗流it背,因为无论您做什么,您都可能无法将产品卖给那些盗版者,因此,这不会花费您任何收入。

尽管从心理上讲,要付出这么多的钱可能很难,但希望您能理解它真的是最好的选择。不仅如此,这是长期的唯一方法。我知道有人在想他们不想这样做。毕竟,多年以来,他们靠出售价格低廉的20美元产品就可以了。但这太糟糕了,因为如果您不这样做,最终其他人会这样做。他们的产品将与您的产品一样好,或者足够接近,他们可以宣称自己的产品而逃脱。突然之间,您的价格看起来简直令人难以置信,销售额急剧下降,您无能为力。您可以根据需要选择其他中间层,但这不太可能对您有所帮助。


1
@Learning:随着时间的推移,它有所增长,并通过了自动转换为CW阈值。
Joel Coehoorn

1
+1比我对这个问题的上一个版本的回答要好。@Joel不知道有限制。
pipTheGeek

1
我并不完全同意这里的所有内容,对于经过深思熟虑的演示文稿和论点,这仍然是一个简单的+1。
Beska

2
有力的论据,但没有提到保护知识产权的要点。如果您的应用程序具有某些执行某些复杂功能的代码,则混淆可以提供平坦的复制和粘贴代码之间的差异,并尝试解释和重新设计代码以使其正常工作。这对于更新尤为重要:如果有人复制了您混淆的代码,则当您发布更新时,他们必须重新做一遍-至少,这会使他们更加痛苦/花费/时间。如果您没有以某种方式对其进行保护,他们将再次复制/粘贴即可。
gregmac

4
很棒的帖子-它确实涵盖了所有正确的细节,说明了不值得编写复杂的复制保护的原因。即使问题是重复的,也仅出于这个答案就值得重新打开它。也许国防部可以合并吗?
EMP 2010年

45

以我的经验,使您的应用程序或库更难以破解会伤害诚实的客户,同时只会稍微延迟不诚实的客户。专注于制造出色的,低摩擦的产品,而不是花很多精力来推迟不可避免的事情。


38

与很多人分享的秘密不是秘密。如果您的代码中包含秘密内容,则对其进行混淆是没有保护的;它只需要去模糊一次。如果您有不想与客户共享的秘密,则不要与客户共享。将您的代码作为Web服务编写,并将您的超级秘密代码保存在您自己的服务器上,只有您才能看到它。


1
顺便说一句,我正在做一个项目,我也想激活产品“离线”。(我提供了WCF服务来在线激活)。在这种情况下,您将如何操作代码?你能给我一些打击吗?
Piyush

1
有趣的想法,但是您会建议开发者开发一种必须在没有数据连接的情况下运行的应用程序(例如WP7游戏)的做法?
查理·斯基贝克

23

从广义上讲,这里有三类人。

  • 那些不会购买您的软件并求助于破解软件的人,或者,如果找不到它们,则根本不会使用您的软件。不要指望从这个群体中赚钱。他们要么依靠自己的技能,要么依靠饼干(他们倾向于根据自己的兴趣和受众的数量来优先安排时间。有用的资源越多,破解就越早)。

  • 不管您使用哪种保护机制,都将购买(购买)您的软件的一组合法用户。通过使用精心设计的保护机制,不要为合法用户加倍麻烦,因为无论如何他们都会为此付费。复杂的保护机制很容易破坏用户体验,并且您不希望这种情况发生在此组中。就个人而言,我会反对任何硬件解决方案,因为这会增加您的软件成本。

  • 少数人会求助于“不道德”的破解,只为您的软件付费因为其功能受许可机制保护。您可能不想让这个小组极其容易地绕过您的保护。但是,您花在保护软件上的所有努力都会得到回报,这取决于这些人的人数。这完全取决于您要构建的软件类型。

根据您所说的,如果您认为有足够的少数人可以推动购买您的软件,请继续实施某种形式的保护。考虑一下您可以从这少数群体中赚多少钱,花费在保护上的时间,或者花费在第三方保护API /工具上的金额。

如果您想实施自己的解决方案,则使用公钥加密是防止容易被黑客入侵的好方法(与对称算法相反)。例如,您可以对许可证(序列号或许可证文件)进行数字签名。解决此问题的唯一方法就是对代码进行反编译,更改和重新编译(使用Simucal答案中建议的技术可能会更加困难)。


如果有人撕掉了如果不签出许可证就会中止应用程序的代码,那么使用强密码学来保护/验证您的许可证是完全没有用的。:)
孟买

同意,但是正如我说的那样,该保护措施并非针对那些将诉诸于使用裂缝的用户群体(我做的一个假设将存在)。
神秘

公钥密码=非对称密码。我认为您的意思是对称的。
mmcdole,2009年

1
公平地说,第三点是有偏见的,因为它假设一部分人永远是少数。我敢肯定,在某些框架下,这显然是多数。我有网游在考虑大规模多人游戏功能,因为:a)大多数用户的孩子非常低道德标准B)的成本可以向这些用户显著,如果它是拖了几个月等月租费
ĴRIV

19

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

但是,您可以使它们产生裂缝,从而对您的销售造成的损害较小。可以为您的软件发布有效注册码的密钥生成器比简单的补丁程序(从您的软件中删除注册激励措施)要糟糕得多。这是因为破解仅适用于一个软件版本,并且将不再与您发布的下一个软件更新一起使用。在您更改注册密钥算法之前,密钥生成器将继续工作,这是您不希望经常执行的操作,因为它会推迟诚实的客户。

因此,如果您正在寻找一种与软件的非法密钥生成器作斗争的方法,并且由于生成的注册码太长而不想使用不对称加密,则可以查看部分密钥验证。

部分密钥验证可确保每个非法密钥生成器仅适用于您软件的一个特定版本。基本上,您要做的是确保每个软件版本仅与用于检查注册码中某些数字的码链接。究竟哪个数字是随机的,所以破解者将不得不对您的软件的许多不同版本进行反向工程,并将所有这些组合到一个密钥生成器中,以便发布适用于您所有软件版本的密钥生成器。

如果您定期发布新的软件版本,这将导致大量密钥生成器散布在不再起作用的各种软件盗版归档文件中。潜在的软件盗版者通常会寻找最新版本的破解程序或密钥生成器,因此他们可能会尝试其中的一些并最终放弃。

我在(C ++)较新的共享软件游戏中使用了部分密钥验证,它非常有效。在我们遇到无法解决的密钥生成器很多问题之前。后来,有很多破解方法和一些密钥生成器仅适用于该特定版本的游戏,但没有适用于所有版本的密钥生成器。我们会定期发布游戏的次要更新,使以前存在的所有破解都无用。

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


1
像这个想法一样,您也可以在不同版本中使用不同的密码进行不对称加密。
2009年

有趣的主意,但是长注册码到底有什么问题呢?如今,无论如何没人会手动输入它-每个人都会复制并粘贴它,因此无论是10个字符还是100个字符都不会有任何区别。
EMP 2010年

4
@Evgeny:只有当您的用户是超级用户时,这才是正确的。我们多年来一直在创建共享软件/休闲游戏,我可以告诉您,我们的大多数用户都无法复制和粘贴。注册窗口甚至附带了有关如何复制和粘贴的手册,有些甚至在阅读后不提供。
阿德里安·格里戈里

哇!好吧,好吧,您显然比我有更多的经验,所以我不能争辩,只能说我很惊讶。但是我要说的是,如果他们不知道如何复制和粘贴,那么您应该使代码长200个字符,以便他们学习非常有用的通用计算机技能。:)
EMP 2010年

1
@Evgeny:即使注册代码很短,我们仍然收到很多人的电子邮件,他们输入了错误的代码,因此认为该代码是无效的,因为他们永远不会在这样的情况下多次犯这样的错误。行。我更喜欢将IT教学留给其他公司... :-)
Adrian Grigore 2010年

16
  • 使用在线更新来阻止那些未经许可的副本。

  • 验证来自应用程序不同模块的序列号,并且不要使用单个函数调用来进行验证(以使破解者无法轻松绕过验证)。

  • 不仅在启动时检查序列号,在保存数据时进行验证,在每个星期五晚上进行校验,在用户空闲时进行校验...

  • 验证应用程序文件校验和,并将安全校验和存储在不同的位置。

  • 别在这些技巧上走得太远,请确保您的应用程序在验证注册码时不会崩溃或出现故障。

  • 为用户构建有用的应用程序比
    为饼干制作坚不可摧的二进制文件重要得多。


14

您可以..

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

更新:(公开:我在Eazfuscator.NET上工作)使Microsoft SLP服务软件潜力与众不同的是虚拟化代码的能力,因此您绝对可以。自最初提出该问题以来已经过去了几年;如今,有更多可用的产品也可以在类似的基础上工作,例如:


2
为我的朋友定价,从Microsoft购买许可软件对于普通的ISV来说太贵了
Priyank Bolia'2009年

我已经尝试过了,它工作得很好,但是它只加密方法内部而不是整个程序集或项目中的代码,因此,破解者可以通过注入IL轻松地改变程序的流程
Mohsen Afshin

@ogggre如果添加供应商链接,则确实需要在帖子中公开您的连接。另外,当前可用的SLPS版本(在:D上工作)确实支持泛型。自然,所有解决方案都有各自的优缺点,只有一个评估可以正确地为人们提供背景信息
Ruben Bartelink 2014年

@MohsenAfshin我不明白您在说什么-重点是您需要保护任何方法,在这些方法中,IL的添加/删除/更改可能会违反许可规定。由于无法免费进行虚拟化,因此按照您的建议“魔术般地保护一切”根本没有意义。回到关键点:SP的保护的目的是防止基于您所选择的方法的IL改变,因为它们是敏感的(一般来说,还有一些其他的噪声,例如为了避免产生噪声,您需要在此处进行破解->符号)
Ruben Bartelink

1
@RubenBartelink我同意你的看法。不幸的是,该线程太大了,无法容纳几页内容。起初我想添加一个新答案,但是StackOverflow建议最好扩展现有答案。所以我做了。希望我的一小部分信息有用。感谢您对SLPS中的通用支持的更新以及您的更正。
ogggre 2014年

10

.NET Reflector只能打开“托管代码”,这基本上意味着“ .NET代码”。因此,您不能使用它来分解COM DLL文件,本机C ++,经典的Visual Basic 6.0代码等。已编译的.NET代码的结构使其非常方便,可移植,可发现,可验证等。.NETReflector利用了这使您可以查看已编译的程序集,但反编译器和反汇编程序绝不是.NET特有的,只要编译器存在,它们就存在了。

您可以使用混淆器使代码更难阅读,但是您不能完全防止反编译,而又不能使其对.NET不可读。那里有少数产品(通常很昂贵)声称将您的托管代码应用程序“链接”到本机代码应用程序,但是即使这些产品切实可行,有决心的人也总会找到方法。

但是,当涉及到混淆时,您将获得所需的费用。因此,如果您的代码是如此专有,以至于您必须竭尽全力来保护它,那么您应该愿意在一个好的混淆器上投资。

但是,在我15多年的代码编写经验中,我意识到对源代码过度保护是浪费时间,几乎没有好处。仅尝试阅读原始源代码而没有支持文档,注释等可能很难理解。加上反编译器带来的毫无意义的变量名和现代混淆器创建的意大利面条式代码-您不必担心别人会窃取您的知识产权。


9

是不是真的值得吗?可以通过充分的决心来破坏每种保护机制。考虑您的市场,产品价格,客户数量等。

如果您想要更可靠的东西,那就走硬件密钥的道路,但这对用户来说是很麻烦的,而且价格昂贵。软件解决方案可能会浪费时间和资源,而它们唯一给您的就是对“安全性”的错误认识。

很少有其他创意(没有完美的想法,因为没有完美的想法)。

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

而且不要浪费太多时间,因为饼干在典型技术上有很多经验,而且领先一步。除非您要使用大量资源,否则可能要更改编程语言(以Skype方式进行)。


不要忘记,很有可能会攻击硬件锁的软件部分。
Magnus Hoff

是的,的确如此,唯一真正的选择是将应用程序部分地用硬件实现(例如,一些软件-VHDL应用程序的怪异混合)。但是,这也将是脆弱的……
匿名

实施公钥/私钥策略的加密狗呢?只有加密狗的私钥才能解密应用程序并运行它。
mmcdole,2009年

这就是硬件密钥通常要做的。但是您可以攻击加密狗(将其克隆),或负责与加密狗对话的软件(规避,禁用等)。
匿名

1
就我而言,这确实值得。在我实施了部分密钥验证并更改了现有产品的注册密钥方案之后,销售额有了很大的增长。所有软件都可以破解,问题是您对休闲软件盗版者的门槛提高了多少。
阿德里安·格里戈里

9

如果您希望人们能够运行您的代码(如果没有,那么为什么要首先编写它?),那么他们的CPU需要能够执行您的代码。为了能够执行代码,CPU需要能够理解它。

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

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

这样就可以实现两种方式:软件即服务(SaaS)的,也就是说,你运行你的软件服务器,只有让用户远程访问它。例如,这就是Stack Overflow使用的模型。我很确定Stack Overflow不会混淆他们的代码,但是您不能对其进行反编译。

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

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


8

不幸的是,您不会逃避这个挑战。最好的选择是用C编写代码并P /调用它。

有一个小的问题22,有人可以将您的应用程序反编译为CIL并杀死所有验证/激活代码(例如,对C库的调用)。请记住,用C编写的应用程序也受到更持久的黑客的逆向工程(只要看看这些天破解游戏的速度有多快)。没有任何东西可以保护您的应用程序。

最后,它的工作原理与您的家非常相似,要对它进行足够的保护,以免付出过多的努力(意大利面条代码将在这里起到帮助作用),并且使攻击者仅移动到您的隔壁邻居(竞争:))。查看Windows Vista,必须有10种不同的破解方法。

有一些软件包可以加密您的EXE文件,并在允许用户使用它时将其解密,但是同样,这再次使用了无疑已被破解的通用解决方案。

激活和注册机制针对的是“普通乔:”没有足够的技术知识来绕过它的人(或者就此而言,他们知道他们可以绕过它)。不要为饼干而烦恼,他们手上的时间太多了。


1
如果您真的很麻烦将注册代码外包到dll中,则应确保该DLL必须与软件的每个新版本都不同。否则,使人们更容易破解软件。他们所需要做的就是一次破解您的DLL,并将其用于所有更高版本。即使最终用户找到旧的破解DLL也可以执行此操作,这甚至比将注册机制放入托管代码中还要糟糕。
阿德里安·格里戈里

8

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

这些是想法:

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

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

您可以编写虚拟机(但.NET中)。并在其中放置一些代码。最终,虚拟机运行另一个运行代码的虚拟机。这是为数不多的函数的一部分,因为它们不会过分降低性能。

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


没有得到你可以详细解释。
Priyank Bolia

7

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

混淆会使试图对您的软件进行反向工程的人们增加烦恼。根据获得的版本,您将获得不同级别的保护。

Visual Studio包含一个Dotfuscator版本。由于它是捆绑版本,因此您绝对不会获得最强烈的混淆。如果查看他们的功能列表,您将确切看到所缺少的内容(以及应用程序将如何使代码更安全)。

还有一些其他的免费或开源.NET混淆器(但我无法评论它们的质量或使用的各种方法):

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


11
这不仅是“如果他们真的想了解您的软件如何工作,他们还会这样做”。如果他们在乎,他们可能会不看而猜测。99.9%+的软件没有任何神奇的小精灵除尘算法。编程的难点不是某种特殊的秘密技术。它只是使所有零件都可以排列和工作。

9
@Ken-嘘!您无法让世界其他地方知道,在大多数情况下,我们没有使用魔术般的尘埃算法。
贾斯汀·尼斯纳

9
贾斯汀:爱情算作魔术算法吗?爱使我的节目与众不同。我认为您无法分解爱。

Babel.NET不再免费。您可以在此处找到最常见的混淆器(免费和商业混淆器)列表。
InputOutput

6

好吧,您不能完全保护您的产品不被破解,但是您可以最大限度地提高/提高安全级别,并使其很难被新手和中级破解者破解。

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

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

这些只是防止新手和中级破解者破解应用程序的简单方法。如果您有更多想法来保护您的应用程序,请不要羞于实施它们。这只会使饼干变得艰难,让他们感到沮丧,最终他们将离开您的应用程序,因为那是不值得的。

最后,您还需要考虑将时间花在编写高质量的应用程序上。不要在编码复杂的安全层上浪费时间。如果一个好的饼干想要破解您的应用程序,无论您做什么,他/她都会做...

现在去给饼干放一些玩具...


5

Salamander,它是Remotesoft的本机.NET编译器和链接器,可以在没有.NET框架的情况下部署应用程序。我不知道它能达到要求的程度。


答案很简单:很遗憾,大多数答案都谈论混淆。混淆对于停止第一次尝试(类似于反射器)尝试查看代码很有帮助,仅此而已。那还不错。当然,除了编写SAAS应用程序之外,没有什么可以阻止真正了解汇编代码的黑客(即使那样他们也可以尝试对您的服务器进行黑客攻击)。但是还有更多的工具,例如Salamander,.NET Reactor等,它们提供(也许)提供几乎与C ++编译的Win32 .exe相同的安全形式。我还无法判断哪种工具最好。
Philm


5

.NET反应堆

更新资料

Jared指出de4dot声称能够对其进行反编译。

.NET Reactor通过将.NET程序集转换为非托管进程(不能理解为CIL,并且现有工具无法进行反编译)来为您的敏感知识产权提供全面保护。黑客无法访问您的任何可理解形式的源代码。

.NET Reactor许可功能强大而灵活,可让您通过使用硬件和软件锁来强制执行许可条件并保护收入流。许可证管理器可以在几秒钟内建立试用或永久许可证。完整记录的软件开发工具包(SDK)和示例,使您可以直接从代码中调用许可系统,从而可以为许可系统创建自定义扩展。


3
我试图与这些人联系,询问一些有关他们产品的问题,但他们从未答复。您是否尝试过他们的产品。我使用智能装配,它们的产品和支持都非常好。但是正如我在问题中已经说过的,混淆是一种方法,但不是完全的证明。
Priyank Bolia

1
之前我对他们的产品有一些疑问,然后我在groups.google.se/group/net-reactor-users中问了一些有关高分辨率图标的问题,我得到了答复和修复,但现在看来他们很难联系到。不好的是-这是一个很棒的产品,我仍在使用它
loraderon

2
如果“没有现有工具可以反编译”,为什么它在de4dot功能页面上被列为受支持的混淆器/打包程序?:bitbucket.org/0xd4d/de4dot
Jared Thirsk

可能是因为这是一个古老的说法,并且他们尚未更新其网页。我不再使用任何混淆工具。
loraderon

de4dot是一个非常强大的工具。我已经尝试过对几个混淆器进行测试,它的工作非常出色。但是,它无法处理受.NET Reactor(v6.0)保护的文件。也许de4dot不是最新的。
InputOutput

4

这是一个主意:您可以由公司托管一台服务器,您的所有软件实例都需要连接到该服务器。仅让他们连接并验证注册密钥是不够的-他们只会删除支票。除了密钥检查之外,还需要服务器执行客户端无法执行的一些重要任务,因此无法删除它。当然,这可能意味着服务器需要进行大量繁重的处理,但是这会使您的软件难以窃取,并且假设您具有良好的密钥方案(检查所有权等),密钥也将很难偷。这可能比您想要的更具侵入性,因为这将需要您的用户连接到Internet才能使用您的软件。


5
如果服务器宕机或用户始终无法访问互联网,您的方法将仅仅是通过频繁往返Internet服务器仅使用一个应用程序而使客户感到沮丧。
Priyank Bolia 09年

我完全同意。这就是为什么我在最后一行说“这可能比您想要的更具侵略性……”。我只是为OP提供我认为在技术上可行的最佳解决方案,而不是让客户满意的最佳方法:)
rmeador

在2010年第一季度(写出答案后的几个月),游戏开发公司Ubisoft尝试了这一做法,服务器端组件的负载显然很大,导致游戏无法玩。SW的总体印象是:“安装麻烦,不能离线使用,具有侵入性且不可靠 ”。因此,如果您确定要进行服务器端处理,请确保可以实际扩展以适应需求。
Piskvor在

3

客户端上运行的所有内容都可以反编译和破解。模糊化只会使难度增加。我不知道您的应用程序,但是我有99%的时间认为这样做不值得。




2

请记住,您有99%以上的用户对检查可执行文件以了解其工作方式并不感兴趣。

既然很少有人愿意去打扰,而且大多数混淆器都可以解决,那值得您花费时间和精力吗?

您最好将时间花在改进产品上,以便更多的人想要使用它。


2

只是要警告:如果要使用混淆处理,请检查一切是否仍然有效!混淆可能会更改类名和方法名之类的内容。因此,如果您使用反射来调用某些方法和/或类(例如在插件体系结构中),则在混淆后您的应用程序可能会失败。同样,堆栈跟踪可能对跟踪错误没有用。


2

如果它是用.NET编写并编译为CIL,则可以反映出来。如果需要考虑安全性并避免混淆,那么我建议您使用非托管语言编写您的应用程序,从本质上讲,这种语言很难进行反向工程。


2

如何确保应用程序不被篡改,以及如何确保注册机制不能进行反向工程。

两者都有相同的非常简单的答案:不要将对象代码分发给不受信任的各方,例如(显然)您的客户。在您的计算机上托管应用程序是否可行仅取决于其功能。

如果不是Web应用程序,也许您可​​以允许SSH登录,并将X转发到应用程序服务器(或者,对于Windows,我想是Remote Desktop Connection)。

如果您将对象代码提供给讨厌的人,并且他们认为您的程序可能很有趣,那么它将被破解。没办法。

如果您不相信我,请指出尚未被破解和盗版的备受瞩目的应用程序。

如果您使用硬件密钥,它将使生产变得更加昂贵,并且用户会为此而讨厌您。爬到地板上插拔27种不同的USB东西真是个bit子,因为软件制造商不信任您(我想)。

有一些软件包可以加密您的EXE,并在允许用户使用它时将其解密。

当然,解决方法是破解“可以使用它”测试,以便它始终返回true。

一个讨厌的技巧可能是使用肮脏的方式在程序中的其他地方使用执行测试的操作码的字节值,除非该值恰到好处,否则它将使程序极有可能崩溃。它使您链接到特定的体系结构,尽管:-(


崩溃点不容易调试,并且重写.NET中的代码以绕过该检查。另外,您将如何更改.NET中的操作码,您能否对此进行详细说明?
09年

哦。我想到了C技巧;例如,取验证函数的地址,将那个char数组的前10个字节加起来(广播函数指针);选择任何函数f,然后将[f的地址减去前一个和]存入fptr。始终将f称为*(fptr +该总和)。预计

2

只需编写一个好的应用程序并编写一个简单的保护系统即可。选择哪种保护都无所谓,它将被撤销...因此,不要浪费太多时间/金钱。


2

关于.NET,如果要发布Windows窗体应用程序(或客户端具有Portable Executable文件的任何应用程序),则可以将其破解。

如果您要坚持使用.NET并希望最大程度地减少获取源代码的机会,那么您可能需要考虑将其作为ASP.NET应用程序跨Web服务器部署,而不是使其成为Windows Forms应用程序。


2

坦白说,有时我们需要混淆代码(例如,注册许可证类,等等)。在这种情况下,您的项目不是免费的。海事组织,你应该为一个好的混淆器买单。

Dotfuscator隐藏您的代码,并且当您尝试反编译时,.NET Reflector显示错误。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.