【问题标题】:Assembly.LoadFrom - using Evidence overload to verify strong name signatureAssembly.LoadFrom - 使用证据重载来验证强名称签名
【发布时间】:2009-05-01 02:12:46
【问题描述】:

是否可以使用带有 Evidence 参数的 Assembly.LoadFrom 重载来确保程序集被强命名?我希望能够指定程序集名称、文化、版本和公钥标记。如果任何这些信息不匹配,则程序集将无法加载。

【问题讨论】:

    标签: c# .net assemblies


    【解决方案1】:

    您可以在加载后获取程序集的公钥 - 如果加载成功并且有公钥,则它是强命名的:

    Assembly assembly = Assembly.LoadFrom (...);
    byte[] pk = assembly.GetName().GetPublicKey();
    

    更好的是,在加载之前检查程序集的公钥和版本信息:

    AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
    byte[] publicKey = an.GetPublicKey();
    CultureInfo culture = an.CultureInfo;
    Version version = an.Version;
    

    如果 GetPublicKey() 返回非空值,然后程序集成功加载,则它具有有效的强名称。

    【讨论】:

      【解决方案2】:

      我有办法打破修补 System.Windows.Forms.dll 的强名称验证。如果我正在使用它,那么您无能为力。我的伎俩需要完全信任。

      我所做的是修补 dll,部署修补的 dll,ngen 它,然后修补加载程序以获取修补的 ngen 图像而不是原始图像。我本可以做的是破坏股票 ngened dll。 (我实际上测试了这条路径,并认为可能破坏其他人的软件是一个糟糕的选择。)

      我并不是说这样做是个好主意。我是说依赖于 Assembly.Load 验证签名是个坏主意。

      【讨论】:

      • 您可能在延迟签名吗?如果是这样,这只适用于为该程序集禁用强名称验证 (sn -Vr) 的机器。否则,你在做什么? .NET 框架程序集的私钥是否泄露?
      • 密钥没有泄露。加载器假定它获取的文件是它请求的文件。
      • @Joshua 您能否更详细地解释您的技巧如何用于教育目的。 ?
      • @GerriePretorius:完成。
      【解决方案3】:

      我找到了另一种方法。

      var assemblyName = new AssemblyName(<fully qualified type name>);
      assemblyName.CodeBase = <path to assembly>
      
      Assembly.Load(assemblyName);
      

      【讨论】:

        【解决方案4】:

        试试System.ReflectionAssemblyNameFlags 枚举:

        bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-12
          • 2011-09-22
          • 2018-07-14
          • 2020-06-11
          相关资源
          最近更新 更多