澳门新葡萄京娱乐场 14

澳门新葡萄京娱乐场如何使一个你没有源代码的DLL文件变为强命名的DLL

世家都晓得 ASP.NET 生成的 DLL 只是中等语言,用非常多工具,例如 .NET Reflector 就能够以预知见源代码。

强名称是由程序集的标志加上公钥和数字签字组成的。在这之中,程序集的标志满含轻易文本名称、版本号和区域性新闻(假如提供的话)。强名称是运用相应的私钥,通进度序集文件(富含程序集清单的公文,并因此也暗含构成该程序集的有所文件的称号和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其余开垦工具能够将强名称分配给贰个主次集。强名称大器晚成致的次序集应该是雷同的。

  临时候你会须求一个DLL是强命名的,例如您想把那一个文件放到GAC里面。若是这是叁个第三方的DLL,你从未源代码,那会是风流洒脱件比较麻烦的作业。有二个方法能够解决这些标题。 

爱护源代码,有人用混淆工具,将变量命名称叫a、b、c 这种人看起很累的称号,举例 Dotfuscator 那些工具就很常用,况且 Visual
Studio 中以前在菜单“工具”中融为生机勃勃体了底工版。

因而签发具备强名称的程序集,您可以保证名称的全局唯意气风发性。强名称还特意满意以下供给:

  在VS.NET的命名行窗口下,输入如下的代码。 

而临时候,大家对源代码的护卫倒不是专门急切,倒是希望顾客不要转移大家的代码,比方:授权使用,利用不对称加密,顾客看见了源代码也只有公钥,未有私钥,就无法算出注册码。

1State of Qatar        强名称信任于唯后生可畏的密钥对来保障名称的唯生龙活虎性。任哪个人都不会变动与你生成的同后生可畏的程序集名称,因为用叁个私钥生成的顺序集的称号与用别的私钥生成的前后相继集的称呼差异等。

  1 ,生成叁个KeyFile 

可是客户有生龙活虎招,能够和煦改 DLL,将表达授权行使这段代码去除,然后用新的
DLL 覆盖老的 DLL,照样达到规定的标准了破解的指标。

2卡塔尔(قطر‎        强名称尊敬程序集的本子沿袭。强名称能够确定保障未有人能够转移您的前后相继集的三回九转版本。客商能够确信,他们所加载的次序集的版本出自创造该版本(应用程序是用该版本生成的)的同一个发行者。

  sn -k keyPair.snk 

可是付出集团也许有法幸免客商修正的,就是用签名/强命名。

强名称提供可相信的完整性检查。通过 .NET Framework 安检后,就能够确信程序集的剧情在改造后未被更改过。但请细心,强名称中或强名称自个儿并不暗含信赖等级,比方由数字签字和帮助证书提供的信任。

  2, 获得程序集的MSIL 

入选须要维护的档期的顺序,按 Alt + Enter 键,走入属性页面,切换来签订左券标签:

尽管强名称是.NET加密世界的长者,也是微软推荐的应用程序敬爱体制,不过由于托管程序能够被反汇编成IL代码,改过也许去除强名称也就成了可能。强名称的护卫强度也因而大大收缩。

  ildasm SomeAssembly.dll
/out:SomeAssembly.il  

澳门新葡萄京娱乐场 1

9.2.1  使用强名称珍贵代码完整性

当大家从互联网络下载叁个前后相继集供本地调用的时候,怎么着保管这几个顺序集是未经第三方恶意篡校勘的吗?要是七个程序集的称号、大小、版本号都同样是或不是就代表那七个程序集文件就同一了啊?

在.NET平台下分别程序集应用的方法和Win32同生机勃勃,使用名称,但是名称有强弱之分。弱名称蕴含版本号、程序集名称和知识。强名称在弱名称的底工上增多了数字具名。强名称的效用至关心珍视要有多少个:一是分别区别的次序集;二是保障代码未有被篡校勘;三是在.NET中,独有强名称签字的程序集技巧放手全局程序集缓存中。

运用强名称来含有程序集我们率先要调换用于非对称加密的密钥对,那对密钥将用来程序集的签字和认证。签定和认证的流程如图9-3所示。

澳门新葡萄京娱乐场 2

图9-3 签定(上)与认证(下)强名称流程

如图9-3所示,在扩充强名称签字的时候我们首先对程序集(不包蕴DOS头和PE头)进行Hash运算,得到文件的散列值,然后利用私钥对散列值举行加密,得到密文。然后将公钥、公钥标记(对公钥实行SHA-1散列运算后获取的密文的末尾8个字节)和密文四个音讯保存在程序聚焦。在加载该程序集时,首先对该程序集实行Hash运算取得三个Hash值(我们称为“新Hash值”),然后从程序聚焦提取公钥对密文解密拿到原始的Hash值,就算三个Hash值相似,即经过认证。

对程序集签字有正规具名和延期签订二种方式。

延迟签署是在我们开采人士只具有对公钥的访谈权限而未有对私钥的拜望权限期利用的。那是大家能够先将顺序集编译并留住签字空间。此时的主次集不能够平常运维和调治将养。

9.2.2.1  在SDK中创制强名称具名的前后相继集

对程序集举办强名称具名,我们要率先打算好密钥。在本书的第6章中,介绍过使用Visual Studio
SDK中提供的强名称工具(Sn.exe)能够生成密钥对。大家使用如图9-4的一声令下生成一个新的密钥对并保留到地方文件test.snk中。

澳门新葡萄京娱乐场 3

 

图9-4  生成密钥文件

接下去我们新建三个调控台测验项目StrongName,主要代码如代码清单9-3所示。

代码清单9-3  StrongName项目主要代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 
  
namespace StrongName 

    class Program 
    { 
        static void Main(string[] args) 
        { 
            string aa = “”;

Assembly ass = Assembly.GetExecutingAssembly(); 
            Console.WriteLine(ass.FullName.ToString()); 
            byte[] pKey =
ass.GetName().GetPublicKey(); 
            byte[] pKeyToken =
ass.GetName().GetPublicKeyToken(); 
            string pKeyString =
GetString(pKey); 
            string pKeyTokenString =
GetString(pKeyToken); 
            Console.WriteLine(“公钥是:{0}”,pKeyString); 
            Console.WriteLine(“公钥标志是{0}”, pKeyTokenStringState of Qatar; 
            Console.Read(); 
        } 
  
        private static string GetString(byte[] bytes) 
        { 
            StringBuilder sb
= new StringBuilder(); 
            foreach (byte b in bytes) 
            { 
                sb.Append(string.Format(“{0:x}”,b)); 
            } 
            return sb.ToString(); 
        } 
    } 
}

代码清单9-3的代码非常粗大略,使用反射来列举当前前后相继集的称号和行使的公钥及公钥标志。在并未有对程序集进行强名称签字时我们运路程序拿到如图9-5的结果。

澳门新葡萄京娱乐场 4

 

图9-5 未有对程序集进行强名称签字时期码清单9-3的运转结果

下边大家在指令行对C#编写翻译器(csc.exe)施行如图9-4所示的吩咐。

澳门新葡萄京娱乐场 5

 

图9-4 对前后相继集应用强名称

澳门新葡萄京娱乐场 ,近些日子大家再来推行方才生成的Program.exe,看看结果怎么着,如图9-5所示。

澳门新葡萄京娱乐场 6

 

图 9-5  对程序集进行强名称具名之后代码清单9-3的运作结果

从图9-5我们可已看见,实践强名称签字之后我们成功的输出公钥和公钥标记。

为了使编写翻译器能活动为代码进行强名称具名大家得认为代码增加本性指明强名称具名需求的密钥文件。增加本性之后的代码示比方代码项目清单9-4所示。

代码清单9-4  使用个性开展强名称具名

using System;

using System.Reflection;

 [assembly:AssemblyKeyFileAttribute(“TestKey.snk”)]

代码项目清单9-4行使 AssemblyKeyFileAttribute 钦定包涵密钥没有错文书的名称。

当大家须要对前后相继集进行延期签订左券的时候,大家必要对 AssemblyDelaySignAttribute性格和AssemblyKeyFileAttribute 一同利用,形式如代码清单9-5所示

 

using System;

using System.Reflection;

  [assembly:AssemblyKeyFileAttribute(“myKey.snk”)]

     
[assembly:AssemblyDelaySignAttribute(true)]

如代码清单9-5,当大家须要对前后相继集延迟签订左券的时候,大家要钦定满含公钥的文本并设定AssemblyDelaySignAttribute天性值为true。

9.2.2.2  在VS中开创强名称具名的前后相继集

在SDK中张开强名称具名未免麻烦了有的,上面大家以VS二零一零为例,批注怎样在Visual Studio中开展强名称具名的操作。

咱俩张开项目标属性,切换来签订左券页,如图9-6所示。

澳门新葡萄京娱乐场 7

 

图9-6  项指标具名页

从图9-6中本人得以观望,项目签订属性页中富含了七个大的安顿项,第贰个是为ClickOnce清单具名,第三个是为顺序集签字,第几个是延迟签订合同。

为了接纳ClickOnce布置宣布应用程序,应用程序和布署清单必需采用公钥/私钥对进行强命名并行使Authenticod 本领扩充签名。能够动用Windows证书存款和储蓄区的证件或密钥文件为清单具名。也能够创建新的测验注解。

为顺序集具名的选项中,我们可以筛选密钥文件可能生成新的密钥文件来对程序集举办具名。

假设勾选了仅推迟签订合同,那么将对程序集举办延期签订左券。

如图9-7,在开创了ClickOnce签名和次序集签字之后,项目活动加多了多个密钥文件StrongName_TemporaryKey.pfx和test.pfx。

澳门新葡萄京娱乐场 8

 

图9-7  创设ClickOnce具名和程序集签字

强名称具名的顺序集如果被歪曲,那么CLMurano在加载该程序集进行完整性验证的时候就会停业。大家现在采纳文本编辑工具展开StrongName.exe,在保管不破坏PE文件格式的前提下对其打开容易的纠正,这里自个儿只把程序中定义的变量aa替换来bb,如图9-8所示。

澳门新葡萄京娱乐场 9

 

图9-8 改进强名称签名的程序集

修正之后,大家重国民党的新生活运动行StrongName.exe,见到程序报出的极其为强名称验证失利,入图9-9所示。

澳门新葡萄京娱乐场 10

 

图9-9 强名称验证失利

注意

1.       强名称具名的次序集无法援用未被具名的次第集。

2.  从 .NET
Framework 3.5 版ServicePack 1开端,当程序集载入完全信赖应用程序域(举例 MyComputer 区域的私下认可使用程序域)中时,将不会验证强名称具名。 那名字为强名称跳过功用。 在完全信任遇到中,对于已签定的通通相信程序集,无论那些程序集的具名是什么,对 StrongNameIdentityPermission 的需求将接连成功。 强名称跳过作用防止了在这里情形下验证完全相信程序集的强名称签字所带给的不必要费用,进而可使程序集更快加载。

该跳过功用适用于用强名称签字并富有以下特征的此外程序集:

1卡塔尔(قطر‎   完全受信任而未有 StrongName 证据(举例,具有 My计算机 区域证据)。

2卡塔尔(قطر‎   加载到完全受信任的 AppDomain 中。

3卡塔尔   从该 AppDomain 的 ApplicationBase 属性下的职位加载。

4卡塔尔   未经延迟签订公约。

能够对单身的应用程序或任何计算机禁止使用此成效。 

1)   对富有应用程序禁止使用强名称跳过作用

在 32 位Computer上,在系统注册表中的 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework 项下创造二个子项。 使用 DWOEvoqueD 值为 0 的项名称 AllowStrongNameBypass。

在 64 位计算机上,在系统注册表中的 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework 项下成立多少个子项。 使用 DWO福睿斯D 值为 0 的项名称 AllowStrongNameBypass。 在HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework 项下创立相仿的子项。

2)   对单个应用程序禁止使用强名称跳过成效

张开或创办应用程序配置文件。加多底下的项:

<configuration>

 <runtime>

 <
bypassTrustedAppStrongNames enabled=”false” />

 </runtime>

</configuration>

可通过移除该配置文件设置或将该性格设置为“true”为该应用程序复苏跳过功用。

  3 ,为了防止冲突,把原本的DLL文件改名 

谐和新建三个强名称密钥文件,这一个文件要保密,然后再次生成,DLL 就受保证了。

9.2.2  援引强名称签字的次第集

引用强名称程序集的进度对大家来讲都以透明,大家没有必要做额外的专门的学业。然则大家得以由此这种艺术来调查强名称程序集的效劳。

如图9-10大家先是成立一个类库项目StrongNameReferenceLib,对其举办强名称签字。

澳门新葡萄京娱乐场 11

       图9-10  援引强名称程序集

接下去我们改进以前创设的StrongName项目,让它来援引StrongNameReferenceLib项目,调用其GetHello方法。

StrongNameReferenceLib项目标严重性代码如代码清单9-6所示。

代码清单9-6
StrongNameReferenceLib项目根本代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
  
namespace StrongNameReferenceLib 

    public class Class1 
    { 
        public static string GetHello() 
        { 
            return “Hello”; 
        } 
    } 
}

校订后的斯特朗Name项目代码如代码清单9-7所示。

代码清单9-7 StrongName项目代码

using System.Text; 
using System.Reflection; 
using StrongNameReferenceLib; 
  
namespace StrongName 

     
    class Program 
    { 
        static void Main(string[] args) 
        { 
          Console.WriteLine(  Class1.GetHello()); 
            
            Console.Read(); 
        } 
    } 
}

再次编译StrongName项目,大家后日收获新的斯特朗Name.exe文件。使用ILDasm展开StrongName.exe文件,查看它的程序集清单,如图9-11所示。

澳门新葡萄京娱乐场 12

 

图9-11  StrongName.exe程序集清单

 在图9-11中的那份程序集清单,大家能够见见它引用了三个颇负强名称签字的程序集,mscorlib和大家新创制的StrongNameReferenceLib,对多少个程序集分别增多了本子和publickeytoken标记。

上边咱们去除StrongNameReferenceLib的强名称签字,重新编译该项目,但大家并不重复编译StrongName项目,而用新调换的StrongNameReferenceLib.dll替换斯特朗Name.exe此前引用的StrongNameReferenceLib.dll,看看会时有爆发业务。结果如图9-12所示。

澳门新葡萄京娱乐场 13

 

图9-12  StrongName项目替换dll之后结果

小编们从图9-10的不胜音讯方可看看,StrongName项目找不到格外的程序集。原因在于在StrongName的顺序集清单中存放着PublicKeyToken值,而从不强名称签名的系列是一贯不应当属性的。

9.2.3  强名称的柔弱性

上边的多少个小节我们联合体会了强名称对先后集的保养情势和原理,可是这种爱慕的强度到底有多大啊?对恶意点窜者来讲能获得管用的守卫吗?大家先看下边包车型客车例子。

近年来大家再次回到代码项目清单9-7,重新对StrongNameReferenceLib项目进展强名称具名,然后编写翻译StrongName项目。今后在斯特朗Name项指标bin目录里有StrongNam.exe和斯特朗NameReferenceLib.dll七个文本。然后接纳ILDasm展开斯特朗NameReferenceLib.dll文件,转储为il文件,这里小编使用记事本张开il文件,如图9-13所示。

澳门新葡萄京娱乐场 14

 

       图9-13  StrongNameReferenceLib.dll的IL源码

咱俩在.il文件中找到三处代码:publickkeytoken、publickey和hash,把相应的开始和结果都剔除,再另行利用ILAsm编写翻译,这个时候该程序集的强名称就被成功的去除。

轮换程序集的强名称方法基本雷同。方今互联网上有相当多删减和替换强名称的工具,这里就不讳言了。

那么大家相应经过什么的方法来保卫安全强名称不被去除可能点窜呢?那一个主题材料我会在极其的篇章里商量。

代码清单9-5  对程序集延迟签订公约的特点表明

  ren SomeAssembly.dll
SomeAssembly.dll.orig  

当 DLL 已经签约:

  4 , 使用导出的MSIL和刚成立的KeyFile生成贰个新的的DLL文件。 

  • 借使将就原有
    DLL,在下面间接改,由于文件已经转移,所以本来签字失效,软件不恐怕运维。
  • 若是用没有签字的 DLL 替换该 DLL,软件不能运营。
  • 即使用不一致的强名称密钥文件具名的
    DLL 替换该 DLL,软件无法运维。
  • 若果用平等的强名称密钥文件具名的
    DLL 替换该
    DLL,软件本领够符合规律运转。由于客商不能拿到强名称密钥文件,所以它不能做三个均等具名的
    DLL。

  ilasm SomeAssembly.il /dll /key=
keyPair.snk  

当 DLL 未有签署:

  这几个工具都在哪里? 

  • 比如用没有签署的 DLL 替换该 DLL,软件正常运转。
  • 若果用曾经签订公约的 DLL 替换该 DLL,软件不能运营。

  C:WINDOWSMicrosoft.NETFrameworkv2.0.50727ilasm.exe

  C:Program FilesMicrosoft Visual
Studio 8SDKv2.0Binildasm.exe

  C:Program FilesMicrosoft Visual
Studio 8SDKv2.0Binsn.exe

  

  为未有源码的DLL文件添抓好名称

  倘使项目中引用了任何未有源码的dll文件,况且此dll文件是绝非强名称的程序集,则编写翻译时会现身犹如”Assembly generation failed — 援用的顺序集 ‘xxxxxxxxxxx’ 未有强名称”
那样的谬误。
本人这里援用的是Interop.Scripting.dll程序集,它不是强名称的,则必要开展以下操作:
  1.展开SDK
命令提示窗口;
    
2.创办一个新的即兴密钥对:
  sn -k
Interop.Scripting.snk
  3.反编写翻译目的程序集
  ildasm Interop.Scripting.dll /out=Interop.Scripting.il   3.双重编写翻译,附带强命名参数
  ilasm Interop.Scripting.il /dll /resource=Interop.Scripting.res
/key=Interop.Scripting.snk /optimize

  4.验证具名音讯
  sn -v Interop.Scripting.dll
  OK,将扭转的dll文件再一次引进到花色中然后编译。

发表评论

电子邮件地址不会被公开。 必填项已用*标注