C# Assembly.LoadFrom-使用证据重载验证强名称签名

C# Assembly.LoadFrom-使用证据重载验证强名称签名,c#,.net,assemblies,C#,.net,Assemblies,是否可以将Assembly.LoadFrom重载与证据参数一起使用,以确保程序集具有强名称?我希望能够指定程序集名称、区域性、版本和公钥令牌。如果其中任何信息不匹配,则程序集将无法加载。加载程序集后,您可以获取该程序集的公钥-如果该程序集加载成功并具有公钥,则该程序集的强名称为: Assembly assembly = Assembly.LoadFrom (...); byte[] pk = assembly.GetName().GetPublicKey(); 更好的方法是,在加载程序集之前检

是否可以将Assembly.LoadFrom重载与证据参数一起使用,以确保程序集具有强名称?我希望能够指定程序集名称、区域性、版本和公钥令牌。如果其中任何信息不匹配,则程序集将无法加载。

加载程序集后,您可以获取该程序集的公钥-如果该程序集加载成功并具有公钥,则该程序集的强名称为:

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()返回非null值,然后程序集成功加载,则该程序集具有有效的强名称。

加载程序集后,可以获取该程序集的公钥-如果该程序集成功加载且具有公钥,则该程序集具有强名称:

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()返回一个非null值,然后程序集成功加载,则它具有一个有效的强名称。

我有一种方法可以中断修补System.Windows.Forms.dll的强名称验证。如果我在使用它,你对此无能为力。我的把戏需要完全信任

我所做的是修补dll,部署修补后的dll,对其进行加密,并修补加载程序以拾取修补后的ngen映像,而不是原始映像。我能做的就是把股票砸了。(实际上,我测试了这条路径,并认为可能破坏其他人的软件是一个糟糕的选择。)


我不是说这是个好主意。我是说依赖于验证Assembly.Load的签名是个坏主意。

我有办法打破修补System.Windows.Forms.dll的强名称验证。如果我在使用它,你对此无能为力。我的把戏需要完全信任

我所做的是修补dll,部署修补后的dll,对其进行加密,并修补加载程序以拾取修补后的ngen映像,而不是原始映像。我能做的就是把股票砸了。(实际上,我测试了这条路径,并认为可能破坏其他人的软件是一个糟糕的选择。)


我不是说这是个好主意。我是说依赖于验证来自Assembly.Load的签名是个坏主意。

我找到了另一种方法

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

Assembly.Load(assemblyName);
var assemblyName=new assemblyName();
assemblyName.CodeBase=
Assembly.Load(assemblyName);

我找到了另一种方法

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

Assembly.Load(assemblyName);
var assemblyName=new assemblyName();
assemblyName.CodeBase=
Assembly.Load(assemblyName);
尝试枚举:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
请尝试枚举:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);

你可能会推迟签字吗?如果是这样的话,这将只在您为该程序集禁用强名称验证(sn-Vr)的机器上工作。否则,你在干什么?.NET framework程序集的私钥是否泄漏?该密钥尚未泄漏。加载器假设它得到的文件就是它要求的文件。@Joshua你能更详细地解释一下你的技巧是如何用于教育目的的吗@盖瑞·普雷托里厄斯:完成了。你可能会推迟签字吗?如果是这样的话,这将只在您为该程序集禁用强名称验证(sn-Vr)的机器上工作。否则,你在干什么?.NET framework程序集的私钥是否泄漏?该密钥尚未泄漏。加载器假设它得到的文件就是它要求的文件。@Joshua你能更详细地解释一下你的技巧是如何用于教育目的的吗@格瑞·普雷托里厄斯:好了。