【问题标题】:(C#/C++ CLI) Is it possible to protect my C++ CLI assemblies from being used in other .NET projects?(C#/C++ CLI)是否可以保护我的 C++ CLI 程序集不被用于其他 .NET 项目?
【发布时间】:2011-01-10 14:26:21
【问题描述】:

我为本地 C++ 代码创建了一个 C++ CLI 包装器,我又在我的 C# 应用程序中引用了它。是否有可能以某种方式保护这个程序集,使其只能在我的应用程序中使用,而其他人无法使用它?

我是一名微软技术开发人员,我很自私:)

【问题讨论】:

  • 在我的 C# 应用程序和作为构造函数参数之间使用私钥是实现此目的的有效方法,还是会被视为 hack?
  • 不确定你的意思,但我不建议你把你的私钥放在任何地方,除了办公室最黑暗的房间里最安全的电脑!

标签: c# c++-cli


【解决方案1】:

不完美。 LinkDemand 仅在部分信任环境中强制执行。以完全信任运行的代码也可以使用反射来访问私有类型,并且通常会绕过您想要讨论的任何保护。

也许您希望您的 C++/CLI 代码调用 Assembly::GetEntryAssembly 并根据该库所针对的已批准应用的白名单对其进行检查。

当然,您希望最大限度地减少检查中涉及的托管代码(和属性)的数量,因为托管代码非常容易反编译。

实际上,将偶尔检查混入 C++ 代码的核心逻辑是您唯一希望它不会被绕过的希望。

【讨论】:

    【解决方案2】:

    是的,但这将是与坚定的攻击者的一场失败的战斗。

    例如,您可以提供一个仅接受特定密钥的加密版本,正如某些人所建议的那样。但是你需要在你的客户端上解密它,这些客户端可能没有加密的内存存储,所以一个坚定的攻击者可以简单地读取适当的内存块并反序列化结果以获得你的原始程序集。

    【讨论】:

      【解决方案3】:

      我已经成功使用了this technique

      基本上,它是通过设置链接时安全要求并使用程序集强名称的公钥作为证据来保护您的程序集不被加载。只有使用您的私钥签名的程序集才能加载它。

      【讨论】:

      • @BlueRaja:您所指的帖子询问有关实例化类的问题;这里是关于使用整个程序集。我的回答中的技术可以应用于任何一个,但其他技术可能只对其中一个有效。因此我认为它不是重复的。 :-)
      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 2011-10-05
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多