关于Strong Name的主题,网上已经有很多这方面的介绍,你可能最熟悉的印象就是这样
大部分的情况,这样就可以了。如果代码是机密的,还可能用到Delay sign only,这就复杂一些,请查找相关资料。
如果就这么做了,代码中没有什么处理,可能你的程序还不够安全,因为有个Strong Name Remover可以很容易的清除你的签名,它运行起来是这样的
如果你不想让你的程序被这个小程序折磨,那你应该看一下这篇文章。
仅仅有签名还不够,你还需要在你的程序集中检测签名,而且检测到的签名只能是我自己的名字。
请到Visual Studio Tools中找到命令行,启动它,并执行sn –Tp Application,如下图所示
它显示出了public key token,把这个记下来,稍后我的程序中要用到。再来写检测签名的代码,代码如下所示
public static void PreInitCoreSetup()
{
//check singature
bool pfWasVerified = false;
string fcommon = "Flextronics.Framework.Common.dll";
bool licensed = StrongNameSignatureVerificationEx(fcommon, true, ref pfWasVerified);
if (!licensed)
throw new FatalException(Shared.LicenseExceptionError);
}
看这几句话,它检测传入应用程序集是否有签名,也就是否有strong name,如果没有则会抛出异常。这里用到了Native method,它的签名如下所示
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
private static extern bool StrongNameSignatureVerificationEx(
string filePath,
bool forceVerification,
ref bool wasVerified
);
继续看代码,我们不仅仅要保证程序集有签名,而且要有我自己的签名。请看下面的程序片段
public static void EnsureAssemblyIsSigned(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly");
byte[] pubkey = assembly.GetName().GetPublicKeyToken();
if (pubkey.Length == 0)
throw new ArgumentException("No public key token in assembly.");
StringBuilder builder = new StringBuilder();
foreach (byte b in pubkey)
{
builder.AppendFormat("{0:x2}", b);
}
string pkString = builder.ToString();
if(pkString != Shared.PublickKey)
{
throw new FatalException(Shared.LicenseExceptionError);
}
}
这几句话的意思,是获取程序集的签名,与我们自己的签名是否相符合,如果是则验证通过,否则立即终止程序执行。
最后一句中的Shared.PublickKey,就是上面图中sn中最后一行显示的d1063c1538fcc2c8。
启动程序调试,在Visual Studio中看到,它显示的publick key与我们用sn工具看到的是一样的。
有了这两步,不仅仅实现了验证程序集有签名,而且要有自己的签名。为什么要这样做呢,因为strong name可以被替换掉,在破解程序中,经常会用到替换strong name,比如这个程序,它可以实现替换程序集的strong name
如图所示,选择指定的程序集,再指定一个key,它就可以实现strong name的替换。自己辛苦写的程序,那么轻松的就被人破解了,你肯定很不舒服,那就请使用这篇文章中介绍给你技术,应用strong name来保护你的程序集。
软件破解与保护,矛与盾的斗争,希望本文能给你带来帮助。
请到epn.codeplex.com(http://epn.codeplex.com/releases/view/68647)中下载最新版的Data Loader。