Hace algún tiempo os hablé de mi interés por la informática y más concretamente el cracking. Hoy he querido rescatar de mis archivos personales el primer tutorial (data del año 2000!) que escribí sobre este noble arte cibernético que tan lejos me queda ya y tan gratos y frikis recuerdos me supone. Ya todo este rollete forma parte de mi pasado por mi nula dedicación actual y, mal que me pese, el poco contacto que mantengo con los que en su día se perdieron como yo entre bytes desensamblados y debuggers se limita a la Euskal Party y alguna breve conversación via email.


Todavía recuerdo la primera vez que crackeé un programa. No recuerdo ya el nombre pero sí mantengo vivo aquel sentimiento de placer y superioridad que sentí ese mediodía. Fue como echar un polvo por vez primera.

He recopilado este tutorial y he decidido preservarlo en su estado original omitiendo algunos datos inservibles o poco convenientes para esta web. Sé que los posts sobre informática no interesan a mucha gente pero es algo que me apetece compartir con vosotros. Quizás incluso logre captar el interés de algún newbie! ;)

Objetivo: MadSMS 2.4b

DESCRIPCIÓN: App para enviar SMS de hasta 1000 caracteres a móviles nacionales.

PROTECCIÓN: Límite de 1 instancia por ejecutable.

DIFICULTAD: Newbie.

DOWNLOAD: http://madsms.n3.net/

TOOLS: Win32 dASM 8.93 con VB StringRef Patch), Editor Hexadecimal.


Presentación:

Este programa llegó a mí mediante un amigo (gracias ratolí) y ya desde principio me gusto bastante. Es un claro ejemplo de buen software, español (que no resulta común) y freeware.

Todo un logro, sí señor. Es interesante porque permite enviar mensajes a móviles (Short

Message Service) con la peculiaridad de permitir hasta 1000 caracteres por envío mediante la división del texto en nueve partes que llegan como mensajes partidos. Además, por si fuera poco te permite escoger entre varias pasarelas por las que enviar el SMS, sin necesidad de configurar servidores extraños u opciones un tanto abstractas como ocurre en algunos programas con la misma finalidad. Además no tiene límite de mensajes (como ocurre con el envío directo desde el site de Terra).

Bueno, oseasé, que la app tiene su gracias, vamos. Lo único que no me gustó es que el

programa no permite la ejecución de múltiples instancias de un mismo ejecutable y eso me jode porque a veces es útil tener más de una ventana abierta, así que... ¡manos a la obra!


1. 1.- Empecemos pues

Ejecutemos el programa. ¡Uy que chulíííí! XD ta bonito el interfaz. Por la pinta que tiene no delata a ningún lenguaje específico. Eso es bueno... dar personalidad a nuestras aplicaciones. Bueno... indago un poco en las opciones y la ayuda... nada remarcable... no aparece por ninguna parte nada relacionado con las instancias. Así pues me da por abrir otra vez el programa pero, NO! Error! Me aparece un cuadro de diálogo con un mensaje que rebuzna lo siguiente: "Ya hay una instancia de la aplicación ejecutandose".

En la barra de título aparece el nombre del programa y en la parte izquierda del aviso un triángulo típico de precaución. Se ve a la milla que esto lo ha hecho el coder porque el mensaje está hecho en aspañol y encima hay una falta de ortografía en la palabra ejecutándose... jejeje... vaya deducción más cutre. Bueno... supongo que eliminando ese cuadro tan odioso, el programa se podrá abrir más de una vez, no? Pues probemos a ver que paixa.

Bueno, esta vez tenemos la gran suerte de trabajar con un ejecutable de tamaño ciertamente pequeño (312 Kbs.), por lo que desensamblarlo será rápido. Como soy un poco vago, paso de analizar el EXE con ninguna herramienta destinada a ello y me voy directo al Win32sASM. Bueno... hago lo de siempre y en unos segundo ya tengo el código desensamblado en la pantalla. ¡Ostia! ¡Mira que imprevisto! En el encabezado del código veo que el programa utiliza funciones importadas de una DLL. Nada más y nada

menos que la asquerosa MSVBVM60.DLL, por lo que ya sabemos que el programa está hecho en Visual Basic en su versión 6. Pos vale, ya sabemos un poco más. A mí esto que ocurre ahora no me pasó porque ya lo tenía parcheado pero es importante advertir de lo siguiente: mi siguiente tarea consistía en mirar las String References para intentar localizar la rutina del código encargada de detector el número de instancias. El problema, es que la versión por defecto del Win32dASM, no incorpora la posibilidad de localizar estas referencias a cadenas de texto en aplicaciones Visual Basic, por lo que al pulsar el botón de las referencias de cadenas, aparecen 4 nombres raros que no nos sirven para nada o al menos eso creo (hay una que nos avisa que dice así: VB6! Os está pidiendo a gritos que lo crackeéis!).

Necesitareis un patch especial que añadir al programa desensamblador para poder proseguir en hazañas relacionadas con este leguaje de programación y sus cadenas, por lo que deberéis encontrar este parche y aplicarlo. El zip que yo tenía se llamaba "w32dasm893vbpatch.zip" y creo que lo descargue de la crackstore.


2.- A por el aviso ese

Bueno, una vez aplicado el parche, la cosa irá bien. Acudimos desde el programa al botón típico que tanto queremos de las String References y miramos a ver que vemos. Wow! Hay cosas interesantes, quizás las mire a fondo otro día pero ahora centrémonos en nuestra tarea: la penúltima referencia me resulta familiar: "Ya hay una instancia de la aplicaci" así que doble clik y a por ella! De este modo aparecemos aquí:

* Possible StringData Ref from Code Obj ->"Ya hay una instancia de la aplicaci"

:0042664B C7459CCCC94000 mov [ebp-64], 0040C9CC

:00426652 C7459408000000 mov [ebp-6C], 00000008

:00426659 FFD7 call edi

:0042665B 8D45A4 lea eax, dword ptr [ebp-5C]

:0042665E 8D4DB4 lea ecx, dword ptr [ebp-4C]

:00426661 50 push eax

:00426662 8D55C4 lea edx, dword ptr [ebp-3C]

:00426665 51 push ecx

:00426666 52 push edx

:00426667 8D45D4 lea eax, dword ptr [ebp-2C]

:0042666A 6A30 push 00000030

:0042666C 50 push eax

Bueno, bueno, bueno... esto empieza a aclararse. Ahora retrocedamos un poco en el código para ver que

encontramos. Y esto es lo que aparece: (mis comentarios aparecen en amarillo)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:

|:004265ED(C) ; salto hacia la rutina que comprueba las instancias.

:004265FA 668BBD60FFFFFF mov di, word ptr [ebp+FFFFFF60] ; otorga un primer valor al registro di.

:00426601 8D4DE4 lea ecx, dword ptr [ebp-1C]

* Reference To: MSVBVM60.__vbaFreeObj, Ord:0000h ; llamada a la función vbaFreeObj de la DLL.

:00426604 FF155C124000 Call dword ptr [0040125C] ; llamada a la rutina de verificación del número de instancias.

:0042660A 6685FF test di, di ; compara los valores de la variable tras las alteraciones en el CALL y establece los flags: si son iguales, el flag es = 1 y si no lo son, el flag = 0.

:0042660D 0F8481000000 je 00426694 ; Si son iguales (flag = 1), salta a la adress 00426694 y si no, sigue palante por aki...

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h ; sigue el código.

:00426613 8B3DFC114000 mov edi, dword ptr [004011FC]

:00426619 B904000280 mov ecx, 80020004

:0042661E 894DAC mov dword ptr [ebp-54], ecx

:00426621 B80A000000 mov eax, 0000000A

:00426626 894DBC mov dword ptr [ebp-44], ecx

:00426629 8D5584 lea edx, dword ptr [ebp-7C]

:0042662C 8D4DC4 lea ecx, dword ptr [ebp-3C]

:0042662F 8945A4 mov dword ptr [ebp-5C], eax

:00426632 8945B4 mov dword ptr [ebp-4C], eax

* Possible StringData Ref from Code Obj ->"MadSMS v.2.4b" ; String perteneciente a la barra de título del cuadro de dialogo de error que nos advertía que ya había una instancia ejecutándose.

:00426635 C7458CFCBA4000 mov [ebp-74], 0040BAFC

:0042663C C7458408000000 mov [ebp-7C], 00000008

:00426643 FFD7 call edi

:00426645 8D5594 lea edx, dword ptr [ebp-6C]

:00426648 8D4DD4 lea ecx, dword ptr [ebp-2C] ; blah, blah, blah y a continuación la string con el dichoso mensaje de error... que es de donde provenimos.


3.- Dándo el paso: ¿te has levantado con el pie izquierdo?

Bueno, está bien. A simple vista parece fácil, ¿no? Quizás algún cracker experto no lo haría pero a mí, como newbie que soy, para empezar lo que se me ocurre es ir a ese salto condicional JE (Jump if Equal, oseasé, Salta si es Igual) y cambiarlo por su inverso (y nunca mejor dicho) JNE (Jump if Not Equal, oseasé, Salta si no es Igual). De este modo, mi intención lo que pretende es editar esta comprobación de instancias para que, al verificar que hay una aplicación abierta, en vez de saltar al mensaje de error como pasaría en el programa inalterado, haga lo contrario, es decir, salte a la parte del código que se sucede en el programa original cuando se verifica que no hay ninguna instancia en ejecución y que abre una ventana nueva, teóricamente única. ;-) Ce biên, vamos a ello, hacemos nuestro típico y tópico backup del ejecutable a editar y lo abrimos desde el editor hexadecimal en cuestión. Personalmente uso el UltraEdit en su versión 7.10a pero como ya se suponen y están hartos de leer no es indispensable que sea este el programa para cambiar los bytes en cuestión (no sé por qué nos repetimos tanto J ). El OffSet de la dirección del salto JE que queremos editar en hexadecimal es 2660D, tal y como se observa en la barra de información que hay en el pie de la ventana en el Win32dASM:


Acudimos a nuestro editor hexadecimal favorito, abrimos el fichero, nos situamos en el offset correspondiente (supongo que ya sabrán hacer todo esto) y cambiamos esos bytes de este modo:

:0042660D 0F8481000000 je 00426694 ; este es el estado original.

:0042660D 0F8581000000 jne 00426694 ; así es como lo cambiamos.

Bueno, guardamos cambios y ejecutamos el EXE modificado para ver que pasa porque en muchos tutoriales los autores tienen una suerte que te cagas (¿les irá igual con las tías?) y siempre todo les sale conforme a sus planes. Ejecutamos la primera vez y todo va bien. Volvemos a ejecutar y... ¡PUM! El mensaje de error de antes otra vez, ¡MIERDA!

Bueno, bueno, bueno... que putada... por lo visto al autor le interesaba mantener esta propiedad. ¿por qué será? No creo que lo haga como medio preventivo para no comerse el ancho de banda ni nada parecido porque esto no da pa tanto... quizás lo haga para que los bromistas no se excedan y envíen cientos de SMS cada minuto. Quizás eso haga cambiar las pasarelas que el programa utiliza de forma que ya no funcionen mediante el patrón que el programa tiene, ¿no? Quizás lo haga porque tengo entendido que si hay exceso de SMS a un móvil, la centralita bloquea el SIM y eso es una gran putada, aunque tampoco estoy seguro de eso. Bueno, eso da igual, vayamos a lo que interesa y dejémonos de especulaciones y teoría tontas.

Si seguimos observando el fichero, nos damos cuenta de que ese salto misterioso que acabamos de revertir es un tanto desconcertante. Realiza una pequeña comprovación y salta, dependiendo de si existe o no una instancia de la aplicación abierta al mensaje de error o bien a la ventana del programa, eso está bien claro. Quizás no se arregle todo con un simple salto, ¿no? ¿Tanto empeño ha puesto el programador en esta chorrada? -Dijo OffSet con un tono acorde con su desconcierto-. Es en estos casos cuando uno desearía saber un poco más de ASM XDDD.

El salto resulta curioso como comentaba puesto que si en vez de revertirlo lo convertimos en un salto incondicional (o sea cambiar el 0F84 por un EB) la aplicación falla y por pantalla aparece esto:


Esto se está volviendo un poco raro y no entiendo muy bien por qué. En mi opinión, lo que creo que está pasando es que existen otras rutinas situadas tras este primer salto de verificación que intentan reforzar la tarea a la cual nos enfrentamos. Todo esto lo creo así puesto que si se avanza por el camino que ese salto que hemos revertido depara, nos encontramos un montón de CMP's y test relacionados con EAX y eso me hace sospechar. Además hay cosas en ese código que no acabo de entender bien y por eso no puedo sacar un porqué con seguridad plena.

Bueno, no nos preocupemos, la solución no está en editar ese camino que menciono, ya que su tarea sería larga, pesada y sin muchas garantías de éxito, por lo que digno a mirar el código situado cerca de este salto famoso y misterioso. Este, se muestra así:

:00426604 FF155C124000 Call dword ptr [0040125C] ; Llama a la rutina de verificación.

:0042660A 6685FF test di, di ; Comprueba el resultado alterando el flag.

:0042660D 0F8481000000 je 00426694 ; Salta a razón de lo que el flag indique.

Esta vez, atacaremos al programa desde sus raices. A continuación mi intención consistirá en anular el flag mediante un nopeo para que siempre salte. El programa, al realizar un salto condicional sin condición, tomará por defecto el valor de esa bander como si fuera igual y obrará por su código como si estuvieratodo bien, es decir, cada vez que intentemos lanzar el programa, este actuará como si no hubiera otro en memoria, ¿captan? Ahora sólo falta ver qé pasa con mi nueva idea. Quizás mis planes resulten en vano porque esas rutinas posteriores que creo que existen a lo peor delatan mi nueva técnica y la anulan. Probemos a ver de cambiar entonces en código: (recuerdo que deben volver a poner como estaba en un principio el salto famoso)

:00426604 FF155C124000 Call dword ptr [0040125C] ; Llama a la rutina de verificación.

:0042660A 909090 NopNopNop ; Nopeamos la orden y sus variable.

:0042660D 0F8481000000 je 00426694 ; Salta a razón de lo que el flag indique.

Ahora nuevamente probamos el programa parcheado: 1ª ejecución, 2ª ejecución y... ¡IT RULEZ, ¡YA FUNCIONA! Ahora poseemos un número ilimitado de ventanas a nuestra disposición. Ahora que sé que funciona, para acabar de perfilar mis sospechas, he nopeado tal y como lo hemos hecho ahora otra copia del EXE y además he revertido el salto tal y como lo habíamos hecho al principio. El resultado, tal y como esperaba que ocurriera, ha sido otra vez la aparición del mensaje de error, por lo que casi seguro que podíamosgarantizar la existencia de otras rutinas de control más... si es así, o el programador es un poco corto o es que ha tenido un descuido... nuevamente el beneficio (y esta vez sin desquicio) de la duda XDDD.


PALABRAS FINALES (O EPITAFIO ;-))

Bueno, espero que os sirva de algo. Que yo sepa, no hay ningún crack más de esta aplicación en toda la WWW pero bueno... ya sabéis todo eso de los derechos de autor que hastalos productos freeware conllevan. Bueno, espero que os haya gustado el tutorial y esas cosas y que os remitáis a mí para darme sugerencias, críticas (productivas), ayudas, perfecciones, estímulos para tutoriales futuros (si es que queréis más) o algo, vale?

Muchas gracias, Keep cracking scene alive!

Un ejercicio diferente aunque no por ello más complejo. En cuanto al programador, espero que si llegas a leer esto de un modo u otro, también te sirva de algo, vale? De hecho te dare algunas cosillas pa ke te acuerdes: si quieres proteger mejor el asunto, cúrratelo un poco más, tu verás cómo. En segundo lugar te pido que cambies el icono a la aplicación porque este te lo has robao de la nestcape y eso ta mu feo, cojonez. Finalmente, te remito una sugerencia que consiste en añadir una opción al programa para que los mensajes sean enviados en orden inverso al escrito si se desea, ya que a veces las pasarelas (sobretodo la de amena) van muy rápido y los mensajes llegan tan depreisa que para leerlos resulta incómodo tener que leerlos a lo LIFO (last in first out).

Pos eso... ah! y muchas gracias por tu colaboración tío, sin tí esto no hubiera sido posible,

asemás tu aplicación se ha ganado un espacio en mi HDD porque mola bastante.

"If you give a man a crack he'll be hungry again

tomorrow, but if you teach him how to crack, he'll

never be hungry again"

+ORC

Tutorial nº1: MadSMS 2.4B. 2K

Agregar a Del.icio.us Agregar a DiggIt! Agregar a Yahoo! Agregar a Google Agregar a Meneame Agregar a Furl Agregar a Reddit Agregar a Magnolia Agregar a Blinklist Agregar a Blogmarks Agregar a Promoting Blogs Agregar a Mister Wong Agregar a Barra punto com Agregar a autobombo
Bookmark and Share

4 comentarios

  1. Anónimo // 6 de noviembre de 2008, 12:31  

    eso esta muy chungo no?

  2. Anónimo // 7 de noviembre de 2008, 11:54  

    Dani he creado un grupo en facebook idolatrando a tu persona. Espero tu complacencia sea máxima y puedas visitarlo cuando tengas un momento. Sólo tienes que meterte en facebook y usar la barra de búsqueda. Hay que difundir tu suciedad por toda la red!

  3. Unknown // 7 de noviembre de 2008, 19:18  

    esto...

    y no hay un tutorial para el tutorial?

    vamos que pasopalabra

  4. Anónimo // 9 de noviembre de 2008, 21:49  

    ERES MY PUERCA FAVORITA

Publicar un comentario

Recuerda que aquí puedes escribir lo que quieras como quieras. Lógicamente el spam descarado o los mensajes que resulten inapropiados serán eliminados (por lo pronto esto último no lo he llegado a hacer nunca :P)

Mensajes privados directamente en: danielsucio@gmail.com