情况如下。我有DLL A和B. A.dll引用并使用B.dll中的代码。 B.dLL没有做它应该做的事情,所以我试图给它添加一些调试语句。
我使用ilSpy反编译B.dll并添加我想要的代码,编译一个新的B.dll,删除旧的并删除我的新代码。
现在A.DLL因此错误而失败。
System.IO.FileLoadException: Could not load file or assembly 'B, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b089z623fagfd396' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'B, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b089z623fagfd393'
由于我没有源代码或私钥,我认为我不可能获得DLL的公钥来匹配旧的公钥。由于该键不匹配,引用失败。这是设计的吗?结构是专门为防止我做我想做的事情而构建的。基本上,我想我正在攻击一个我没有源代码的应用程序。
无论如何我能做到吗?
我想我也可以反编译并重建A.dll,但实际上大约有200个DLL都互相引用。
答案 0 :(得分:1)
结构是否专门用于阻止我做我正在做的事情。
是的,强烈命名程序集(给它一个公钥令牌)的原因之一是阻止您尝试执行的确切过程。
至于必须重新编译100个DLL的替代方法,可以禁用对该密钥using the sn
tool的验证,因此理论上您需要做的就是
sn –Vr *,b089z623fagfd393
如果尝试加载没有密钥的DLL,那么正在查找使用密钥b089z623fagfd393
签名的任何DLL的所有集合都不会再出错。
完成测试后,您可以
sn –Vu *,b089z623fagfd393
为该单个键或
重新启用它sn -Vx
为所有先前设定的豁免重新启用它。