| ESTUDIO COLECTIVO DE DESPROTECCIONES Última Actualizacion: 25/10/2001 |
Programa | Mass Downloader v2.0.137 | W95 / W98 / NT
Descripción | Programa para acelerar la bajada de archivos desde la red
Tipo | Trial de 30 dias
Tipo de Tutorial | [X]Original, []Adaptación, []Aplicación, []Traducción
Url | http://www.metaproducts.com
Protección | Tiempo de prueba limitado a 30 Dias
Dificultad | 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas | SoftIce v4.05, W32dasm v8.93, UltraEdit v7.10a, UN-PACK v1.9, ProcDump32 v.1.6.2 FINAL
Objetivo | Simular estar registrados.
Cracker | Crick
Fecha | 2 de Noviembre de 2000
INTRODUCCION
Hola a tod@s. Este es el primer trabajo de 'reversing' ;) que publico. Espero que os sirva. El programita en cuestión es el Mass Downloader 2.0.137 que sustituye a la versión 1.2.95 (si no me equivoco). Es un buen acelerador de 'downloads' ya que el fichero que nos vamos a bajar lo parte en varios trozos y se baja cada trozo simultáneamente!!! Bueno, al grano. Es un ejecutable empaquetado con el nuevo ASPACK 2.11 (mr. nobody: te aseguro que no da tanto miedo). Después de intentar encontrar un nº de serie válido sin conseguirlo :'( decidí atacar al tradicional método del CALL xxx; TEST AL,AL; JNZ yyy con éxito :)
AL ATAQUE
En primer lugar tenía que averiguar algo sobre el ejecutable, así que lo pasé por el UN-PACK v1.9 que me dijo, entre otras cosas, esto: * File size 533504 bytes * Time/Date stamp.......: $2A425E19 * Entry point RVA.......: $00186001 * Base of code..........: $00001000 * Base of data..........: $0012D000 * Image base............: $00400000 * Entry point...........: $0007F401 ($00586001) at section N9 <<<-- La puerta de entrada * Packed by ASPack v.2.11 by Alexey Solodovnikov <<<-- La zancadilla * Unpacker not available <<<-- La putada !!! Bueno, no pasa nada. Si no lo podemos desempaquetar a máquina, lo haremos a mano XD Pero primero hay que modificar la información de la cabecera del ejecutable. ¿Por qué?, pues porque, como casi todos, los empaquetadores modifican esta cabecera para hacer el código indesensamblable (¿se dice así?, pues vaya...). Ejecutamos ProcDump32 v.1.6.2 y pinchando en PE Editor buscamos el ejecutable (massdown.exe), una vez abierto nos vamos a Sections, buscamos la sección .aspack y cambiamos las Caracteríticas de C0000040 a E0000020. Con esto decimos que es una sección que contiene código y que es ejecutable. Salimos con OK del ProcDump32. Cargamos el Symbol Loader y abrimos nuestro massdown.exe, le damos a Load, y estamos en SOFTICE !! 014F:00586001 PUSHAD <<<-- Estamos aquí. Instrucción típica de empaquetadores 014F:00586002 JMP 00586444 Estamos al principio de la rutina de desempaquetado del ASPACK 2.11, ahora sólo (¿¡SÓLO!?) queda seguirla y parar justo antes de que devuelva el control al programa principal. Os ahorraré el trabajo: Seguimos con F10 hasta el primer CALL (sin ejecutarlo) En este CALL hay que entrar con F8, si no el programa se nos escapa... 014F:00586444 AND EBX,1CC3E907 014F:0058644A MOV ESI,AD736873 014F:0058644F CALL 00586470 <<<-- En este hay que entrar Entramos y seguimos con F10 014F:00586470 POP EDX 014F:00586471 ADC EBP,0FED1143 014F:00586477 MOVSX EBP,SI 014F:0058647A MOV DI,DX 014F:0058647D ADD EDX,EE2BF152 <<<-- ¡Qué cosas más raras! 014F:00586483 MOVSX EDI,SI 014F:00586486 MOV ECX,513B3F29 014F:0058648B MOV BP,SI 014F:0058648E MOVSX EBP,BP 014F:00586491 ADD EBP,1DF4ABA9 014F:00586497 MOV EBP,11D40E99 014F:0058649C ADD BL,63 014F:0058649F ADD BYTE PTR [EBP+EDX],01 014F:005864A3 INC ECX 014F:005864A4 XOR BL,61 014F:005864A7 MOV BX,SI 014F:005864AA SUB EDX,00000001 014F:005864B0 MOV EBX,ECX 014F:005864B2 JMP 005864D3 (JUMP .) 014F:005864D3 CMP EBX,513B4362 014F:005864D9 JNZ 0058648E (JUMP .) Aquí usaremos un BreakPoint para evitar el bucle, es decir: BPX 5864DF y F5 Break due to BPX #014F:005864DF (ET=2.02 milliseconds) 014F:005864DF MOVSX ESI,AX <<<-- Seguimos con F10 :) 014F:005864E2 JMP 00586503 (JUMP .) 014F:00586503 JMP 0058643B (JUMP .) 014F:0058643B JMP 00586007 (JUMP .) <<<-- Qué manera de marear al personal 014F:00586007 CALL 00586430 014F:0058600C JMP 0058600E (JUMP .) 014F:0058600E MOV EBX,00443930 014F:00586013 ADD EBX,EBP 014F:00586015 SUB EBX,[EBP+00443FD0] 014F:0058601B CMP DWORD PTR [EBP+004449FC],00 014F:00586022 MOV [EBP+004449FC],EBX 014F:00586028 JNZ 00586394 <<<-- Este es el fundamental (NO JUMP) EBX llega aquí con el valor 400000, probablemente la primera dirección para desempaquetar la primera instrucción (a los que les guste parchear al vuelo, éste puede ser un punto de partida). Nos saltamos de un plumazo toda la rutina de desempaquetado (que, por cierto, no tiene desperdício). Metemos un BreakPoint en 586394 y F5 :bpx 586394 Break due to BPX #014F:00586394 (ET=296.78 milliseconds) 014F:00586394 MOV EAX,[EBP+004439AD] <<<-- Aterrizaje perfecto 014F:0058639A PUSH EAX <<<-- Seguimos con F10 014F:0058639B ADD EAX,[EBP+004449FC] 014F:005863A1 POP ECX 014F:005863A2 OR ECX,ECX 014F:005863A4 MOV [EBP+00443CE6],EAX 014F:005863AA POPAD <<<-- Instrucción complementaria al PUSHAD inicial 014F:005863AB JNZ 005863B5 (JUMP .) 014F:005863B5 PUSH 0052BD3C <<<-- Nuestro buscado OEP 014F:005863BA RET <<<-- Nos paramos aquí sin ejecutar el RET El valor metido en la pila es el punto de entrada del programa original. Tenemos el programa desempaquetado en memoria!!!. Introducimos en la línea de comandos de SOFTICE lo siguiente: a eip <intro> jmp eip <intro> <intro> Nos debe haber quedado algo así: 014F:00586394 MOV EAX,[EBP+004439AD] 014F:0058639A PUSH EAX 014F:0058639B ADD EAX,[EBP+004449FC] 014F:005863A1 POP ECX 014F:005863A2 OR ECX,ECX 014F:005863A4 MOV [EBP+00443CE6],EAX 014F:005863AA POPAD 014F:005863AB JNZ 005863B5 014F:005863AD MOV EAX,00000001 014F:005863B2 RET 000C 014F:005863B5 PUSH 0052BD3C 014F:005863BA JMP 005863BA <<<-- Hemos creado un bucle infinito Ahora pulsamos F5 y dejamos al programa metido en un bucle infinito. Arrancamos ProcDump32 de nuevo y localizamos en la ventana de Task a nuestro massdown.exe Lo seleccionamos con el botón derecho del ratón y, en el menú que aparece, elegimos Dump (Full). Guardamos el ejecutable con otro nombre (por ejemplo: mass2.exe) y aún NO salimos de ProcDump. ¿Qué tenemos? Tenemos a nuestro massdown.exe con todas sus vergüenzas expuestas a las miradas ajenas, es decir, DESEMPAQUETADO Y COMPLETO !!!! Pero falta una cosa. ¿Os acordáis de la dirección que se mete en la pila antes del último RET? "52BD3C" ese debe ser ahora nuestro punto de entrada al programa, por lo tanto pulsamos en PE Editor (dentro de ProcDump) y buscamos ahora nuestro exe recien desempaquetadito. En Entry Point metemos la dirección 12BD3C (52BD3C-400000). Pulsamos en Sections y cambiamos el campo Características de la sección .CODE de C0000040 a E0000020, por la misma razón que antes. (También podemos dejar la sección .aspack como estaba (con el C0000040)). Ahora sí, salimos de ProcDump. Volvemos a SOFTICE con CTRL + D y restauramos el RET :a eip<intro> 014F:005863BA ret<intro> 014F:005863BB<intro> F5 y dejamos que se cargue el programa. Después salimos de él. Tenemos el massdown.exe original y nuestro mass2.exe desempaquetado. Los renombramos. A massdown.exe le llamamos massdown.exe.original y a mass2.exe lo llamamos massdown.exe (que nadie se pierda :) Bien, y ¿ahora qué?. Bueno, a mí se me ocurrió ir a la caza de un nº de serie válido, por lo que me fuí directo al menú About y a continuación a Register. Metí un nombre de usuario y un nº de serie (o de licencia) y... CTRL+D para ir a SOFTICE. Después de probar algunos BPX me funcionó este: BPX HMEMCPY. F5 para volver a Mass Downloader y pulsamos en OK para que se 'valide' nuestro usuario y nº de serie :) SOFTICE nos saluda... estamos dentro. Pulsamos F12 7 veces (sí 7) Ahora estamos en el código de Mass Downloader. Pulsamos F12 5 veces más. Debemos andar por aquí: :004EC2AD 8D55FC lea edx, dword ptr [ebp-04] :004EC2B0 8B83EC020000 mov eax, dword ptr [ebx+000002EC] :004EC2B6 E82DC4F4FF call 004386E8 <<<-- Aquí se lee el usuario :004EC2BB 8D55F8 lea edx, dword ptr [ebp-08] <<<-- Habremos aterrizado por aquí :004EC2BE 8B83F4020000 mov eax, dword ptr [ebx+000002F4] :004EC2C4 E81FC4F4FF call 004386E8 <<<-- Aquí se lee el nº de serie :004EC2C9 8D4DF8 lea ecx, dword ptr [ebp-08] :004EC2CC 8D55FC lea edx, dword ptr [ebp-04] :004EC2CF A150015300 mov eax, dword ptr [00530150] :004EC2D4 8B00 mov eax, dword ptr [eax] :004EC2D6 E8C9920100 call 005055A4 <<<-- Esta es la madre del cordero !!! :004EC2DB 84C0 test al, al :004EC2DD 747E je 004EC35D :004EC2DF A150015300 mov eax, dword ptr [00530150] Si a alguien le interesa, el CALL 005055A4 es la validación de nuestro nº de serie. Yo me cansé de intentar cazar el nº bueno :( Pero la rutina es interesante, primero se comprueba que el usuario introducido no sea alguno de los que el programa tiene fichados !!! (¿eh, mr. green?). Después calcula el mismo nº de serie que era válido para la versión anterior del programa (¿aprovechando código, eh...?, je, je) y luego lo marea de una forma que consiguió marearme a mí. Pero, si nos fijamos, a la vuelta del CALL hay una comprobación que nos suena: TEST AL,AL ¿No será...? LO ES !!!! Vale ya está claro, ¡¡invertimos el salto!! No vale. EAX debe valer 01. Entonces, ¿¿solo tenemos los 2 bytes del TEST AL,AL para hacer algo...??? Noooo... Podemos ver donde consigue EAX ese valor y 'ayudarle' XD Entramos en el CALL 005055A4... * Referenced by a CALL at Addresses: |:004EC2D6 , :004F5A36 | :005055A4 55 push ebp <<<-- Por aquí, por favor... :) :005055A5 8BEC mov ebp, esp :005055A7 6A00 push 00000000 :005055A9 6A00 push 00000000 :005055AB 6A00 push 00000000 :005055AD 6A00 push 00000000 :005055AF 53 push ebx :005055B0 56 push esi Seguimos trazando hasta: :00505B58 EBEB jmp 00505B45 :00505B5A 8A45FF mov al, byte ptr [ebp-01] <<<-- Paramos aquí :00505B5D 5E pop esi :00505B5E 5B pop ebx :00505B5F 8BE5 mov esp, ebp :00505B61 5D pop ebp :00505B62 C3 ret Casualmente el RET que hay en 505B62 nos devuelve a nuestro TEST AL,AL Osea que el 01 debería habitar en [ebp-01] (pero noes así. Hay un CERO PATATERO) Pues lo cambiamos... En lugar de: mov al, byte ptr [ebp-01] metemos un flamante: mov al,01 (Seguido de un NOP para que ocupe los mismos bytes que la instrucción que eliminamos) Para ello anotamos los bytes que nos interesan: EBEB8A45FF5E5B Los buscamos con nuestro editor hexadecimal (Ultraedit 7.10a) Y los cambiamos por: EBEBB001905E5B (sólo hemos cambiado 3 bytes) Grabamos y probamos.... El programa arranca... Vamos a About... A Register y.... NOT REGISTERED !! pero..., pero..., tú dijiste.... :'( Tranquilos, meted los datos que querais y pulsad OK. ¿Qué ha pasado?... Estamos Registrados !!!! La explicación al primer susto está un poco más arriba, concretamente cuando entramos en el CALL el W32dsm89 nos dice que a esa rutina se le llama desde 2 SITIOS, uno el que hemos visto (004EC2D6) y el otro nada más ejecutar el programa (004F5A36). Se comprueba si el RegUser y RegKey (que son claves del Registro, bajo HKCU\Software\Metaproducts\Massdownloader) son buenos, y la primera vez no existían en el registro. Se crean cuando nos 'registramos' por primera vez. Ahora podemos observar que al haber modificado el valor de AL ANTES de volver de la rutina de comprobación conseguimos que el parche funcione aunque se llame a la rutina desde diferentes puntos. Desde este momento, cada vez que arranquemos el programa nos dirá que estamos perfectamente registrados. Un saludo. Crick
[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. Si necesitas contactar con nosotros , lee esto antes e infórmate de cómo puedes ayudarnos