我继承了一个C#.NET应用程序,需要对其中一个DLL程序集中的某些路径名字符串稍作修改。遗憾的是,我没有源代码。
我使用ILSpy和Reflexil插件进行了必要的修改。当我保存DLL时,我告诉原始文件已签名,新文件在没有签名的情况下无法正常工作。新文件现在"延迟签名"。
我可以看到公钥,公钥令牌和带Reflexil的哈希算法。
我对.NET IL完全陌生。如何使用我所拥有的公钥信息签署修补的DLL?
我有Visual Studio 2013,因此可以访问sn.exe,如果有帮助的话。
答案 0 :(得分:3)
正如Luaan所说,我想做的事情是不可能的。私钥就是私密的。公钥是为验证目的而设计的,以确保程序集未被修改。
Luaan在其中一条评论中说,删除强名称是一种选择。然而,这对我不起作用,因为存在许多依赖性,使得该方法不切实际。
作为临时解决方案,我已将程序集文件延迟签名,并在注册表中禁用了相关DLL的强名称验证。
要禁用强名称验证,请将此密钥添加到注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\<filename without extension>,<public key token>
对于64位系统,您还需要添加此键:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\<filename without extension>,<public key token>
请注意,建议禁用强名称验证仅用于测试目的,因为这可能代表安全问题。