Assembly.LoadFrom: uso de la sobrecarga de evidencia para verificar la firma de nombre seguro

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

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Es posible usar la sobrecarga Assembly.LoadFrom con el parámetro Evidence para garantizar que el ensamblado tenga un nombre sólido? Quiero poder especificar el nombre del ensamblado, la cultura, la versión y el token de clave pública. Si alguna de esta información no coincide, el ensamblado no se cargará.

¿Fue útil?

Solución 3

Encontré otra forma de hacer esto.

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

Assembly.Load(assemblyName);

Otros consejos

Puede obtener la clave pública de un ensamblado después de cargarla; si se carga correctamente y tiene una clave pública, entonces tiene un nombre seguro:

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

Mejor aún, verifique la clave pública del ensamblado y la información de versión antes de cargarlo:

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

Si GetPublicKey () devuelve un valor no nulo, y luego el ensamblado se carga con éxito, tiene un nombre seguro válido.

Tengo una manera de romper la verificación de nombre seguro para parchear System.Windows.Forms.dll. Si lo estoy usando, no hay mucho que puedas hacer al respecto. Mi truco requiere plena confianza.

Lo que hice fue parchear el dll, desplegar el dll parcheado, ngen it, y parchear el cargador para recoger la imagen ngen parcheada en lugar del original. Lo que pude haber hecho fue golpear el dll generado por acciones. (De hecho, probé este camino y decidí que potencialmente romper el software de otra persona era una mala elección).

No digo que sea una buena idea. Lo digo dependiendo de verificar las firmas de Assembly.Load es una mala idea.

Pruebe la System.ReflectionAssemblyNameFlags enumeración:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top