我有一个程序集,除指定的可执行文件外,任何应用程序都不应使用该程序集。请给我一些指示。
13 回答
您可以使用相同的密钥对程序集和可执行文件进行签名,然后在要保护的类的构造函数中进行检查:
public class NotForAnyoneElse {
public NotForAnyoneElse() {
if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
throw new SomeException(...);
}
}
}
在 .Net 2.0 或更高版本中,将所有内容都设置为内部版本,然后使用 Friend Assemblies
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
这不会停止反思。我想结合下面的一些信息。如果您绝对需要阻止任何人打电话,最好的解决方案可能是:
- ILMerge .exe 和 .dll
- 混淆最终的.exe
您还可以检查调用堆栈并获取每个调用者的程序集,并确保它们都使用与程序集相同的密钥进行签名。
如果不跳过一些箍,100% 完全不可能。
使用 .NET 的好处之一是能够使用反射,即加载程序集并检查它、动态调用方法等。这使得 VB.NET 和 F# 之间的互操作成为可能。
但是,由于您的代码位于托管程序集中,这意味着任何人都可以添加对您的代码的引用并调用其公共方法或使用反射加载它并调用私有方法。即使你“混淆”了你的代码,人们仍然可以使用反射和调用你的代码。但是,由于所有名称都将被屏蔽,因此做任何事情都非常困难。
如果您必须以一种阻止其他人执行它的方式发布您的 .NET 代码,您也许可以对您的二进制文件进行 NGEN(将其编译为 x86)并发布这些二进制文件。
我不知道你的具体情况,但混淆应该足够好。
您还可以查看使用Netz可执行打包程序和压缩程序。
这会将您的程序集和您的 .exe 文件打包到一个可执行文件中,因此如果不进行一些挖掘,它们对外界是不可见的。
我的猜测是,这足以阻止大多数 .net 程序员的访问。
.netz 方法的一大好处是它不需要您更改代码。另一个好处是它确实简化了您的安装过程。
您应该能够将所有内容设置为内部范围,然后使用InternalsVisibleTo属性仅授予该一个程序集对内部方法的访问权限。
正如一些人提到的,使用 InternalsVisibleTo 属性并将所有内容标记为内部。这当然不会防止反射。
尚未提及的一件事是将您的程序集合并到您的主 .exe/.dll/ whatever中,这将稍微提高进入的障碍(人们将无法看到您的程序集独自坐在要求被引用),但不会停止反射路线..
更新:另外,IIRC,ilmerge 有一个功能,它可以自动内部化合并的程序集,这意味着您根本不需要使用 InternalsVisibleTo
我不确定这是否适合您,但也许您可以使用 WCF 或 ASP.NET Web 服务托管程序集并使用某种身份验证方案(LDAP、公钥/私有密钥对等)来确保只允许客户端连接。这将使您的程序集物理上不受其他任何人的控制,并且您可以控制谁连接到它。只是一个想法。
您可能可以在程序集的代码访问安全策略中进行设置。
您可以使用混淆。
这将变成:
int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);
变成不可读的东西,例如:
int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);
其他人仍然可以使用您的程序集,但很难做出明智的选择。
听起来您正在寻找保护或混淆工具。虽然没有灵丹妙药,但我推荐的保护工具是smartassembly。一些替代品是Salamander Obfuscator、dotfuscator和Xenocode。
不幸的是,如果你把你的字节交给某人阅读......如果他们有足够的时间和精力,他们可以找到加载和调用你的代码的方法。为了抢先回答我看到您经常问的评论:Salamander 会阻止您的代码直接加载到 Reflector 工具中,但我在 smartassembly 方面有更好(即:更可靠)的体验。
希望这可以帮助。:)
例如,如果程序集是一个 Web 服务,您可以确保指定的可执行文件在 SOAP 消息中传递一个秘密值。
只需要使用函数调用发送密码,如果它没有被授权,那么什么都不起作用,比如 .setAuthorizeCode('123456') 然后在每个可以使用的地方检查是否 authorizeCode != 123456然后抛出错误或退出......这听起来不是可重用性的好答案,但这正是重点。
只有您可以使用它,并且当您将授权代码硬编码到程序中时。
只是一个想法,可能是您正在寻找的东西,或者可以激励您做出更好的事情。