应用Strong Name保存.NET应用程序集

关于Strong Name的主题,网上已经有很多这方面的介绍,你可能最熟悉的印象就是这样

image

大部分的情况,这样就可以了。如果代码是机密的,还可能用到Delay sign only,这就复杂一些,请查找相关资料。

如果就这么做了,代码中没有什么处理,可能你的程序还不够安全,因为有个Strong Name Remover可以很容易的清除你的签名,它运行起来是这样的

image

如果你不想让你的程序被这个小程序折磨,那你应该看一下这篇文章。

仅仅有签名还不够,你还需要在你的程序集中检测签名,而且检测到的签名只能是我自己的名字。

请到Visual Studio Tools中找到命令行,启动它,并执行sn –Tp Application,如下图所示

image

它显示出了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工具看到的是一样的。

image

有了这两步,不仅仅实现了验证程序集有签名,而且要有自己的签名。为什么要这样做呢,因为strong name可以被替换掉,在破解程序中,经常会用到替换strong name,比如这个程序,它可以实现替换程序集的strong name

image

如图所示,选择指定的程序集,再指定一个key,它就可以实现strong name的替换。自己辛苦写的程序,那么轻松的就被人破解了,你肯定很不舒服,那就请使用这篇文章中介绍给你技术,应用strong name来保护你的程序集。

 

软件破解与保护,矛与盾的斗争,希望本文能给你带来帮助。

 

请到epn.codeplex.com(http://epn.codeplex.com/releases/view/68647)中下载最新版的Data Loader。

posted @ 2011-11-15 09:03  信息化建设  阅读(2988)  评论(8编辑  收藏  举报