2012-06-19 18 views
5

Tengo curiosidad si es posible determinar si una Asamblea ha hecho referencia a una clase en particular o no. Actualmente estoy usando Reflexión para cargar Asambleas y luego determinar qué conjuntos se están referenciados desde el interior del conjunto Estoy cargando:Determinando si se hace referencia a una clase C#

foreach (var vReferencedAssembly in vSomeAssembly.GetReferencedAssemblies()) 

Ahora que sé lo que se hace referencia a las Asambleas, quiero profundizar en los vReferencedAssembly y determinar si algo como esto ocurre:

File.Create(vSomeFile); 

En Inglés sencillo, no quiero cargar un ensamblado a partir de una lista suministrada a mí que puede contener lo que considera una amenaza. Así que es posible que desee bloquear cosas que puedan manipular archivos, etc.

+0

¿Es un requisito que esto sea dinámico? Si era estático, podría usar el desensamblador para ver los ensamblajes a los que se hace referencia y lo que podría llamar. – Josh

+0

Creo que preferiría que fuera dinámico si fuera posible. La mejor alternativa puede ser usar el Desensamblador. – Tada

Respuesta

2

Creo que lo que está buscando es cargar ensamblajes en el contexto de reflexión solamente. Esto le permite cargarlos en un área segura donde no se ejecutará código hasta después de haberlos inspeccionado.

Ver: http://msdn.microsoft.com/en-us/library/ms172331.aspx

Actualización: Usted puede utilizar la reflexión para mirar las cosas como, variables, propiedades, parámetros, tipos regresar, pero que todavía no le ayudará a detectar código malicioso que está completamente contenida dentro de un método . Tengo entendido que es mejor dejar la distinción entre el código seguro y el inseguro al administrador del sistema. Estas aplicaciones tienen una relación de confianza implícita con una ubicación segura en la PC. IE: el caché de ensamblaje global, el directorio de trabajo actual o alguna ruta fija determinada por su aplicación. La PC solo otorga a los administradores la capacidad de administrar los ensambles en esta ubicación.

Actualización 2: También puede considerar ejecutar este código potencialmente inseguro en su propio dominio de aplicación. Aquí puede establecer lo que está permitido y lo que no. Ver http://msdn.microsoft.com/en-us/library/bb763046.aspx.

Actualización 3: Si bien mantengo que cargar código no confiable en su propio dominio de aplicación con los permisos apropiados es el enfoque más limpio, es posible determinar qué método internamente hace referencia en tiempo de ejecución el question. La esencia de esto es usar la reflexión para obtener los bytes IL sin procesar del método (MethodBody.GetILAsByteArray) y analizarlo con su analizador IL seleccionado.

+0

No sé si esto es lo que estoy buscando. ¿Cómo inspeccionaría la Asamblea para determinar si se hace referencia o se llama a una clase específica? Por ejemplo: Sé que mscorlib (mscorlib.dll) contiene File.Create, pero eso no significa que el conjunto que acaba de cargar hace referencia a File.Create. ¿Cómo puedo determinar eso? Si es así .. – Tada

+0

Parece que la reflexión podría identificar las clases utilizadas en los parámetros de los métodos o las devoluciones, pero si se hace referencia dentro del cuerpo real de un método no podría encontrarlo ... – Tada

Cuestiones relacionadas