Como crackear assemblies..... con nada de experiencia

Published Tue, Dec 21 2004 21:54

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

by pmackay
Filed under:

Comments

# pmackay said on Wednesday, December 22, 2004 1:39 AM

Patrick

Me alegra que pierdas tu virginidad en el campo del crackeo, pero lo que más me llama la atención es que existan herramientas con esos niveles de protección un Simple y Asqueroso IF, te imaginas si ese mismo código se genera en tiempo de ejecución, como se puede hacer con .Net, no darías con el por lo menos de esa forma y te costaría un poco y tendrías que usar herramientas un poco más potentes, aunque nadie dice que sea imposible, pero por lo menos no tan simple.
Ahora bien esto no es un problema nuevo, los desarrolladores de java ya pasaron por esa etapa solo que nosotros ahora nos estamos adentrando en las interioridades de la nueva plataforma y comenzamos en realidad a estresarla. Te recomiendo para tú tranquilidad pon en el que todo lo sabe “Google” Java+Descompilación y te llevarás una sorpresa.
Si analizamos que para muchos la técnica de ofuscamiento consiste en: cambiar en el momento de compilación el nombre de clases, métodos, variables, etc, por cadenas generadas de forma automática, permitiendo que al hacer una descompilación las cosas sean más difíciles y la estructura del programa no sea tan evidente, queda suficientemente claro con tu ejemplo que no porque algo diga que ofusca el código en realidad se toma su trabajo en serio
De todas formas patrick te muestro otro ejemplo de cómo hacerlo sin recompilar. Para esto solo necesitas una editor hexadecimal (hex)(Como hace mucho que no hago esto fue lo que más me costó hacer, encontrar uno que me gustar, caprichos de cubano). Como no pones el código IL real donde está la comparación yo lo agrego

ldc.i4.s 100
ble.s L_0027 esto claramente puede cambiar en tú código


Entonces si tenemos en cuenta que ldc.i4.s es en hex 1F y 100 en hex es 64 y además ble.s es 31 entonces puedo abrir con cualquier editor hex y buscar 1F6431 cuando lo encuentre puedo chequear un par de instrucciones anteriores y posteriores para estar seguro de que estoy en la zona correcta y luego hago el siguiente cambio 1F64 que no es más que cargar en memoria 100 ahora lo cambio por 1F00 cargar en memoria cero y además cambio 31 por 30 que es bgt.s.
Resultado mostrado por reflector una vez hecho el cambio.

ldc.i4.s 0
bgt.s L_0027

y entonces tu programa funcionará para cualquier archivo con más de cero líneas. Creo que es suficiente esa cantidad de líneas.

Por lo que podemos decir que para el nuevo código aplican algunos trucos antiguos, cosa que no me asusta en lo particular, soy de los convencidos de que si alguien se empeña en hacer daño lo más probable que lo logre si:
1. Sí el código no está bien escrito
2. Herramientas no profesionales de desarrollo
3. Capacidad de procesamiento Infinito
4 Paciencia infinita
5 Tiempo infinito

Saludos

Luison.Net

# TrackBack said on Wednesday, December 22, 2004 4:49 PM

What have I done? Patrick gets cracking

# pmackay said on Tuesday, December 28, 2004 10:59 PM

De esa forma es mas rapida, pero requiere tener los conocimientos de hexadecimal y editores hexadecimales, además de mucha mas paciencia. En este caso, lo que quería mostrar era que con 0 conocimiento y las herramientas básicas, se puede crackear un programa.

Concuerdo totalmente que la validación utilizada es bastante idiota y eso es responsabilidad de los desarrolladores, o al menos de alguien por que si la base de tu empresa con las ventas y la diferencia entre vender y no vender esta en 1 SOLO IF, entonces ahi hay problemas.

Saludos.

# pmackay said on Wednesday, August 10, 2005 12:21 PM

Saludos Patrick, exceleten Articulo, el asunto que es el Termino "Crackear" se usa para fines ilicitos o incorrecto, existe una herramienta que se llama SALAMANDER.NET, el cual a pesar de el codigo estar Ofuscado lo llega mostrar tanto en Codigo IL, como en Codigo Nativo.

en tanto pondre en practica expuesto en tu articulo para ver de Usar Otro Prodcuto aparte del Ofuscator.


Saludos

Ricardo Hinostroza

# pmackay said on Friday, August 19, 2005 1:26 PM

Nada que decir... al igual que tu,
soy un amigo cercano del .Net Reflector


Slds.
Javier

Leave a Comment

(required) 
(required) 
(optional)
(required)