Hace algunas semanas leí un artículo del blog de Mike, llamado Cracking code 3: Cracking an obfuscated .NET assembly, donde como su nombre lo indica, muestra como crackear un assembly ofuscado.
En este caso, quise poner a prueba mi vasta experiencia (NADA) como crackeador de programas con un programa que bajé de internet y que tenía una limitante para el numero de lineas que podía trabajar.
Como la limitante era del tipo, if (lineas > N) –> no se puede procesar, en vez de cambiar el tamaño de N, invertí el if, para no tener nunca más el problema. Siempre tengo muchas más de N.
Lo primero que hice fue ejecutar mi gran amigo, .Net Reflector para ver el código del programa. Sorpresa mía, el código estaba ofuscado, pero con un papel, lápiz y buena memoria, la ofuscación es un problema menor.
Esto me muestra Reflector para un método que se llama z_b259, que por la firma, se entiende que es un evento. Los nombres del producto los he omitido por que no es lo importante de este post. Tambien no voy a mostrar los cambios que hice. He decidido mostrar en las pantallas el mismo bloque de códgo, visto desde reflector e IL (Intermediate Language), para lograr seguir la secuencia..
Una vez identificado el código donde está lo que quiero modificar, ejecuto el desensamblador de IL (ILDASM.EXE) y cargo el programa en cuestión. ILDASM se encuentra generalmente en \Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin. Se puede ejecutar sobre mi archivo crack.exe desde la consola de visual studio .net.
Si busco en ILDASM el código que veo en Reflector, me encuentro con lo siguiente. El lenguage IL es “parecido” al lenguaje de máquina. Observando detenidamente verán en los ovalos rojos las mismas ejecuciones marcadas en ovalos rojos en reflector.
Cuando ya encuentro el código que deseo modificar, vuelco el IL con ILDASM.EXE a un archivo de nombre crack.il. Esto volcado me genera una serie de archivos como los siguientes:
Que me falta ahora?. Ya tengo identificado el código y el if que debo invertir. En IL, un IF que compara menor o igual a n se representa por la instrucción ble.s (lower equal). Como necesito invertir el if, invierto la instrucción intuitivamente, cambiando la l por un g (lower, greater), dejando bge.s. Mi intuición es buena ya que luego de compilar el código IL a un archivo exe hago la prueba y funciona.
Si bien no pretendo dedicarme al crackeo de programas (creo que es mucho más valioso producir buenos programas), encuentro la experiencia muy interesante y a la vez, generadora de buenas interrogantes.
- ¿Que creemos que es seguro?
- ¿De que sirve no entregar el código fuente si se puede hacer ésto?
- ¿Los ofuscadores, son realmente útiles?
- ¿CAS no ayuda en esto?
Lo de CAS lo podemos dejar para otra oportunidad. Despues de ver el siguiente Post de Mike, Replacing a Strong Name y las preguntas y respuestas generadas, hoy ya no se que decir.
Estoy anonadado.
Patrick Mac Kay
Diciembre 2004