Neotrace 2.12 - Descomprimiendo NeoLite y quitando una NAG molesta ("Errar es humano")

Este texto a pesar de que varias personas lo habían revisado contenía un error garrafal en su anterior vida, siempre he avisado de que no soy más que un novato y esto tenía que pasar tarde o temprano, sin entrar en justificaciones simplemente pedir mil disculpas a quien haya podido hacerse una idea equivocada, aquí tenéis el texto corregido, espero que ahora si esté como debía...

Saludos koleguitas! en el texto anterior atacábamos un programa comprimido con Shrink y utilizábamos para ello el DeShrink de [j0b], como es evidente esta utilidad sólo nos sirve para ese compresor así que voy a intentar explicaros un método para trabajar con cualquier comprimido/encriptado.

A todos se nos presenta en algún momento este "problema" y la mayoría de las preguntas que me han llegado al respecto empezaban así: "Intento desensamblar un programa con WDASM pero no me aparece ninguna SDR", hay pequeñas variaciones "WDASM se cuelga", "WDASM me dice que el PE no es válido", etc. No os cerréis usando siempre WDASM, está claro que es muy sencillo de usar y que determinado tipo de protecciones nos duran menos de 30 segundos pero WDASM no es el "arma" definitiva, queda muy lejos de serlo además...Quede como ejemplo este programa que descomprimiremos sólo para aprender, para desprotegerlo no tendremos más remedio que usar SoftICe, a ello...

¿? Herramientas a utilizar :

NeoTrace 2.12 de NeoWorx.
SoftICe 4.0 de Numega Tech.
Interrupter 1.0 de Lazarus.
ProcDump 1.6 Final de G-Rom, Lorian y Stone.
WDASM 8.93 de URSoftware
R!SC Proccess Patcher 1.4 por R!SC
GetType 2.52 por PHaX

 

¿? Qué es eso de ejecutables comprimidos y encriptados...

Imaginaros que tenéis que guardar un archivo de texto pero que no os cabe en un diskette porque es muy grande, os dais cuenta de que hay cadenas que se repiten muchas veces, por ejemplo "Los caballeros de la mesa redonda fueron muy afortunados, nunca se golpearon los genitales contra una esquina de la mesa" pues hacemos un programilla (compresor) que nos sustituya en el archivo de texto esa cadena tan larga por otra más corta, por ejemplo "caballeros", al aplicarle el compresor tendremos nuestro archivo de texto con un tamaño más reducido pero necesitaremos otro programa (descompresor) que se ocupe de devolver la frase a su estado original, el proceso de encriptación es idéntico, necesitamos un encriptador que sustituirá determinadas cadenas por su equivalente encriptado y un desencriptador que lo devuleva a su estado original, en este caso el fin no será reducir el tamaño...

Los programadores se encuentran con el problema de que sus programas son demasiado grandes, la red es un buen trampolín para encontrar víctimas que paguen por ellos pero todos escapamos de programas grandes ya que las conexiones son demasiado lentas, por culpa de programar con lenguajes visuales o simplemente por incapacidad de escribir algo más eficiente se ven obligados a recurrir a programas que les reduzcan el tamaño de sus "hijitos", pero ellos no van a decirte: "Oye mi programa está comprimido, ve a http://www.descompresor.com y descárgate el descompresor", lo meten en el código del programa de manera que el programa en ejecución utiliza el algoritmo de descompresión, lo aplica al programa comprimido y lo deja listo para ejecutarse en la memoria, ahí es donde entramos nosotros y volcamos desde la memoria el programa descomprimido a un archivo para estudiarlo en su estado original...

A la hora de descomprimir un programa tenemos dos opciones, hacerlo nosotros solitos, como ahora veremos, o usar descompresores que otra gente haya preparado, puedes encontrar varios descompresores en la red...

¿? Cómo saber si el programa está comprimido...

Para no tener que atender a cosas como WDASM no lo consigue abrir, tarda más de lo normal en cargar, etc. tenemos una gran utilidad llamada GetType con la que veremos algunas características del ejecutable, en algunos casos hasta nos dirá con qué ha sido comprimido/encriptado...Es muy simple, sólo tienes que hacerlo correr y elegir el ejecutable Neotrace.exe, dejad las configuraciones que vienen por defecto...os aparecerá algo así:

El GetType no ha sido capaz de decirnos con qué está comprimido el ejecutable pero si nos da info muy interesante, la segunda flechita nos dice que el programa tiene una diferencia considerable entre el overlay y el tamaño del programa lo que nos hace pensar que está comprimido, si le echamos un vistazo a los "headers" PE (de imprescindible lectura el texto de numIT_OR) vemos un delator << .neolit >>. El programa está comprimido con el compresor Neolite. Conviene que le echéis un vistazo a los distintos compresores que hay, casi siempre os encontraréis una sección en el encabezado PE que lo delate...

Bueno ya sabemos que el programa está comprimido, y además con Neolite así que tenemos dos opciones, usar el Script de Neolite para el ProcDump o descomprimirlo nosotros, vamos a hacerlo nosotros a ver qué sale...

¿? Preparando la descompresión...

Para descomprimir el programa sin usar un descompresor tenemos un par de opciones, una con trabajo y la otra para vagos, las dos son efectivas pero como es evidente usaremos la de los vagos...

Utilizaremos un pequeño programita llamado Interrupter, lo que hace este programa es colocar una llamada a la Interrupción 03 en el punto de entrada ("Entrypoint") del programa a descomprimir/desencriptar, de modo que sustituye los dos primeros bytes que hay en la dirección del punto de entrada por el código hexadecimal de esa llamada ( CC ). Con esto sólo tenemos que colocar un punto de ruptura en esa interrupción ( bpint 03 ) y apareceremos al principio del programa, además el Interrupter nos dice cómo devolver el programa a su estado original para que pueda ejecutarse...

Sólo tenemos que abrir el Neotrace.exe (antes de nada haced un backup!!!) y pulsar en EDIT, os aparecerá algo así:

Nos lo hace todo! sólo tenemos que meternos en SoftICe, poner << bpint 03 >> y cargar el programa, en un segundito nos aparecerá de nuevo el SoftICe, ponemos << e eip E9 >>, vemos que recuperamos el salto original que nos lleva al comienzo del programa << :004E92BA jmp 004E9365 >>, pulsamos F10 y el salto nos deja en algo tal que así:

mov eax, [esp+04]
and eax, [004E92CB]
Call 004E96E5 ;Llamamos a la rutina de descompresión, que haga su trabajo.
inc byte ptr [004E9364]
jmp eax ;Saltamos al programa descomprimido.

Ahora sólo tenemos que hacer dos cosas, primero nos colocamos sobre el salto al programa descomprimido y apuntamos el contenido de EAX, en mi caso 0041C905, después editamos en ensamblador ( a ) y cambiamos ese salto por algo así como << jmp eip >> para que el programa quede ciclando en memoria y volcarlo...

¿? Volcando el ejecutable descomprimido...

Ahora tenemos el programa descomprimido en memoria, tenemos que volcarlo a un archivo para poder jugar con él, así que abrimos esa genialidad llamada ProcDump, veréis algo así:

Pulsamos sobre la tarea que veis en la flecha, sobre el Neotrace.exe, dadle al botón derecho y os aparecerá un menú, pulsad << DUMP FULL >>, os aparecerá un diálogo para que elijáis donde guardar el proceso volcado y lo guardáis, os aparecerá ese mensajito tan agradable...ya tenemos el ejecutable descomprimido, pero daros cuenta de que el programa no funcionará, para que funcione tenemos que cambiar el punto de entrada, ahora mismo el punto de entrada sigue siendo el del programa comprimido, tenemos que cambiarlo para que se pueda ejecutar el programa descomprimido, para esto tenemos la dirección apuntada antes, la dirección donde empezaba a ejecutarse el programa descomprimido << 0041C905 >>, vamos a ProcDump de nuevo damos en << PE Editor >> y cambiamos lo que hay por algo tal que así:

Entrypoint = Dirección obtenida de SoftICe - Image Base, ya podemos ejecutar el programa, vaya acabo de ver su tamaño, el descomprimido es de 940kb y el comprimido de 360kb, si que estaba comprimido parece ser...

...Vamos a abrir el programa descomprimido con WDASM...

¿? WDASM no es DIOS, o si? o no? o no? o no?

Cargamos WDASM abrimos el programa descomprimido y voalá!

No problemo, vamos a ver si el programilla tiene protección contra desensamblador, la verdad es que de este tema no he leído nada "definitivo" todo el mundo lo hace y sin saber por qué, para no ser menos yo tampoco sé muy bien el por qué, no sé si verdaderamente es una protección contra desensambladores o es simplemente una inocente consecuencia de las propiedades de los encabezados PE...vamos a ver...

Abrimos otra vez el ProcDump y pulsamos en << PE Editor >>, nos sale otra ventanita, pulsamos en << Sections >>, nos aparece la última de las ventanitas, veréis que la primera sección ( .text ) en características tiene un valor de C0000080, tenéis que cambiarlo por E0000020 como en la imagen, normalmente nos basta con cambiar las características de la primera sección pero en este caso si cambiamos la primera ( .text ) y vamos a WDASM veremos que seguimos sin poder desensamblar el programa, nos da un ERROR y a la puta rue, pues bueno cambiaremos también la tercera ( .data ) con valor C0000040 por el valor E0000020, oooops! que no sabéis como cambiar el valor? simplemente pulsad en el nombre de la sección a cambiar con el botón derecho del roedor y pulsad en << Edit Section >> . Si os ha quedado el rollete como a mi id aceptando todas las ventanas y volved a WDASM, ya podéis ver el desensamblado completito del NeoTrace 2.12...

El problema ahora es que poco podemos conseguir con WDASM así que vamos a SoftICe y en menos de 5 minutos tenemos el programa arreglado, insisto en que el programa al ejecutarse en su estado original se descomprime en memoria y luego se ejecuta, es decir no necesitamos para nada descomprimir el programa si vamos a utilizar SoftICe...

¿? Lo bueno si bueno dos veces bueno...SoftICe

Ejecutamos en Neotrace.exe y vamos a ver qué es lo que nos molesta...aparece una ventanita para meter datos geográficos...cancelamos y nos aparece una NAG con tres botones, le damos a << TRY >> y se continúa la ejecución, después ya no hay nada molesto....

Cómo atacamos? bueno hemos visto que la única molestia que nos causa el malandro es tener que estar aguantando esa ventanita y pulsando ese botoncillo, así que lo que se me ocurre es darle un repaso con SoftICe y ver cómo se comporta cuando pulsamos el botón de << TRY >> y cuando pulsamos en botón de << QUIT >> e intentar obligar al programa a que se comporte como si hubiésemos pulsado el << TRY >> pero sin sacarnos la NAG...vamos a ello...

La dichosa ventanita hemos visto claramente que no es la típica "MessageBox" así que tiraremos por el segundo camino, usaremos la función "DialogBoxParamA", con el SoftICe cargado ejecutamos el NeoTrace.exe, cuando nos salga la ventana en la que podemos mater nuestra localización entramos en SoftICe ( CTRL+D ) y ponemos un punto de ruptura en esa función ( bpx dialogboxparama ) pulsamos F5 para salir de SoftICe y le damos a << CANCEL >>, apareceremos de nuevo en SoftICe, parece que la función ha sido llamada bien bien...le pegamos a F11 para retornar de la función y aparecemos por arte de birlibirloque en la NAG, pulsamos el botón << TRY >> y aparecemos de nuevo en SoftICe, en algo como esto:

Aparecemos en la dirección 00414AED, una comparación de EAX con 2, miramos en la ventana de registros y EAX contiene el valor 1, a continuación desempilamos un valor y como EAX /= 2 se ejecuta el salto y vamos a 00414AF6, pulsamos F5 para que el programa continúe su ejecución y aparecemos en NeoTrace...

Hagamos otra pruebita, repetimos el proceso pero esta vez pulsando << QUIT >>, aparecemos en el mismo punto, miramos EAX y contiene un 2 luego el salto no se da y seguimos por el XOR, le damos a F5 para que siga la ejecución y salimos del NeoTrace...

Parece ser que hemos encontrado el punto donde el programa elige el camino a seguir, ya tenemos lo que queríamos, tenemos localizada la función que nos saca la ventanita y sabemos las decisiones que ésta toma según el botón pulsado, ahora pensemos en la solución, cómo evitamos la NAG? pues lo primero que se nos tiene que ocurrir es ir a 00414AD8 que es la dirección donde se le pasa el primer parámetro a la función y forzar un salto al punto donde el programa continúa su ejecución si se ha pulsado el << TRY >> 00414AF6. Esta solución será válida para muchos otros programas pero en este caso no, no veis que el programa desempila un valor y lo deja en ESI ( POP ESI) ? cambios en la pila jum jum eso no es bueno, seguro que nos llevará a un error, y además, si llegamos a 00414AF6 es porque EAX=1, si forzamos ese salto EAX será = 1? y si hay alguna comparación más tarde? mal rollete...

Mi solución es reproducir la situación que se da al pulsar el botón de << TRY >>, lo haremos con un par de cambios, pondremos primero EAX a 1 y después añadiremos un salto que evite la llamada a "dialogboxparama", es decir que evite que tengamos que ver la NAG y pulsar el botón...vamos a probar primero los cambios en memoria por lo que pueda pasar... ejecutamos NeoTrace, en la ventana de localización pasamos a SoftICe y ponemos un punto de ruptura en hmemcpy ( bpx hmemcpy ), F5 para volver a NeoTrace y le damos a << CANCEL >> y aparecemos en SoftICe, vamos dándole a F12 hasta que estemos en el código del NeoTrace y una vez en él borramos nuestro breakpoint ( bc 0 ) y ponemos uno nuevo en el primer parámetro que le pasamos a la función ( bpx 414AD8 ), le damos a F5 para que siga rutando el programa y de nuevo aparecemos en SoftICe, justo donde queríamos, vamos a cambiar las instrucciones en ensamblador así que ponemos "a" y le damos a enter, ponemos mov eax,1 para tener en EAX un 1 y después jmp 414AED para pasar de la NAG, las condiciones del salto se cumplen, la NAG la hemos pasado y desempilamos en ESI, justo lo que pasa cuando pulsamos el << TRY >>, bueno una vez introducidas las nuevas instrucciones le damos a ESCAPE para dejar de editar y pulsamos F5...VAYA! la NAG no apareció! somos muy malos! ;P

¿? Compartiendo nuestro éxito con los koleguitas...

Ya sabemos qué cambiar, pero para hacer el cambio permanente como el programa está comprimido escribiremos un loader que se ocupe de cargar el programa, buscar los bytes originales en memoria y cambiarlos por los bytes que nos conviene que se ejecuten, tenemos:

Instrucciones originales ASM / Hexa Instrucciones Finales ASM / Hexa
push 00000000 | 6A00 mov eax, 1 | B801000000
push 004161D0 | 68D0614100 jmp 414AED | EB0E

 

Vaya justo justo ocupamos dos instrucciones reales con nuestras modificaciones, de dónde he sacado los hexadecimales? de SoftICe, al editar en ASM vemos los cambios, a la izquierda de la instrucción en ASM está su valor en hexadecimal... poquita cosa... ya sabemos qué y por qué cambiarlo, vamos a usar R!SC Proccess Patcher para hacer el loader, necesitamos un script tal que así:

; Loader NeoTrace 2.12, eliminado NAGS molestas by karlitoxZ [PNK|TNT]
; 7 de Enero del 2000
T=1000:
F=neotrace.exe:
O=neoloader.exe:
P=414AD8/6A,00,68,D0,61,41,00/B8,01,00,00,00,EB,0E:

Creo que no hace falta explicar otra vez cómo funciona este programilla, en el texto anterior ( exp10 ) lo tenéis bien clarito, y ya está, ahora cada vez que queramos usar NeoTrace y pasar de la NAG sólo tendremos que cargar el loader en el mismo directorio que el NeoTrace... así de simple...

Como tenemos el ejecutable descomprimido y funcional vamos a parchearlo y así al menos en nuestro HD tendremos NeoTrace sin NAG y sin tener que usar loader, sólo tenemos que ir a nuestro editor hexadecimal y cambiar lo que antes he dicho...ya sabéis...

¿? Last words...

Ya está arregladito, otra vez mil disculpas, lo siento de veras, tengo la versión "karlitoxZ mete la pata" por si alguien la quiere, de los fallos se aprende no?...

No ha sido difícil no? hemos aprendido un par de cosas más, algo es algo... Como siempre dejar claro que karlitoxZ no es más que un novato en esto, mucho camino todavía por recorrer... aquí estoy para serviros en lo que me sea posible...

Saludos, agradecimientos, un piso en la luna y mil millones de dólares selenitas a ^CaR19^ ( no comment...un 10... ), chochis ( y su palm! ), josepZ ( ese parcheador! ), esiel2 ( tamos muy locos tío!! ), D_A ( música? eso no es música! ;P ), xASX ( TNT heartbreaker ), karpoff, skuater, profesor_X y el resto de la gente de TNT que no tengo el placer de conocer...AH! y como no el gran Mr.Black!, sin duda lo mejorcito que hay por la escena hispana, no cambies que así estás cañón! ;P

Nos vemos en exp12 si es que algún día llega...

Expediente 11 Final (14/01/00) por karlitoxZ, parte activa de:

proyekto nakarko 2000!
[TNT!Crack!Team]

Visita la página que estoy rutando con ^CaR19^, llena de recursos para empezar a crackear y unas cuantas cosas más, completamente en castellano!!!

Tutorial Descargado de Karpoff Spanis Tutor

www.000webhost.com