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
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
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.
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
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
* 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
:00426604 FF155C124000 Call dword ptr [0040125C] ; llamada a la rutina de verificación
: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),
* 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
Bueno, está bien. A simple vista parece fácil, ¿no? Quizás algún cracker experto no lo haría pero a mí,
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
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
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
El salto resulta curioso
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 ;
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
: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 ;
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
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
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
eso esta muy chungo no?
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!
esto...
y no hay un tutorial para el tutorial?
vamos que pasopalabra
ERES MY PUERCA FAVORITA