2011-09-15 26 views
7

Quiero ofuscar mis archivos de ensamblado (* .dll, * .exe) por Dotfuscator. mi pregunta es si hago esto, ¿puedo seguir usando clases y tipos que están en esos ensambles por sus nombres originales (me refiero a nombres antes de la ofuscación) y usando los métodos System.Reflection para trabajar con ellos?Ofuscación Asamblea y Reflexión

Si necesita más detalles, por favor dígame

Respuesta

8

Ofuscación son Reflejos pueden causarle algún problema. Incluso si toma la opción de sugerencia de uso para no ofuscar el método público, parte del código reflejado puede llamar al método privado. El problema es que la ofuscación cambiará el nombre de algún código que pueda necesitar para permanecer igual.

Si sabe o puede localizar la región que es susceptible de ser utilizado con la reflexión puede utilizar

[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")] 

Esto indicará al Ofuscador mantener el nombre.

Ejecución de la ofuscación con la reflexión requieren más pruebas de que es segura pero aún es posible ...

1

Puede utilizar System.Reflection en una asamblea ofuscado, pero dado que algunos de los puntos de la ofuscación es renombrar todo en el conjunto en cosas al azar y sin sentido, se no puede hacer una reflexión sobre los mismos nombres e identificadores que lo haría en un ensamblaje no ofuscado. Si desea hacer una reflexión sobre un ensamblaje ofuscado, debería hacerlo de una manera que no dependa de qué tipos y miembros tengan nombre.

+1

miembros Normalmente públicas no están ofuscadas (o al menos hay una opción para no ofuscar a los miembros públicos) – xanatos

+0

@asbjornu - ¿Hay algún método para reflexionar y evitar el uso del nombre de los miembros? – amirhosseinab

+0

Una solución (o no) sería crear una clase estática, que tenga un diccionario System.Type y luego, cuando necesite usar la reflexión, obtenga el tipo de este diccionario. Así que no importa qué nombre el método/clase se convirtió después del obsfucador, usted todavía tiene una referencia para eso. Por supuesto, si tiene tipos incontables en su ensamble, terminará con un gigante, sin ninguna clase estática de patrón de diseño, que podría causar problemas de rendimiento en su aplicación y también excepciones no controladas. –

0

Usted puede crear su propio mapa privado para obtener nuevos nombres de los antiguos. Mapper debe escribir la tabla de una especie de disco/db con el siguiente estructura: Módulo (ejecutable), Índice, OriginalType, ObfuscatedType

Crear aplicación de consola "Mapper" que opera en dos modos basado en un argumento: La aplicación recibirán como argumento de ruta ejecutable

  1. Asamblea carga
  2. getTypes de loadedAssembly
  3. PreObfuscation elimina todas las entradas y escribe de nuevo los índices y valores OriginalType. Actualizaciones de PostObfuscation ObfuscatedType por índice. Los eventos posteriores a la construcción deben ser las siguientes:
    1. Mapper.exe "target.exe" "Pre"
    2. [Ofuscación]
    3. Mapper.exe "target.exe" "Post"

Ahora necesita una función para obtenerObfuscatedName de OriginalName y listo.

Tenga en cuenta que esta solución no funcionará con la poda como el número de tipos va a cambiar y los índices ya no coincidirán entre

OriginalAssembly.GetTypes() 

y

ObfuscatedAssembly.GetTypes()