Karpoff Spanish Tutor

Programa:

TRANSMAC V4.1


 

PROTECCION: Serial de un trial de 60 días empakado con "Shrinker 3.algo".
Objetivo: Conseguir un ejecutable funcional debidamente registrado.
Descripcion: Utilidad para acceder a sistemas de archivos MAC.
Dificultad: Avanzadillo.
DOWNLOAD: http://www.asy.com/sharetm.htm
Herramientas: Softice 3.24, R!SC Process Patcher, Procdump32, File InsPEctor XL, PuPE, ExeScope 6.0, un editor Hexadecimal.
CRACKER: Arkanian   FECHA: 22/09/2001

 

 INTRODUCCION

Un complejo programa con una protección un tanto compleja. Lo de "Shrinker 3.algo" lo pongo porque File InsPEctor XL identifica el compilador como Shrinker 3.4 con una probabilidad del 66.3% (heurística). O sea que tenemos un 33.7% de "algo" más...

De hecho la cadena Shrinker 3.4 aparece por todos los lados, se cargan módulos con ese nombre, se crean archivos temporales, un Shrinker34.ldr dando vueltas por la memoria, etc...

Un desempakado "automático" con Procdump se cuelga y haciendolo manualmente no obtenemos un resultado satisfactorio, es más, no funciona.

¿Por que?, ...porque nos falta "algo" :-)

He dividido este tutorial en dos partes. Una primera parte donde veremos como pillar el Serial y como cargarlo con el R!SC Process Patcher y una segunda parte donde desempakaremos totalmente el programa e introduciremos "a mano" el Serial.

Dos maneras diferentes de llegar al mismo objetivo.

Vamos alla...

 

 AL ATAKE

PARTE I

CAZANDO EL SERIAL

Durante la instalación se nos pide un Nombre de Usuario y un Número de Serie, una rápida investigación con el Sice y descubrimos que esto no nos lleva a ningún sitio, bueno si, a la creación de un archivo llamado Transmac.ppp que es donde se almacenan las opciones de configuración del usuario, tamaño del buffer, Unidades disponibles, etc, ...pero de comprobaciones nada. El par User-Password simplemente se guarda ahí. Hay que señalar que este archivo aparece cuando se cierra el programa. (BPX WRITEFILE)

Iniciamos el programa y una horripilante ventana nos muestra un contrato de Licencia donde se nos recuerdan los 60 días de prueba, las limitaciones, el copyright y varias cosas más. Aquí ya tenemos un botón de Register, empezamos...

De entrada un BPX HMEMCPY a ver que pasa... rellenamos las casillas con nuestro nombre y un número cualquiera (1234567890) y cuando rompa el Sice comprobamos que en el REPZ MOVSD se está leyendo el Nombre, le damos al F5, comprobamos que lo siguiente sea el Serial de prueba, quitamos el bp y le damos al F12 las veces oportunas para salir al código real. Este es el código:

:0040C49B FFD7 call edi -> LLamada a GetDlgItemTextA.
:0040C49D E84EFEFFFF call 0040C2F0
-> Salimos aquí.
:0040C4A2 68B4A54200 push 0042A5B4
-> Dirección donde está el Nombre.
:0040C4A7 E804010000 call 0040C5B0
-> Larga encriptación del Nombre.
:0040C4AC 68A0A54200 push 0042A5A0
-> Dirección de nuestro Serial de prueba.
:0040C4B1 E82A010000 call 0040C5E0
-> Manipulación y transformación del Serial de prueba.
:0040C4B6 83C408 add esp, 00000008

Parece que no hemos acertado, el Serial tiene un número concreto de caracteres:

:0040C618 33C0 xor eax, eax
:0040C61A C644140400 mov [esp+edx+04], 00
:0040C61F F2 repnz
:0040C620 AE scasb
:0040C621 F7D1 not ecx
:0040C623 49 dec ecx
:0040C624 5F pop edi
:0040C625 83F90C cmp ecx, 0000000C
-> Esto son 12 en decimal.
:0040C628 7512 jne 0040C63C
-> Nos saca fuera.

Le ponemos un bp a 40C625, salimos, ponemos el número de caracteres adecuado (123 ... AB) y volvemos a entrar. A continuación viene una largísima manipulación del Serial, (el que quiera que se lo trace). Lo único que sacamos en claro de todo esto es que el Serial de 12 caracteres (31 32 33 ... 41 42) acaba encriptado en otro de 7 (19 C6 B9 5F BE 1C C6) en la dirección 42A1D4, vamos a poner un BPM 42A1D4 RW para ver cuando se produce la comparación:

:0040D860 A0D7A14200 mov al, byte ptr [0042A1D7] -> El 4º caracter del Serial encriptado [5F].
:0040D865 83EC68 sub esp, 00000068
-> Corregimos la pila.
:0040D868 84C0 test al, al
-> Comprobación.
:0040D86A 56 push esi
:0040D86B 57 push edi
:0040D86C 7415 je 0040D883
-> ¿No es 00?
:0040D86E E84DF0FFFF call 0040C8C0
-> Comprobación del 8º caracter del Serial real [38].
:0040D873 33C9 xor ecx, ecx
-> Despejamos ECX.
:0040D875 8A0DD7A14200 mov cl, byte ptr [0042A1D7]
-> El 4ª de nuevo.
:0040D87B 3BC8 cmp ecx, eax
-> Comprobación.
:0040D87D 0F8C3D010000 jl 0040D9C0 -
> Si el 8º real es mayor que el 4ª encriptado nos saca fuera.
:0040D883 A0D4A14200 mov al, byte ptr [0042A1D4] -> El primer caracter encriptado, aterrizamos aquí.
:0040D888 8A0D785C4200 mov cl, byte ptr [00425C78]
-> ¿Que hay aquí?, ¿A5?.
:0040D88E 3AC1 cmp al, cl
-> La comparación.
:0040D890 740C je 0040D89E
-> Saltaríamos si fueran iguales.
:0040D892 3A05C5A14200 cmp al, byte ptr [0042A1C5]
-> Resultado transformación del Nombre [D2].
:0040D898 0F8522010000 jne 0040D9C0
-> Directamente fuera.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D890(C)
|
:0040D89E 8A15D6A14200 mov dl, byte ptr [0042A1D6]
-> Tercer caracter.
:0040D8A4 A0795C4200 mov al, byte ptr [00425C79]
-> [46] = F
:0040D8A9 3AD0 cmp dl, al
:0040D8AB 0F850F010000 jne 0040D9C0
:0040D8B1 A0DAA14200 mov al, byte ptr [0042A1DA]
-> Septimo y último caracter.
:0040D8B6 8A0D7A5C4200 mov cl, byte ptr [00425C7A]
-> [52] = R
:0040D8BC 3AC1 cmp al, cl
:0040D8BE 0F85FC000000 jne 0040D9C0
:0040D8C4 8A0DD9A14200 mov cl, byte ptr [0042A1D9]
-> El sexto caracter.
:0040D8CA 83E1F0 and ecx, FFFFFFF0
-> ¡Toma ya!
:0040D8CD 80F990 cmp cl, 90
-> No hay otra alternativa.
:0040D8D0 0F85EA000000 jne 0040D9C0

Parece que tenemos clara la cosa, según el fragmento código anterior las comparaciones son sobre el 4º, 1º, 3º, 7º y 6º caracter encriptado. El cuarto valor encriptado tiene que ser 00 si no en el CALL 0040C8C0 se comprueba el 8º caracter del Serial sin encriptar y luego se preparan las llamadas a GetLocalTime para la comprobación de los 60 días. Hemos tenido suerte ya que, si bien el cuarto caracter no es 00 la encriptación nos ha dejado 5F y este es mayor que 38, con lo que el salto en 40D87D no se ha producido. En el caso contrario el JL 0040D9C0 nos hubiera mandado fuera directamente con lo que el BPM en 42A1D4 no habría sido efectivo.

Si el primer valor no es igual a A5 se compara con un valor que ha obtenido de la manipulación de los caracteres que componen el Nombre (D2 para ARKANIAN). Dado que los valores con los cuales se comparan están en 425C78 y siguientes, el Serial bueno encriptado tiene que ser A5 XX 46 00 XX ?? 52. O en el caso de que partamos del Nombre, D2 XX 46 00 XX ?? 52.

El sexto caracter se manipula directamente y tiene que dar 90. ¿Y que mejor que un 90 para hacer un AND [90], FFFFFFF0 y nos dé como resultado 90?. El resto de caracteres los ponemos a 00, el Serial nos quedaría de la siguiente forma, {D2-A5} 00 46 00 00 90 52. Cambiamos a mano los valores de 42A1D4 y probamos... todo parece correcto.

Parece que no hay una ventana de "Gracias por registrarse" ni nada parecido, aceptamos el contrato de Licencia y vamos al About a ver que dice, sorprendentemente saltamos al Sice de nuevo, parece que se va a comprobar de nuevo el Serial en 42A1D4. No hemos quitado el BPM ¿recuerdas?.

Las comprobaciones se suceden tres veces con el mismo código de arriba en 40DADD, 40DBBA y 40D883 de nuevo, como hemos parcheado en memoria no vamos a tener ningún problema.

¿Por qué hace el programa esto?, pues para mostrarnos la ventana adecuada, si el Serial no es correcto nos muestra otra vez el contrato de Licencia con un encabezado de Unregistered y si es correcto, como en este caso, nos muestra otra Licencia, con un bonito Registered, donde nos confirman que estamos registrados y que estamos autorizados a disponer libremente del programa sin limitaciones. ¿Sin limitaciones?, ¡Gracias!, lo aprovecharemos para la segunda parte.

Bien, solo nos queda localizar donde se hacen las comprobaciones al iniciar el programa. Dejamos el BPM en su sitio, cerramos y volvemos a entrar. El Sice salta cuando "Shrinker 3.algo" va desempakando el programa en esa dirección, un F5 para aterrizar en 00410FB7 y vemos como el Serial que está en el archivo Transmac.ppp no aparece por ningún lado, el valor de 42A1D4 permanece a 00.

La comprobación del Serial no se produce en este código, si dejamos el bp puesto volvemos a pasar otra vez por la secuencia 40D883, 40DADD, 40DBBA y otra vez por 40D883, donde ya aparece nuestro Serial de prueba.

El código es el mismo de arriba:

:00410FB7 A0D4A14200 mov al, byte ptr [0042A1D4]
:00410FBC 8A0D785C4200 mov cl, byte ptr [00425C78]
:00410FC2 3AC1 cmp al, cl
:00410FC4 7408 je 00410FCE
-> Modificamos este a JMP en el script.
:00410FC6 3A05C5A14200 cmp al, byte ptr [0042A1C5]
..................................................... etc.

Si metemos manualmente el Serial encriptado en 42A1D4 cuando estamos aquí, el programa se abre perfectamente y la ventana de Licencia no aparece. Bien, esto nos facilita las cosas para hacer el Loader.

Podemos hacerlo de dos maneras. Como nos hemos registrado al instalar el programa tenemos en el archivo Transmac.ppp nuestro Nombre y un Número de Serie incorrecto, como conocemos el valor asignado a nuestro nombre [D2] , el Serial que vamos a utilizar es D2 00 46 00 00 90 52.

Como no sabemos el tiempo que va a costar descomprimir el programa en memoria, ni cuando se ponen a 00 los valores de esa dirección, lo que vamos a hacer es parchear el primer salto de la comprobación en 410FC4 y luego colar el Serial en su sitio, también podemos personalizar un poco la ventana del About. Así queda el script:

;OK, veamos si funciona.
;TransCrack, 22/09/2001 (c) Arkanian.

F=Transmac.EXE:
O=TransCrack.EXE:

P=410FC4/74,08/EB,08:
; Parcheamos la primera comprobación.
P=42A1D4/00,00,00,00,00,00,00/
{D2-A5},00,46,00,00,90,52: ; Colamos el Serial bueno encriptado.
P=426B1D/41,6C,6C,20,52,69,67,68,74,73,20,52,65,73,65,72,76,65,64/43,72,61,63,6B,65,64,20,62,79,20,41,52,4B,41,4E,49,41,4E:
;Personalizamos la cosa :-)
$ ; Fin.

Otra forma de hacerlo es eliminando el archivo Transmac.ppp, de esta manera no habrá un Usuario previo, es decir el valor de 42A1C5 será 00 lo que le indica al programa que no existe un Nombre de Usuario. Para este caso empleamos el valor A5 como primer caracter del Serial, teneis las dos alternativas resaltadas en azul, elegid la que más os guste, las dos funcionan perfectamente y sin ventanas de Licencia molestas al inicio.

Vamos a la segunda parte.


PARTE II

DESEMPAKANDO Y RECONSTRUYENDO

Como ya he comentado en la introduccion File InsPEctor XL nos identifica el compilador como Shrinker 3.4 con una probabilidad del 66.3%, veamos las secciones del archivo, esto es una imagen tomada de la pestaña Secciones del XL:

Lo primero que vamos a hacer es cambiar las Características de la sección .shrink0 con el Procdump a E0000020 para poder trabajar con SoftIce, como dato curioso observamos que automáticamente .shrink0 pasa a .shrink a secas, vemos que el Phisical Address y el Phisical Size de dicha sección están a 0 y también vemos el extraño valor de la sección .load donde está el Punto de Entrada al programa.

Tenemos los siguientes datos del archivo Transmac.exe en nuestro disco duro:

-. Punto de Entrada (RVA): 0004454F.
-. Tamaño de la imagen: 00049000.
-. Image Base: 00400000.

¿Que ocurre cuando está el programa se está ejecutando?, pues que tenemos esta imagen tomada del Procdump:

¡Hay que joderse!, te juro que es el mismo programa y no solo eso, sino que la opción Process Infos nos da los siguientes datos para el proceso Transmac.exe

-. Punto de Entrada: 0001A627.
-. Tamaño de la imagen: 0003D000.
-. Image Base: 00400000.

Pasemos a SoftIce a ver que encontramos. Hacemos un TASK para ver los procesos, identificamos a TRANSMAC y acto seguido un MAP32 TRANSMAC. La salida de SoftIce nos muestra más o menos lo mismo que el XL y si empleamos el PuPE obtenemos un resultado identico al de Procdump. ¿Que está pasando?, ¿Cual es la buena?.

Vayamos al Loader, si nos trazamos la carga del programa siguiendo los pasos del desempakado manual de Shrinker 3.4 efectivamente acabamos en un CALL [EBP+24] cuyo valor es 41A627. Teóricamente con cambiar 41A627 a JMP EIP y luego volcar con Procdump tendríamos el programa. Pues no es así, obtenemos un archivo de 184 Kb. que no sirve para nada.

Si intentamos un volcado con Icedump mediante /DUMP 400000 49000 C:\DUMP.EXE el archivo resultante es basura. El tamaño del archivo aumenta hasta 292 Kb., el Punto de Entrada es 41A627 y está bien, pero el código no vale para nada, la instrucción en 41A627 es un MOVSD seguido de dos POP'S y un RET, identico resultado obtenemos con un volcado de XL.

PuPE es el único que se muestra eficaz en este aspecto (Alinear - Volcar). Nos deja una archivo de 242 Kb que finaliza en el offset 0003C5A0, el código parece estar correcto y XL nos informa que esta compilado con Visual C++ 6.0. Lamentablemente el ejecutable carece de icono y cuando lo arrancamos produce un fallo de página en 004487F6.

Analizemos la situación, tenemos un archivo volcado (DUMP.EXE 242 Kb) con un Tamaño de imagen de 0003D000 si miramos las Secciones con el XL tenemos que .shrink Virtual Size + Virtual Address -> 0003C000 + 00001000 = 0003D000, ¡coño! solo nos deja volcar hasta ahí. Trazando el desempakado de Transmac.exe de nuevo y poniendo los bp's adecuados vemos que la sección .shrink, una vez desempakada, tiene su propia cabecera cuyos datos coinciden con la información que nos proporcionan Procdump y PuPE.

El problema reside en la sección .rsrc, a ver si me explico, cuando ejecutamos DUMP.EXE cuyo Tamaño es 0003D000 se produce un fallo de página en la dirección 004487F6 si le restamos la Image Base nos queda 000487F6 . Esto es un rango de direcciónes que no hemos podido volcar y que corresponde a la sección .rsrc del archivo Transmac.exe, es decir la sección .rsrc de DUMP.EXE no se usa para nada, el programa está buscando direcciones por encima de 00448000 (.rsrc 400000 + 48000) que es justo esa sección en Transmac.exe y que quedan fuera del rango de direcciones del volcado.

Esto lo vamos a solucionar a mano aumentando el tamaño del archivo. Volcamos la sección .rsrc de Transmac.exe con el XL, abrimos DUMP.EXE con el editor Hexadecimal, nos situamos al final del archivo e insertamos lo ceros necesarios hasta el offset 47FFF , acto seguido abrimos el archivo .rsrc que corresponde a la sección volcada, selecionamos todo, copiamos y pegamos en el offset 48000 de DUMP.EXE, guardar y salir.

Ahora necesitamos modificar la cebecera del archivo para que tenga en cuenta los bytes que hemos insertado. Esto lo vamos a hacer con Procdump creando dos nuevas secciones de nombres .cero y .rsrc1 (los nombres dan igual, podían haber sido cualquier otro) con los siguientes valores:

Nombre Sección Virtual Size Virtual Offset Raw Size Raw Offset
.cero 0000B000 0003D000 0000B000 0003D000
.rsrc1 00001000 00048000 00001000 00048000

Sabemos que en los archivos volcados Raw Size = Virtual Size y Raw Offset = Virtual Offset, vemos con el XL que la sección .rsrc de Transmac.exe tiene como Virtual Address (Virtual Offset en Procdump) 00048000 y como Virtual Size 00001000, trasladamos estos datos a Procdump para la sección .rsrc1.

Para la sección .cero el Raw Offset lo pone automáticamente Procdump y coincide con la Tamaño de la imagen, es decir el final de fichero, lo restamos del Virtual Offset de la sección .rsrc1 y nos queda el Virtual Size de la sección .cero (00048000 - 0003D000 = 0000B000). Para finalizar cambiamos el Size of Image a 00049000 y reconstruimos la cabecera, Procdump se lo monta solo y nos deja una sola sección quedando la cosa así:

Nombre Sección Virtual Size Virtual Offset Raw Size Raw Offset
.cero 00001000 00048000 00000E88 0003D000

Nota: Por alguna razón esto no siempre funciona a la primera, lo he hecho varias veces y los resultados no siempre son iguales. Procdump a veces pone el Raw Size de .rsrc1 a E88 y deja el RS de .cero a 00, o mezcla los valores de las dos secciones. Esto se soluciona borrando la última sección y poniendo los valores de arriba en la sección que quede.

¡Ya tenemos icono! ...pero el ejecutable sigue sin funcionar, tenemos otro fallo de página en otro lado. Paciencia. Esto tiene algo que ver con las Variables de Entorno en unas direcciones 007AXXXX, el programa da unas cuantas vueltas por aquí y en una de ellas parece como si la dirección se moviera una línea hacia arriba y claro la cosa ya no cuadra, donde antes había ceros ahora tenemos algo referente a la tarjeta de sonido. Para no aburriros os dire que esto se soluciona haciendo incondicional el salto en 4196DB.

Los "daños colaterales" no parecen graves, un contrato de Licencia absolutamente ininteligible (códigos ASCII en plan raro) y un ejecutable funcional. Como vamos a poner el Serial encriptado "a mano" esto no tiene mucha importancia ya que la ventana con la Licencia no nos va a aparecer. Estos son los cambios a realizar con el editor Hex:

DIRECCIÓN OFFSET VALOR CAMBIAR A
:004196DB 000196DB 74 0A EB 0A
:0042A1D4 0002A1D4 00 00 00 00 00 00 00 A5 00 46 00 00 90 52

Pero el menú About es impresentable ya que la enorme ventana de Licencia parece un volcado de memoria más que otra cosa, así que vamos a adornar el programa un poco.

LA ESTETICA ES IMPORTANTE

Abrimos el ExeScope y en Resource/Dialog/INTRO encontramos nuestra ventana, empezamos a cambiar cosas, con un poco de habilidad y paciencia la enorme ventana de Licencia se puede ver reducida a otra ventana mucho más funcional y atractiva como esta:

Bonito, ¿Eh?. Me ha costado un rato de pruebas en plan ensayo-error dejarla como está arriba. Supongo que se podría haber dejado mejor, pero tampoco hay que pasarse.

FIN

Lo de siempre, esto es con propositos educativos..., el autor no se hace responsable..., etc..

Saludos y hasta otra.

 

Karpoff Spanish Tutor: Página dedicada a la divulgación de información en Castellano, sobre Ingeniería Inversa y Programación. Email "Colabora con tus Proyectos"
www.000webhost.com