C# application 强命名 和 混淆

强命名可以使assembly具有唯一性(即使名字相同),使程序加载的assembly是可以信赖的程序集,但是强命名只能应用于.net framework 托管代码,所以微软有另外一个Authenticode 签名,它可以应用于托管代码和非托管代码。

强命名有两点需要注意

1. 如果assembly 需要安装进GAC,那必须要做强命名。

2. 如果assembly 将被强命名的assembly  引用,也必须做强命名。

混淆可以更好的保护代码的安全性,保护托管代码,防止被反编译。

这两个之间的具体使用可以参照转载

对于Strong Name来说,如果自己开发的Project 需要进行Strong name, 那么编译器会自动对Project 应用的Assembly进行Strong name 检查,检查引用的assembly是否进行了强命名,如果你要开发一个assembly 给其他公司使用,那么我们会遇到下面的问题:

你开发的assembly被引用之后,有bug, 但是自己又无法重现,需要利用对方的程序才能重现,这样我们可能需要安装对方的程序(IP原因,对方不可能给你源代码或者没有经过混淆的代码),然后编译自己的assembly替换安装的程序中的assembly,进行调试。如果他们在Release的时候对你的assembly进行了strong name, 你替换assembly之后并不能进行调试,因为对方的程序会检测strong name, 这时候我们需要怎样处理呢?

Step1: 找到对方给你assembly签名时的public key, 运行下面命令后就会得到assembly.dll的public key

sn -T assembly.dll

Step2: 运行下面命令去 skip strong name 的validation, 这样所有这个public key的assembly都不会检测这个strong name.

sn - Vr *,key

实际上该命令是在注册表里写了键值,比如

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,55624f8ac7c20aa6]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,55624f8ac7c20aa6]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,bc24dc22e8ee9a7e]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,bc24dc22e8ee9a7e]

如果想查看这个dll/exe是否已经被Strong Named, 可以利用下面命令

C:\> sn -vf C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

如果运行结果是:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30128.1

Copyright (c) Microsoft Corporation.  All rights reserved.

Assembly 'C:\...\System.Data.dll'is valid

那就说明已经被strong named, 否则就是没有被strong named 或者只有public key, 以后再signed.

那么怎样对第三方的Assembly 进行strong name的操作呢?

如果你需要引用第三方的binaries,但是第三方的binaries还没有进行strong name,那么我们可以要求对方做,如果对方不做,那么我们需要自己进行strong name,步骤如下:

1。利用SN工具产生k文件,

sn -k mykey.snk

2。将所有没有strong name的binaries进行DASM, 

ildasm  binaryname.dll  /output=binaryname.il

3。用文本工具(例如NotePad++)打开每个binaryname.il查看每个dll reference的其他dll是否签名,如果没有签名,那么需要把mykey.snk(自己产生的k文件)中的public key填到对应的位置,比如:

.assembly extern binaryname
{
  .publickeytoken = (BE CA 05 5E 5B 7D 2D C8 ) // 如果你产生的snk文件的public key token是beca055e5b7d2dc8
  .ver 2:0:0:0
}

4。利用ILASM 去签名并产生新的dll, 注意:如果第二步中如果除了il还有res文件的话,在合成的时候需要加上这个res文件。

ILASM.exe binaryname.il /resource=binaryname.res  /DLL  /output=binaryname.dll /key=mykey.snk

经过上述4个步骤就可以对第三方的dll进行签名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值