2009-05-01 103 views

回答

0

我发现了另一种方法来做到这一点。

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

Assembly.Load(assemblyName); 
2

您可以加载它后得到议会的公共密钥 - 如果它成功加载并具有公共密钥,那么它的强名称:

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()返回一个非空值,然后组装成功加载,它有一个有效的强名称。

1

我有办法打破修补System.Windows.Forms.dll的强名称验证。如果我正在使用它,你可以做的事情就不多了。我的诡计需要完全信任。

我所做的就是修补dll,部署修补过的dll,修改它,然后修补加载程序以获取修补过的ngen图像而不是原始图像。我所能做的就是破坏股票的dll。 (我实际测试过这条路,并决定有可能打破别人的软件是一个糟糕的选择。)

我不是说这是个好主意。我说这取决于从Assembly.Load验证签名是一个坏主意。

+0

您是否延迟签名?如果是这样,这只会在您禁用该组件的强名称验证(sn -Vr)的机器上运行。否则,你在做什么? .NET框架程序集的私钥是否泄露? – 2009-05-01 02:53:33