Share via


Observación y comprensión de la salida ofuscada

Paso 1: Usar un desensamblador

El SDK de .NET Framework incluye una utilidad de desensamblador denominada ildasm que permite descompilar ensamblados .NET en instrucciones de lenguaje de ensamblado IL. Para iniciar ildasm, asegúrese de que el SDK de .NET Framework está instalado y en la ruta de acceso. Escriba ildasm en la línea de comandos.

Nota: si no funciona y ha instalado Visual Studio, es probable que ildasm no esté en la ruta de acceso. Para abrir un símbolo del sistema de Visual Studio, en el menú de inicio, seleccione Visual Studio [versión] | Visual Studio Tools | Símbolo del sistema de Visual Studio [versión]. Escriba ildasm.

  • Seleccione el menú Archivo | Abrir y vaya a:
C:\Archivos de programa\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug 
  • y seleccione GettingStarted.exe. Haga clic en Abrir. Aparece una vista del ensamblado desensamblado.

  • Para comparar la aplicación HelloWorld actual sin ofuscar con la versión ofuscada, inicie otra copia de ildasm. Esta vez vaya a
C:\Archivos de programa\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated 
  • y seleccione GettingStarted.exe. Haga clic en Abrir.

Coloque ambas ventanas ildasm en paralelo. Compare y contraste ambas figuras.

Observe que el desensamblado sin ofuscar contiene nombres de métodos que son bastante incomprensibles. Por ejemplo, es seguro suponer que se llama al método ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) cuando se hace clic en el botón de conversión. Examine la versión sin ofuscar. ¿Qué método se llama cuando se hace clic en el botón de conversión? Es difícil saberlo. Observe también el método SaySomething que falta. Se quitó porque no se usaba en ninguna parte del código.

Haga doble clic en los métodos SayHello:string() del ensamblado original y a:string() del ensamblado original. De hecho, los dos métodos son los mismos; no obstante, al examinar el código IL desensamblado con más detalle, observará que las cadenas se han cifrado en la versión ofuscada para que el código resulte más difícil de leer. Por ejemplo, busque la siguiente línea en la versión sin ofuscar:

IL_0000:  ldstr      "Hello, my name is "

Ahora consulte la versión ofuscada e intente encontrar la cadena anterior. Si tiene dificultad para encontrarla, se debe a que está cifrada y es similar a la siguiente:

IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50   
                          28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60   
                          12 62 43 64 )

Puede suponer lo confuso que puede resultar para quien intente aplicar ingeniería inversa al código, especialmente con aplicaciones más complejas.

Paso 2: Descompilar

Si cree que el código fuente sólo estará accesible a un pequeño círculo de técnicos que realmente conocen el lenguaje de ensamblado IL, piénselo de nuevo. Puede llevar esta situación más lejos y volver a crear realmente el código fuente de nuestra aplicación con un descompilador como Reflector o Anakrino. Estas utilidades pueden descompilar un ensamblado .NET directamente en un lenguaje de alto nivel como C#, VB .NET o C++.

En esta sección usamos dos descompiladores que están disponibles de forma gratuita:

  1. Reflector para .NET, http://www.aisto.com/roeder/dotnet/
  2. Anakrino (versión de la interfaz gráfica de usuario) / Exemplar (versión de la línea de comandos), http://www.saurik.com/net/exemplar/

Al ejecutar Anakrino/Exemplar en el archivo GettingStarted.exe ofuscado con Dotfuscator, se producirá el siguiente error:

Exemplar.exe has encountered a problem and needs to close.  We are sorry for the inconvenience.

Al ejecutar .NET Reflector en el archivo GettingStarted.exe ofuscado con Dotfuscator e intentar examinar un método como a(), se producirá la siguiente excepción:

This item appears to be obfuscated and can not be translated.

System.NotSupportedException: Cannot resolve local variable 'Label_0047'.
   at Reflector.CodeModel.Memory.GotoStatement.Resolve()
   at _12.VisitBlockStatement(IBlockStatement statement)
   at _111.VisitStatement(IStatement value)
   at _119.VisitMethodDeclaration(IMethodDeclaration value)
   at _125.VisitMethodDeclaration(IMethodDeclaration value)
   at _126.VisitMethodDeclaration(IMethodDeclaration value)
   at _123.VisitMethodDeclaration(IMethodDeclaration value)
   at _146._1(Boolean )

Por lo tanto, Dotfuscator Professional ha podido evitar que los dos descompiladores principales apliquen ingeniería inversa al código ofuscado con Dotfuscator.

© 2002-2007 PreEmptive Solutions. Reservados todos los derechos.