zoukankan      html  css  js  c++  java
  • 应用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。

  • 相关阅读:
    Ajax配合Node搭建服务器,运用实例
    mapMutations m
    seaJS使用教程
    节流函数
    【Gin-API系列】Gin中间件之日志模块(四)
    【Gin-API系列】配置文件和数据库操作(三)
    【Gin-API系列】请求和响应参数的检查绑定(二)
    【Gin-API系列】需求设计和功能规划(一)
    【ansible】api 调用出现ssh交互式输入
    【ansible】api 调试
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/4732306.html
Copyright © 2011-2022 走看看