如何从客户的客户那里保护我的.net winforms组件

时间:2010-09-17 18:50:01

标签: c# .net vb.net winforms protection

这个问题似乎已经死了,所以我决定提供赏金。

我最感兴趣的是,如果我在下面的ETA1中的​​场景是可行的并且被使用了。如果不是,那么为什么不是一个很好的解释将是一个很好的答案。另一个好的答案是替代(但不包括internalsvisibleto属性)。

最好的答案是,是的,它是可行的,每个人都这样做,客户喜欢它!

ETA2:我想我已经想到了一个很好的解决方案。我向客户提供了一个可分发的版本,该版本与其版本一样功能但未经许可,并且使用属性隐藏了类和成员。 我可以使用编译器指令对每个重要成员执行此操作,但我想知道是否有一些全局方法可以隐藏类的所有成员?


简化方案: -
我有一个课程,在某种程度上扩展了一个控制,我想在两个许可证下出售我的课程;

(1)标准 - 客户获得x个使用我的类但不能实例化类(其内部)的控件。
(2)Developer - 与Standard相同,除了他们可以创建自己的使用我的类的控件。

我的问题是,当开发人员客户来销售他们的控件时,他们会忍不住将我的课程暴露给所有客户。

---忽略这个 在我的混乱思维中,唯一的方法就是让开发人员以某种方式将我的程序集合到他们的程序中,这样我就可以将构造函数保持在内部。或者,使用属性可见的内部。 /忽略这个---

我相信这里有人有相同的情况,我们将非常感谢任何帮助。

ETA1:我在这里大声思考,但是,我可以列出一个允许客户可以添加的允许调用程序集名称列表。当他们运送他们的产品时,他们的客户的集合将不在列表中,因此他们将无法实例化某些类。 (该列表显然可以进行哈希处理)。

4 个答案:

答案 0 :(得分:2)

我相信您会将许可信息(即标准版和开发人员)存储在注册表中的某个位置。在这种情况下,我认为更简单的解决方案是实现LicenseManager。这是大多数.NET组件供应商使用的。

http://msdn.microsoft.com/en-us/library/fe8b1eh9.aspx

希望这有帮助!

答案 1 :(得分:1)

我相信你已经提出了唯一真正的解决方案,假设运行时支持它。只要你的是一个单独的DLL,如果开发人员可以实例化你的对象,那么其他任何人都可以,无论你是否试图将它隐藏在构造函数,工厂等等之后。

我想知道,消费者是否可能甚至无法通过将装运的装配集成到他们自己的装置中来解决这个限制?

答案 2 :(得分:1)

为什么不使用许可证密钥?您的类读取许可证密钥,并根据许可证提供的权限在运行时禁用方法?

可以在配置文件中定义许可证密钥。

答案 3 :(得分:0)

这是一个艰难的,只是由于.NET的性质。这是一个黑暗中的镜头,但你可以查看CodeVeil等产品,它们在IL级别提供程序集加密。您的装配基本上是加密装运的,钥匙将交给您的客户。然后,客户将是唯一能够解密汇编指令的实体。现在,CodeVeil声称其解密密钥如下:

  

即使密钥存储在未生成的应用程序中也是不安全的。事实上,密钥本身并不像数据本身的转换那么重要。 CodeVeil还使用许多运行时保护操作来阻止黑客试图捕获解密的程序集。此外,CodeVeil使用一种非常特殊的解密系统,该系统仅解密.NET运行时的足够信息以执行该特定方法。代码永远不会存储在与程序集本身相同的内存中,因此解密后的代码无法转储到磁盘上进行分析。

这显然是一件好事,但这是你必须研究的部分,因为我不熟悉他们在解密算法中使用的其他技术。关于这一点很酷的是,如果它有效,你的客户会很高兴,他们可以通过他们自己的API公开你的组件的部分来让他们的客户满意。与此同时,您的代码将受到ILDASM和Reflector等工具的保护。