应用Strong Name保存.NET应用程序集
关于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。