如何保护我的.NET程序集不被反编译?


76

如果我在开始使用C#时学到的第一件事是最重要的。您可以使用Reflector或其他工具反编译任何.NET程序集。许多开发人员并不了解这一事实,当我向他们展示其源代码时,大多数人都会感到震惊。

防止反编译仍然是一项艰巨的任务。我仍在寻找一种快速,轻松且安全的方法来进行此操作。我不想混淆我的代码,所以我的方法名称将是a,b,c左右。Reflector或其他工具应该完全无法将我的应用程序识别为.NET程序集。我已经知道一些工具,但是它们非常昂贵。还有其他方法可以保护我的应用程序吗?

编辑:

我提出这个问题的原因不是为了防止盗版。我只想阻止竞争对手阅读我的代码。我知道他们会而且他们已经做到了。他们甚至告诉我。也许我有点偏执,但是商业竞争对手阅读我的代码并不能使我感觉良好。


9
如果反射器无法确定您的应用程序是否是.NET程序集,那么应如何尝试加载该应用程序呢?
Brian

1
关于“我不想混淆我的代码,因此我的方法名称将为a,b,c左右。” 为什么不?这是显而易见的事情,这会使竞争对手更难以理解您的逻辑。
制造商史蒂夫(Steve)2015年

是的,混淆100%“有效”。首先,您不应该在代码中添加“秘密”,而“一旦在代码中发现这些内容就会危害安全性”。其次,您是否曾经在GitHub上获取代码并尝试过重新利用它?我的意思是,由于使用了范例,类耦合,类职责模糊,依赖节,回调节等,即使是未混淆的代码也可能难以重新利用。这意味着,经过混淆的代码是绝对安全的,直到我们使机器人程序员能够理解编程逻辑并快速重写/重构代码为止,这不会很快发生。
Felype

Answers:


110

要记住的一件事是,您想要以一种有意义的方式来执行此操作。为此,您需要定义目标。那么,您的目标到底是什么?

防止盗版?这个目标是无法实现的。甚至本机代码也可以反编译或破解;在线提供的众多警告(甚至适用于Windows和Photoshop之类的产品)也证明了坚定的黑客始终可以获取访问权限。

如果您无法防止盗版,那么仅减少盗版又如何呢?这也被误导了。只需要一个人破解您的代码,它就可以提供给所有人。你每次都要幸运。海盗只需要幸运一次。

我告诉你的目标应该是最大化利润。您似乎认为,为此目的必须制止盗版。它不是。利润就是收入减去成本。停止盗版会增加成本。这很费力,这意味着在过程中的某个地方增加了成本,因此减少了等式的那一部分。保护您的产品也无法增加您的收入。我知道您会看到所有这些海盗,并且看到只有他们愿意支付许可费才能赚到的所有钱,但现实是,这永远发生。这里有些夸张,但通常认为无法破解您的安全性的海盗会找到他们可以破解或无法破解的类似产品。他们将永远不会买它来代替,因此,他们也没有代表销售损失。

此外,保护您的产品实际上会减少收入。有两个原因。一个是一小部分在激活或安全方面遇到问题的客户,因此决定不再次购买或索要退款。另一个是一小部分人实际尝试使用盗版软件以确保其在购买前能正常工作。限制产品的盗版分发(如果您能够以某种方式取得成功)会阻止这些人尝试您的产品,因此他们将永远不会购买。此外,盗版还可以帮助您的产品传播到更广泛的受众,从而吸引更多愿意为此付费的人。

更好的策略是假设您的产品将被盗版,并考虑利用这种情况的方法。关于该主题的更多链接:
我如何防止代码被盗?
保护.NET应用程序


32
主要目标不是防止盗版。目的是防止竞争对手阅读我的代码。我知道他们会做,他们已经做过。
TalkingCode 2010年

15
如果这是您的目标,那么混淆器就足够了。
Joel Coehoorn

2
我不会说,never如果某些软件不易破解,海盗将购买任何许可证。这不是100%正确。我曾见过有人说I'm not gonna buy it that soft/game, can't afford, blah blah然后购买它,因为他们注意到破解版已过时,被病毒感染或不允许他们访问某些在线功能。
Tarec 2014年

3
保护产品不会增加收入?您的硬数据在哪里支持这一说法?据我所知,这还不是任何软件销售商的经验。实际上,从长远来看,情况恰恰相反。保护您的产品会减少收入吗?不,那与我认识的卖方的经验不一致。我已经听说过很多此类索赔,但我认为必须由未同时尝试两种方法的人提出。要么,要么他们与我认识的人出售产品的行业处于不同的角落。
Shavais 2014年

2
-1恕我直言不是问题的答案。同样,如果该软件非常便宜,则为假-用户很多,购买者很少。甚至部分地防止盗版的障碍都是赢利的净赢利,是因为有许多潜在客户愿意花钱免费购买某些东西,但他们也会犹豫安装盗版软件(病毒风险,不便之处)更新)。以我的经验,下载破解软件的人通常不是潜在的客户,因为他们愿意冒险而不是付钱。潜在客户下载法律试用版
ToolmakerSteve

16

在这里,我们使用PreEmptive Solutions的Dotfuscator

尽管无法保护.NET程序集,但我认为100%Dotfuscator使得它很难。我有很多混淆技术;

跨程序集重
命名重命名方案
重命名前缀
增强的过载归因
增量混淆
HTML重命名报告
控制流
字符串加密

事实证明,对于小型公司而言,它们并不昂贵。他们为小公司定价。

(不,我不是为Preemptive工作的;-)

当然,还有免费软件的替代品。


2
我也用这个 非常好的软件,尽管它(对我而言)具有一些无用的功能,例如使程序过期的功能或通过电子邮件向您报告异常的功能。但是重命名和逻辑流程非常好,在通过该程序运行良好之后,我看不到任何人可以实际读取您的代码。
TheGateKeeper 2012年

13

在任何云服务提供商中托管您的服务。


10

如何防止任何C#应用程序反编译

几乎描述了整个情况。

在某些时候,必须将代码转换为VM字节码,然后用户才能使用它。

机器代码也没有太大不同。像IDA Pro这样的出色的交互式反汇编程序/调试器 ,几乎可以将任何本机应用程序透明化。调试器足够智能,可以使用AI来识别常见的API,编译器优化等。它允许用户从由机器代码生成的程序集中精心重建更高级别的构造。

而且IDA Pro在某种程度上也支持.Net。

老实说,在从事反向工程(兼容性)项目几年后,我从经验中得到的主要好处是,我可能不必为担心他人盗用我的代码而担心。如果有人愿意,无论我采用哪种方案,都绝对不会很难。


7
只需要使阅读代码比编写代码更加困难。
Brian

6

没有任何混淆器可以保护您的应用程序,甚至这里没有描述。看到此链接,它是一个去混淆器,几乎可以对那里的每个混淆器进行去混淆。

https://github.com/0xd4d/de4dot

可以帮助您的最佳方法(但请记住,它们也不是完全教授)是使用混合代码,用不受管的语言对重要代码进行编码,并像C或C ++一样制作DLL,然后用Armageddon或Themida保护它们。Themida并非适用于所有解密工具,它是市场上最好的保护器之一,它还可以保护您的.NET软件。


5

我知道您不想混淆,但是也许您应该签出dotfuscator,它将带走您编译的程序集并为您进行混淆。我认为它甚至可以加密它们。




2

如果要完全保护应用程序免于反编译,请查看Aladdin的Hasp。您可以将程序集包装在只能由您的应用程序访问的加密外壳中。当然,有人想知道他们如何能够做到这一点,但这确实有效。但是我不知道它们是否可以保护您的应用程序免受运行时附件/反射的攻击,而这正是Crack.NET能够做到的。

-编辑另外,请注意将本机代码编译为解决方案...也存在本机代码的反编译器。


1

你有API吗?

与其尝试在所有客户设备上保护其中一个产品中的一个ddl文件,不如不为您的宝贵产品功能创建API服务?让保存在设备上的实际产品使用该API来按需交付产品。

我认为通过这种方式,您可以100%确保不会对代码进行反编译,并且可以在API中设置自己的限制,以使开发人员/黑客不会以不需要的方式使用API​​。

当然,还有更多工作要做,但是最后,您可以控制。


0

如果有人必须窃取您的代码,则可能意味着您的业务模型无法正常工作。那是什么意思 例如,我购买了您的产品,然后请求支持。您太忙了,或者认为我的要求无效,浪费您的时间。我会解码您的产品以支持我的相对业务。您的产品对我来说变得更有价值,因此我会优先考虑时间,以解决利用您的产品的业务模型。我会对您的产品进行重新编码和品牌重塑,然后出去赚钱,而您决定将这些钱留在桌上。保护代码是有原因的,但是很可能您是从错误的角度看问题的。当然可以 您是“编码员”,而我是商人。;-)干杯!

ps。我也是一名开发人员。即“编码器”


2
可能是现有产品的竞争对手,该产品正在尝试将功能添加到其产品中。
hypehuman


0

除了此处列出的第三方产品之外,还有另一种产品:NetLib Encryptionizer。但是,它的工作方式与混淆器不同。混淆器使用内置的去混淆“引擎”修改组件本身。加密器在文件级别加密DLL(托管或非托管)。因此,除了对其进行加密外,它不会修改DLL。在这种情况下,“引擎”是位于应用程序和操作系统之间的内核模式驱动程序。(免责声明:我来自NetLib Security

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.