eMc2H 12 - Cracking orientado a XP
by XancheZ
Nota [Editor]: El autor de este texto ha preferido que su documento sea cambiado en la version txt de la revista, debido a que su archivo tenia bastantes imagenes y leyendolo en formato de texto probablemente no se hubiera entendido como debe ser.
Para consultar el texto " Cracking orientado a XP " en linea puedes hacerlo desde: www.emc2h.com/ezine.htm
Si quieres entrar directamente al url de este texto puedes hacerlo en: www.emc2h.com/ezine/html/12/12.html
Nota [XancheZ]: Este texto es el que iba a ir primero para la eZine, pero no me gusto mucho : P asi que decidi hacer otro y debido a los dibujos y al poco tiempo que tube no pude hacer una version txt de ese asi que paraque no pierdan su tiempo abriendo este archivo solo para encontrar la nota de arriba, decidi incluir esto : )
PD: La primera parte de los dos textos es igual...
Iniciandose en el Cracking
Introduccion
Hay varios programas que necesitan que te registres para poder usarlos en su totalidad, es decir tienes que pagar paraque te manden un codigo que al ponerlo en el programa este se vuelve completo, es decir el programa esta ahi solo hace falta un codigo de activacion... en la ingenieria inversa lo que se busca es saber como funciona la proteccion del programa, mmm... pensemos... "Si estas registrado, programa completo, sino programa imcompleto" ... pero que pasaria si lo invertimos "Si NO estas registrado, programa completo, sino programa incompleto"
Por supuesto hay muchisimas formas de obtener el programa registrado por eso algunos llaman al cracking un arte :)
Requisitos
- Necesitan conocer el lenguaje ensamblador, recomiendo leer: http://members.xoom.it/xanchez/textos/cpvirus-winter.zip http://cracking.unmanarc.com/introcrk/Caos%20Reptante-Assembler.rar El primero es un tutorial de viruz, que explica muy bien el lenguaje asm entre otras cosas ;)
- Saber ingles aunque sea algo basico tambien va a ser de mucha ayuda
Herramientas
- Debugger - El Ollydbg es un excelente debugger en el que no tienes que reiniciar la maquina, no te corta el internet, y funciona muy bien en Windows XP/2K que es hacia donde está orientado este tute.
- Desensamblador - Para esta parte voy a usar el W32Dasm. Aunque IDA es mucho mas completo pero tambien más difícil de usar.
- Editor Hexadecimal - Usen el que mejor se les acomode, puede ser: Ultra-Edit, Hex Editor, WinHex, Biew, Hiew, etc.
Todas estas las encuentran en www.hackerss.com (Seccion Cracking)
Conceptos
Extraidos de los manuales de Furious Logic[aRC]
- API: Application Program Interface (Interfase de Programas de Aplicacion) Parte del sistema operativo que proporciona funciones para uniformizar la forma como son ejecutadas las tareas más comunes que se realicen en él. Las APIs residen todo el tiempo en el sistema operativo, por lo que, al utilizarlas en nuestros programas, no es necesario agregar ninguna libreria.
- Kernel: Término yanquilandés para "núcleo". Base fundamental sobre la que se apoya todo sistema operativo. Algunos kernel son buenos, otros son malos, otros son una patética copia de la competencia. Teóricamente, es uno de los más bajos niveles sobre el cual se puede crackear. Es poco frecuente trabajar con el cracking a este nivel.
- ASCII: Siglas de American Standard Code for Information Interchange, "código estándar americano para el intercambio de información". Tabla de 128 caracteres comunes que permite que la información que se utiliza en las computadoras, sea fácilmente intercambiable entre sistemas distintos. Posteriormente se agregaron 128 caracteres adicionales, haciendo un total de 256, pero éstos últimos si son variables de acuerdo a diversos factores. Sus competidores son las tablas EBCDIC, UNICODE y ANSI, entre otros. ANSI, solo es una variante de las tablas ASCII que agrega forma a cada caracter ASCII en sus segundos 128 caracteres
- Bug: Anglicismo que se traduce como "insecto". "Error persistente en el software o el hardware" (Alan Freedman, "Bug", Diccionario de computación). En los primeros años de las computadoras, cuando no existían las computadoras personales sino solamente los mainframes o supercomputadoras, era necesario refrigerar los sobrecalentados sistemas con ranuras de ventilación además de enormes ventiladores. En cierta ocasión, un sistema empezó a fallar inexplicablemente. Se realizaron todos los diagnósticos de hardware y software. Todo parecía normal hasta que, en una minuciosa revisión ocular dentro de uno de los servidores se encontró un insecto (un bug). A partir de ese momento se acuñó el término bug, para referirse a un error de hardware o de software.
- Depurador: Traducción del término inglés debugger (quitar "bugs") Acompaña a los compiladores serios para que el programador pueda determinar los posibles errores en sus creaciones. Programa para hacer el seguimiento por instrucciones de un programa a crackear. Algunos depuradores son TRW2000, SoftIce y OllyDebug, entre otros.
- Desensamblar: Obtener el código fuente en lenguaje ensamblador de un programa específico. Existen muchos desensambladores con diferentes características. Los más conocidos son W32Dasm e IDA Pro.
- Ensamblar: Generar un ejecutable a partir de un código fuente en ensamblador. Los ensambladores más utilizados son Turbo Assembler (TASM) y MacroAssembler (MASM). Adicionalmente, recomendamos al lector poner especial atención en el proyecto HLA ( High Level Assembler, "Ensamblador de Alto Nivel"), creado por Randall Hyde para dictarse como primer curso de programación en Cal Poly y UC Riverside. Con una sintaxis similar a Pascal o C++ ha dado resultados positivos. Visite http://webster.cs.ucr.edu para obtener más información. También, destaca GoAsm de Jeremy Gordon en http://www.godevtool.com con ejemplos y completa documentación disponible. Este es sumamente interesante.
- Hexadecimal: Sistema numérico de base 16 que utiliza los dígitos 0 al 9 y las letras A, B, C, D, E, F para identificarse. A, B, C, D, E, F significan 10, 11, 12, 13, 14, 15 en nuestro sistema decimal. A partir de ahora es vital para usted, manejar el sistema hexadecimal.
- Lenguaje de alto/bajo nivel: El microprocesador sí que es imparcial. Nunca acepta los "creo que sí". Simplemente, ó es 1 ó es 0 (sistema binario), es So es NO, sin mayor complicación que esto. Excepto que nosotros no "hablamos" en binario. A ver traduzca esto: 11111001 y también esto: F9 No entendió verdad? (No, no significa pulsar F9). Por esta razón se llama lenguaje de bajo nivel, porque está más abajo, más cerca al entendimiento del microprocesador que al del ser humano. El primero es lenguaje binario o de máquina, el segundo es lenguaje ensamblador. Los seres humanos hablamos inglés (bueno, español, para el caso no importa). No pretenderá que su computadora entienda: "Computadora, haz un programa que descomprima ejecutables y córrelo en la holocubierta número 5". Ese sería un lenguaje de muy alto nivel y no existe aún. A ver traduzca esto: Write ("Hola mundo"); Esto si lo entendió verdad? Al menos lo puede deducir y por ello se llama lenguaje de alto nivel, porque está más arriba, más cerca a la comprensión del ser humano que a la del microprocesador. Ejemplos de ello son: Pascal, C++, Basic, FoxPro, Clipper (o si prefiere Delphi, C Builder, Visual Basic, Visual FoxPro, Visual Objects).
- Lenguaje de máquina: Lenguaje de muy bajo nivel en el que se comunican los microprocesadores de manera nativa. No es el lenguaje ensamblador (códigos mnemotécnicos), es lenguaje binario (cero/uno, activo/inactivo, sí/no, encendido/apagado, under/lamer).
- Lenguaje ensamblador: Traducción del inglés Assembler Language. Debido a la necesidad de un idioma común entre los microprocesadores y los seres humanos, sin llegar a ser lenguaje binario o de máquina, se inventaron los códigos mnemónicos que son codificados a hexadecimal y luego convertidos a binario para que el microprocesador nos comprenda. MNEMOTECNIA: "Procedimiento de asociación mental para facilitar el recuerdo de algo".
- Ingeniería Reversa: Proviene de Reverse Engineering. Desde las más antiguas épocas, la antigua tradición del underground nos ordenaba no escolarizar su aprendizaje. Hasta este día, no conocemos ninguna Escuela de Ingeniería Reversa y esperamos nunca llegar a conocer una. La razón de ello, resulta evidente: "No existe placer más gratificante , ni recompensa más apreciada, que descubrir los mecanismos ocultos del funcionamiento de un programa, uno mismo". No es igual ver la película "El Señor de los Anillos", que imaginarla mientras se leen los 3 tomos de la obra literaria, más los 2 tomos que conforman su preámbulo y postámbulo respectivamente. El verdadero mérito de la Ingeniería Reversa y de la tecnología underground está es realizar nuestros propios descubrimientos. Es el procedimiento que consiste en ejecutar un programa e ir retrocediendo en su funcionamiento para descubrir sus algoritmos de programación. Requiere de nuestra total atención, intuición, deducción y el más razonable sentido común. Ocasionalmente denominada Ingeniería Inversa.
- Nag: Pantalla molesta que se presenta al inicio de la carga de un programa o transcurrido algun tiempo para "recordarnos" que tenemos una version de evaluación.
- Keygen: Programa encargado de generar los números de serie válidos, equivalentes a un nombre de usuario y compañía específicos, para un software determinado.
- Patch: Tipo de crack que modifica o agrega uno o mas bytes al archivo objetivo
- Loader: El loader modifica o agrega uno o más bytes al archivo objetivo, con la diferencia de que este proceso se realiza al archivo cargado en memoria y no al archivo guardado en disco.
- Dumpear: Todo programa, al ser ejecutado, se carga en memoria como si fuese un duplicado. Volcar es el procedimiento mediante el cual se graba ese duplicado en un archivo físico.
- Lista muerta: En la jerga cracking, este término se utiliza para denominar al listado en ensamblador obtenido a partir de un desensamblador. Lista muerta porque es estatica, es decir, no se esta ejecutando Por el contrario, los depuradores trabajan con listas activas.
- Parchar: Traducción para el término inglés Patch. Modificar las instrucciones de un archivo cualquiera no necesariamente ejecutable. Generalmente esta modificación se realiza directamente en hexadecimal con un editor apropiado o a través de un programa creado para tal fin.
- Tracear o Trazar: Términos "spanglish" para Trace, "seguir". Ejecutar un programa instrucción por instrucción en cualquier lenguaje. La denominación apropiada para este sistema es Seguimiento.
- Compresor: Programa que reduce la cantidad de bytes que ocupa un archivo de cualquier tipo. WinACE, WinRAR, WinZIP son algunos ejemplos de programas compresores de archivos. Existen compresores especiales que solamente compactan archivos ejecutables que se autodescomprimen cada vez que son ejecutados. Generalmente se les conoce como compresores de ejecutables. UPX, PECompact, Yoda, Aspack, Neolite, Pklitew, etc.
- Empaquetar/Desempaquetar: Procedimiento que consiste en aplicar un algoritmo determinado a uno o más archivos para reducir el espacio de almacenamiento que ocupan. Los empaquetadores o compresores de ejecutables son los que nos deben interesar con mayor razón. El estudio detallado de las técnicas de compresión, enriquecerá nuestro bagaje técnico y nos llevará a un nivel más elevado del cracking.
- PE: Formato nuevo de archivos ejecutables que reemplazo a los antiguos NE, LE y otros. El conocimiento pleno de su estructura nos mostrara el siguiente escaño que debemos alcanzar en el cracking.
- Lamer: Si no sabe que es un lamer es porque usted es un lamer. Término peyorativo para señalar al individuo común que... ... descarga cientos de manuales, pero no lee ninguno. ... se jacta de poder "nukear" en el IRC autodenominándose "hacker" por ese simple hecho. ... sólo sigue los tutores de cracking de otros para luego decir que crackea sin ayuda. ... cree que Bill Gates es el inventor de Internet. ... cree que Linux "Red" Hat es solo para redes por que su nombre lo dice: "Red".
- Hoax: Fraude, burla, engaño, broma de mal gusto.
Saltos
Bueno un pequeño recordatorio :P
Hexadecimal Instrucción Descripción Flags
-------------------------------------------------------------------------------------------
EBxx | Varias JMP Jump Ninguno
Aritmetica sin signo
----------------------
74xx | 0F84yy JE, JZ Jump if Zero, Jump if Equal ZF = 1
75xx | 0F85yy JNE, JNZ Jump if Not Equal, Jump if Not Zero ZF = 0
77xx | 0F87yy JA, JNBE Jump if Above, Jump if
Not Below or Equal CF = 0 and ZF = 0
76xx | 0F86yy JNA, JBE Jump if Not Above, Jump if
Below or Equal CF = 1 or ZF = 1
73xx | 0F83yy JNC, JNB, JAE Jump if Not Carry, Jump if
Not Below, Jump if Above or Equal CF = 0
77xx | 0F87yy JNBE, JA Jump if Not Below or Equal,
Jump if Above CF = 0 and ZF = 0
Aritmetica en complemento a 2
-------------------------------
72xx | 0F82yy JNAE, JB, JC Jump if Not Above or Equal,
Jump if Below, Jump if Carry CF = 1
7Cxx | 0F8Cyy JL, JNGE Jump if Less, Jump if Not
Greater or Equal SF <> OF
7Dxx | 0F8Dyy JGE, JNL Jump if Greater or Equal,
Jump if Not Less SF = OF
7Exx | 0F8Eyy JLE, JNG Jump if Less or Equal,
Jump if Not Greater ZF = 1 or SF <> OF
7Fxx | 0F8Fyy JNLE, JG Jump if Not Less or Equal,
Jump if Greater ZF = 0 and SF = OF
Comprobacion directa de flags
-------------------------------
70xx | 0F80yy JO Jump if Overflow OF = 1
71xx | 0F81yy JNO Jump if Not Overflow OF = 0
78xx | 0F88yy JS Jump if Sign SF = 1
79xx | 0F89yy JNS Jump if Not Sign SF = 0
7Axx | 0F8Ayy JP, JPE Jump if Parity, Jump if Parity Even PF = 1
7Bxx | 0F8Byy JNP,JPO Jump if Not Parity, Jump if Parity Odd PF = 0
E3xx | No JCXZ Jump if CX is 0 CX = 0
E3xx | No JECXZ Jump if ECX is 0 ECX = 0
xx representa el desplazamiento relativo en 8 bits (byte)
yy representa el desplazamiento relativo en 16 bits (word) o 32 bits (double word)
Por Fin!!!
...[Bueno Hasta aca, las versiones txt y html son iguales, a partir de aqui, recomiendo leer las dos : D en la html ya no uso el juego de pool sino un crackme, y bueno... va...]...
Ahora si, ya estamos listos para nuestro primer crack : ) Es un juego de pool que viene junto con el texto o lo pueden descargar de: http://members.xoom.it/xanchez/juegos/pool.zip
En verdad creo que pude haber elegido a una victima mejorcita, pero bueno... este juego lo encontre en la casa de un amigo y decidi usarlo para no gastar tiempo buscando otro :P
Haber lo extraemos y vemos que vienen los archivos: pool.exe, order.txt y pool.hlp, ejecutamos el pool.exe y sale una asquerosa NAG le damos OK mm... jugamos un rato, mm... ya me aburri voy a cambiar el tipo de juego, en Game, a ver ..., ah! ya se, Eight Ball, uta! me dice que me tengo que registrar..., a ver vamos a Help -> Enter Registracion Code. vamos a probar suerte con "11119999" mm.. sale un mensaje diciendo: "The Registration Code you entered is not correct, please try again."
Ahora vamos a abrir el W32Dasm, nos aseguramos de que en "Disassembler"--> "Disassembler Option" esten marcadas todas las opciones y despues abrimos el pool.exe, vemos que en los botones de arriba, en la parte de la derecha al costado izquierdo del boton de la impresora hay uno que dice Strn Ref y si dejamos el mouse un rato nos sale "String Data References" que son las Referencias de Cadenas, le damos click y buscamos el mensaje que salio cuando me quise registrar, como vemos esta en orden alfabetico asi que lo encontramos casi al final como "The Registration Code you entered" le damos doble click, ahi ya nos sale el mensaje completo, le volvemos a dar doble click para ver cuantas referencias hay sobre el, pero solo esta esa vemos esto:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A55(U)
|
:00411A5C 33C9 xor ecx, ecx
:00411A5E 85C0 test eax, eax
:00411A60 0F95C1 setne cl
:00411A63 84C9 test cl, cl
:00411A65 7410 je 00411A77
:00411A67 6A00 push 00000000
:00411A69 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"The Registration Code you entered "
->"is not correct, please try again."
|
:00411A6B 6840324400 push 00443240
:00411A70 E833D70100 call 0042F1A8
:00411A75 EB35 jmp 00411AAC
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A65(C)
|
:00411A77 E8000F0200 call 0043297C
:00411A7C 8B54240C mov edx, dword ptr [esp+0C]
:00411A80 8B4004 mov eax, dword ptr [eax+04]
:00411A83 52 push edx
* Possible StringData Ref from Data Obj ->"Code"
|
:00411A84 6870234400 push 00442370
* Possible StringData Ref from Data Obj ->"Registration"
|
:00411A89 6860234400 push 00442360
:00411A8E 8BC8 mov ecx, eax
:00411A90 E8FAD40100 call 0042EF8F
:00411A95 6A00 push 00000000
:00411A97 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Success!"
|
:00411A99 6834324400 push 00443234
:00411A9E E805D70100 call 0042F1A8
:00411AA3 6A01 push 00000001
:00411AA5 8BCF mov ecx, edi
:00411AA7 E845340100 call 00424EF1
mm... aca vemos algo interesante:
:00411A5C 33C9 xor ecx, ecx
:00411A5E 85C0 test eax, eax
:00411A60 0F95C1 setne cl
:00411A63 84C9 test cl, cl
:00411A65 7410 je 00411A77
:00411A67 6A00 push 00000000
:00411A69 6A00 push 00000000
vemos que ese salto de ejecutarse se saltearia el mensaje de "The Registration Code you entered is not correct, please try again."
y se iria a otras referencias que son:
"Code"
"Registration"
"Success!"
lo que nos da un buen augurio : )
Vemos que antes del je hay una comprobacion que a no ser que introduscamos el serial correcto, va a salir falsa y despues nos muestrara el mensaje de the code is not correct, asi que hay que pensar... si la comprobacion es falsa no salta, si es verdadera salta... en otras palabras lo que esta molestando es ese "jump if equal", mm.. que pasaria si lo cambiamos por un "jump if not equal" pues veamos... entramos al Hiew, abrimos el archivo, y salen unos codigos que no se entienden.. apretamos F4 elegimos la opcion Decode, ya ahora en el W32Dasm damos doble click sobre el salto que queremos cambiar
Observacion: Aca pueden elegir que direccion anotar, la direccion virtual o la direccion absoluta, me explico, en la parte de abajo, al pie de la ventana, vemos la parte de @Offset00010E65h, esa es la direccion absoluta, el numero despues del offset y sin escribir la "h" que lo que indica esque el numero esta en hexadecimal.
La direccion virtual seria 00411A65 y para anotarla en el Hiew le tenemos que poner un "." (punto) adelante. En las dos direcciones se pueden obviar los ceros de la izquierda.
Bueno, una vez elegida la direccion que ustedes prefieran, en el Hiew se aprieta F5 y escribimos ".411A65" o "10E65" como sea llegamos al mismo lugar, a:
.00411A65: 7410 je .000411A77
como vimos en la tabla de saltos, el je en hexadecimal es un 74 Apretamos F3 para editar y cambiamos el 74 por un 75 (jne = jump if not equal) mm.. pero que pasaria si introducimo el serial correcto, entonces nos saldria un mensaje de error, mejor cambiarlo por un EB (jmp = Jump) es decir que salte siempre sin importar que se le ponga. listo ya hicieron su primer crack : D
ahora vamos a ver otra forma en la que tambien se pudo haber conseguido crackearlo.
Igual entramos a las "String Data References" le damos doble click al mensaje de "The Registration Code you entered", veamos:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A55(U)
|
:00411A5C 33C9 xor ecx, ecx
:00411A5E 85C0 test eax, eax
:00411A60 0F95C1 setne cl
:00411A63 84C9 test cl, cl
:00411A65 7410 je 00411A77
:00411A67 6A00 push 00000000
:00411A69 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"The Registration Code you entered "
->"is not correct, please try again."
|
:00411A6B 6840324400 push 00443240
:00411A70 E833D70100 call 0042F1A8
:00411A75 EB35 jmp 00411AAC
Vemos la parte de:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A55(U)
Significa que en 00411A55 hay un salto que lleva hasta este codigo que genera el mensaje de serial no valido despues de la comprobacion, seguimos el salto apretando el boton de "Goto Code Location" o Shift+F12, ponemos la direccion "411A55" y vemos que el salto es un jmp o sea que siempre sucede:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A3B(C)
|
:00411A53 33C0 xor eax, eax
:00411A55 EB05 jmp 00411A5C
mm... interesante con el "xor eax, eax" el eax se queda en 0
y recordando el codigo anterior:
:00411A5C 33C9 xor ecx, ecx --> Pone ecx a 0
:00411A5E 85C0 test eax, eax --> Verifica si eax=0
:00411A60 0F95C1 setne cl --> Si no es asi, pone cl=1
:00411A63 84C9 test cl, cl --> Verifica si cl=0
:00411A65 7410 je 00411A77 --> Si es asi, salta al codigo que genera
el mensaje que nos dice "Success!"
:00411A67 6A00 push 00000000
:00411A69 6A00 push 00000000
Como vimos encontramos a la gallina de los huevos de oro :D
Ahora veamos que en "00411A3B" es donde esta el salto que nos llevara a ese codigo, asi que como ya deben estar pensando nos vamos hasta alla:
:00411A2F 8A10 mov dl, byte ptr [eax]
:00411A31 8A1E mov bl, byte ptr [esi]
:00411A33 8ACA mov cl, dl
:00411A35 3AD3 cmp dl, bl
:00411A37 751E jne 00411A57
:00411A39 84C9 test cl, cl
:00411A3B 7416 je 00411A53
:00411A3D 8A5001 mov dl, byte ptr [eax+01]
:00411A40 8A5E01 mov bl, byte ptr [esi+01]
:00411A43 8ACA mov cl, dl
:00411A45 3AD3 cmp dl, bl
:00411A47 750E jne 00411A57
:00411A49 83C002 add eax, 00000002
:00411A4C 83C602 add esi, 00000002
:00411A4F 84C9 test cl, cl
:00411A51 75DC jne 00411A2F
Entonces si cambiamos ese "je 00411A57" por un "jmp 00411A57", sin importar que serial pongan saldra "Success!" ya con lo explicado arriba lo pueden hacer solos :P
vamos a ver el codigo un poco mas arriba:
* Possible StringData Ref from Data Obj ->"122-167"
|
:00411A12 6878234400 push 00442378
:00411A17 8D4C2410 lea ecx, dword ptr [esp+10]
:00411A1B E8C46E0100 call 004288E4
:00411A20 8B74240C mov esi, dword ptr [esp+0C]
:00411A24 8B475C mov eax, dword ptr [edi+5C]
:00411A27 C744241800000000 mov [esp+18], 00000000
Que??? En verdad tal vez algunos hayan visto el "122-167" en las String References, lo hallan puesto y entonces pusieron el serial valido porque ese es : P la primera vez que intente crackear este juego, vi eso y pues lo probe y si era : D Aunque tambien en algunos programas ponen el serial ahi para burlarse de nosotros : P y no es el verdadero, pero en este caso si lo es, pero bueno...
Bueno ya que estamos hablando de eso, tambien se habran dado cuenta que una vez que el programa es registrado, ya no permite intentar otra forma de crackearlo aunque hayas tenido una copia de este, eso es porque puede haber generado algun archivo en algun sitio para verificar si ya fue registrado o pudo haber agregado algun valor en el registro para eso hay dos programas muy utiles que son "regmon" y "filemon" que indican toda la actividad que esta sucediendo en el registro y en los archivos. Los dos pueden bajarse de www.hackerss.com en la seccion cracking. Viendo en el Regmon nos damos cuenta de que en: HKCU\Software\Challenge Pool\pool\Registration\Code es donde se guarda el codigo que no importa cual hallamos puesto al registrarnos siempre sale el mismo: 122-167 asi que para probar otras formas de crackear el programa tienen que borrar ese valor.
Ya ahora si, para finalizar con el texto vamos a ver de una forma un poco "resumida" como funciona la rutina comprobadora del serial:
* Possible StringData Ref from Data Obj ->"122-167"
|
:00411A12 6878234400 push 00442378 ->Se empuja la direccion
de "122-167" a la pila
:00411A17 8D4C2410 lea ecx, dword ptr [esp+10] ->Carga en ecx la direccion de la pila+10h
:00411A1B E8C46E0100 call 004288E4
:00411A20 8B74240C mov esi, dword ptr [esp+0C] ->Mueve a esi lo que la pila+Ch este apuntando(el serial valido)
:00411A24 8B475C mov eax, dword ptr [edi+5C] ->Mueve a eax edi+5Ch (el serial que introducimos)
:00411A27 C744241800000000 mov [esp+18], 00000000 ->Vueve 0 la direccion de la pila+18h
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A51(C)
|
:00411A2F 8A10 mov dl, byte ptr [eax] ->Mueve el primer byte del serial que
introducimos a dl
:00411A31 8A1E mov bl, byte ptr [esi] ->Mueve a bl el primer byte (digito)
del serial valido
:00411A33 8ACA mov cl, dl ->Mueve el primer digito de nuestro
serial a cl
:00411A35 3AD3 cmp dl, bl ->Comprueba si los primeros digitos
de los seriales son iguales
:00411A37 751E jne 00411A57 ->Si no lo son salta a 411A57
:00411A39 84C9 test cl, cl ->Comprueba si cl=0
:00411A3B 7416 je 00411A53 ->Si lo es, salta a 411A53
:00411A3D 8A5001 mov dl, byte ptr [eax+01]->Mueve a dl el segundo digito de
nuestro serial
:00411A40 8A5E01 mov bl, byte ptr [esi+01]->Mueve a bl el segundo digito del
serial valido
:00411A43 8ACA mov cl, dl ->Mueve el digito de nuestro serial a cl
:00411A45 3AD3 cmp dl, bl ->Compara si dl y bl son iguales
:00411A47 750E jne 00411A57 ->Salta a 411A57 si no lo son
:00411A49 83C002 add eax, 00000002 ->Avanza 2 digitos en nuestro serial
:00411A4C 83C602 add esi, 00000002 ->Avanza 2 digitos en el serial valido
:00411A4F 84C9 test cl, cl ->Comprueba si cl = 0
:00411A51 75DC jne 00411A2F ->Si no lo es salta a 411A2F
Como vemos si introducimos el serial correcto esto se sigue repitiendo hasta que se acaben los digitos y cl, bl y dl quedaran = 0, entonces no se ejecutara el salto y se seguria con:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A3B(C)
|
(Si el serial era valido llegamos aca)
:00411A53 33C0 xor eax, eax ->Vuelve eax=0
:00411A55 EB05 jmp 00411A5C ->Salta a 411A5C
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00411A37(C), :00411A47(C)
|
(Si el serial que introducimos era incorrecto llegamos aca)
:00411A57 1BC0 sbb eax, eax ->resta eax, con eax dejando eax=0
:00411A59 83D8FF sbb eax, FFFFFFFF ->Se resta: "eax - -1", lo que deja a eax=1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411A55(U)
|
:00411A5C 33C9 xor ecx, ecx ->ecx=0
:00411A5E 85C0 test eax, eax ->Verifica si eax=0
:00411A60 0F95C1 setne cl ->Si eax no es 0 pone cl=1, sino pone cl=0
:00411A63 84C9 test cl, cl ->Verifica si cl=0
:00411A65 7410 je 00411A77 ->Si es asi, salta a 411A77
:00411A67 6A00 push 00000000
:00411A69 6A00 push 00000000
Si el serial es valido, cuando llega a 411A5C eax=0, si es incorrecto entonces eax=1. Al ser eax=0, cl no cambia y sigue siendo 0 con lo que se salta a 411A77 y ahi se genera el mensaje de "Succes!". eax=1 hace que cl deje de ser cero con lo que se sigue de frente y se genera el mensaje de "The code you entered is not correct"
Otras formas de crackear el programa podrian ser poner un salto desde 411A2F hasta 411A77.
Cambiar 411A5C por un "xor eax, eax" en fin... solo es cosa de usar la imaginacion :D
Palabras finales
Bueno, espero que les haya gustado este tutorial, siempre hay otras maneras de crackear el programa, si quieren posteen otras formas en el foro.
Si algo no les quedo claro pueden escribirme en el foro:
http://www.hackersmx.com/phpBB2/index.php
o a mi e-mail (xanchez@eml.cc, xanchez@ emc2h.com) , cualquier correccion, pregunta o sugerencia es bienvenida : D para crackz busquen en www.astalavista.com no contestare esos pedidos, pero si piden ayuda para crackear algun programa que no entiendan, tratare de ayudarlos, siempre que me alcanzen el tiempo y los conocimientos : )
También lean la version html de la eZine para ver el cracking desde el Ollydbg y otras cosillas mas y También quisiera agradecer a la lista CracksLatinos por todas las teorías y el trabajo que hacen, sin duda ahí están los mejores crackers de habla hispana, imperdonable no suscribirse (crackslatinos@gruposyahoo.com.ar)
Los que llegaron hasta aquí, gracias por leerme y si todo sale bien será hasta el próximo numero =)