Assembly.LoadFrom - utilisation de la surcharge de preuves pour vérifier la signature de nom fort

StackOverflow https://stackoverflow.com/questions/809934

  •  03-07-2019
  •  | 
  •  

Question

Est-il possible d’utiliser la surcharge Assembly.LoadFrom avec le paramètre Evidence pour s’assurer que l’assemblage porte un nom fort? Je souhaite pouvoir spécifier le nom de l'assembly, la culture, la version et le jeton de clé publique. Si l'une de ces informations ne correspond pas, le chargement de l'assemblage échouera.

Était-ce utile?

La solution 3

J'ai trouvé un autre moyen de le faire.

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

Assembly.Load(assemblyName);

Autres conseils

Vous pouvez obtenir la clé publique d'une assemblée après l'avoir chargée. Si le chargement est réussi et qu'il possède une clé publique, son nom fort est:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

Mieux encore, vérifiez la clé publique et les informations de version de l'assemblage avant de le charger:

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

Si GetPublicKey () renvoie une valeur non NULL et que l'assembly est chargé avec succès, il porte un nom fort valide.

J'ai un moyen de rompre la vérification du nom fort pour corriger System.Windows.Forms.dll. Si je l'utilise, vous ne pouvez rien y faire. Mon tour nécessite une confiance totale.

Ce que j’ai fait, c’est patcher la dll, déployer la dll corrigée, ngen et patcher le chargeur pour récupérer l’image ngen corrigée au lieu de l’originale. Ce que j’aurais pu faire, c’est d’empiéter sur les stocks normés. (J'ai effectivement testé ce chemin et décidé de casser potentiellement le logiciel de quelqu'un d'autre était un mauvais choix.)

Je ne dis pas que c'est une bonne idée à faire. Je dis que cela dépend de la vérification des signatures de Assembly.Load est une mauvaise idée.

Essayez l’énumération : System.ReflectionAssemblyNameFlags :

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top