6

我有一个加密/复制保护问题。

我正在为一家使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞到空中,或者我花在这上面的任何时间都是浪费;这不是关于软件保护有效性的哲学问题,更像是一个方法。

据我了解,破解受加密狗保护的软件的第一步是从代码中删除对加密狗的所有调用(即修补可执行文件)。同样据我了解,我可以在 .NET 中创建“强名称”以保护应用程序和程序集,如MSDN 文章中所述

强大的命名是否足以确保我的应用程序不容易被修补?还是我需要使用某种加密库?如果我需要使用某个库,是哪一个,或者我可以从哪里获得有关设置它的信息?

当然,下一步是将重要的算法放在加密狗上。我意识到这些只是专用饼干的减速带,但随着我们市场份额的增长,减速带将帮助我们达到不那么敏锐地感受到盗版刺痛的地步(我希望)。

谢谢!

4

5 回答 5

8

汇编强命名从未设计用于防止控制机器的攻击者。从延迟签名的 msdn 条目中

以下示例关闭名为 myAssembly.dll 的程序集的验证。

sn –Vr myAssembly.dll

强名称的设计目标是提供名称唯一性并保护用户(而不是发布者)免受攻击。如果用户想要禁用所有强名称检查,或者甚至可能去掉您的签名并用他自己的密钥重新签署程序集,那么从技术上讲,没有什么可以阻止他这样做。

简单地从加密文件加载程序集也不是很有用,因为解密代码本身无法加密,因此很容易成为逆向工程的目标。

正如其他海报所提到的,您正在寻找的是obfuscation。您可能已经拥有这样的工具:Visual Studio(至少 2005 和 2008 年)附带 PreEmptive Solutions 的Dotfuscator 社区版。微软也有自己的“软件许可和保护服务”产品。

然而,混淆有一些技术上的缺点:

  • 它可能会使您的构建过程复杂化。您需要一个未混淆和一个混淆构建,因为后者不可调试。
  • 我喜欢有一个意外异常的错误对话框,用户可以单击“复制详细信息”并向我发送一封包含一些技术信息的邮件,包括堆栈跟踪。但是,通过混淆,您可以忘记从Exception.StackTrace获取任何有用的信息。
  • 如果您的代码使用反射,那么很可能会在混淆构建中中断,因为内部类型和成员名称没有保留。
于 2009-01-30T02:55:14.597 回答
4

签署您的程序集将无法在不更改签名的情况下对其进行更改,从而更改其引用。这样做的结果是对程序集的(强命名)引用将无法针对更改的版本进行解析。这可以保证不会出现荒谬的赔率。

但是,这并不能解决您的问题。反正也不完全。例如,如果您将加密狗调用打包到一个强命名的程序集中,然后从您的应用程序中引用该程序集,那么如果没有您未更改的程序集,应用程序将无法运行,因此没有加密狗也无法运行。但是应用程序本身可以更改!

您可以使用的另一种方法是混淆。Visual Studio 附带了一个免费版本的混淆器,可以升级到工业级。混淆使代码在不改变其行为的情况下难以理解,因此对逆向工程构成了真正的障碍。

我想说解决方案在于这两种技术的巧妙结合。

恐怕这就是我的知识范围。其他人将不得不在这里提供实际答案(而且它可能比我的要短得多令人尴尬;-)

于 2009-01-30T02:04:33.233 回答
2

如果他们正在修补您的可执行文件,则强名称无济于事。但是,它将帮助您确保您引用的 dll 是正确的版本并且没有被篡改。
您可能会检查 Salamander抢占式混淆。
您可能会看到的加密Assembly LockboxCodeVeilThinApp

于 2009-01-30T02:06:16.770 回答
1

如果您想使用加密狗并加密您的程序,这篇文章可能对您有用: http: //www.gironsec.com/blog/2012/02/dongles-how-do-they-work/

这是那篇文章的相关引述:

有两种方法可以实现加密狗。正确的方式和错误的方式。正确的方法是加密您的程序并将加密密钥存储在加密狗上,并在运行时根据设备是否连接进行解密。

于 2013-03-25T04:19:42.853 回答
0

在某种程度上,混淆可能对您有用。但这不是 100% 安全的方式。事实上,没有任何 100% 安全的方法来保护任何软件模块。在最好的情况下,混淆只会使对程序进行逆向工程变得很耗时。.NET Reflector 是一种逆向工程工具,可从任何 .NET 程序集重新生成源代码。使用 Dotfuscator 将使入侵者难以理解原始源代码,但如果奖励很大,则可以努力对该源代码进行良好的估计。

于 2011-05-09T05:34:15.623 回答