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