DigiSHOW.vld v1.25 - Tutorial

http://www.future-software.co.uk/index.htm - Webpage.
vld126.zip - (1.45Mb)

Traducción de ^[G]oLe[E]^

Bienvenidos otra vez. En DigiSHOW tenemos una protección DoNgLe muy pobremente inplementada para decirlo suavemente, sin embargo, ofrece muchas oportunidades de aprender y el chance de enviar al proverbial basurero el dk47wn32.dll. En la instalación, el programa copia el driver relevante al Directorio de tu sistema, en este caso dk47wn95.386, nota la vieja extensión 386 aquí, la mayoria de DoNgLeS decentes usan vxd para sus malignas comunicaciones (al menos para Windows 95).

Al parecer el camino a seguir es desensamblar el archivo dk47wn32.dll, y ver a través de las listas de funciones exportadas, lo cual deberia sacarnos una sonrisa (FindDk47 -->[EncontrarDK47], DK47ReadRandomNumbers --> [DK47LeeNumerosAleatoreos]). Obviamente viendo dentro del programa principal veremos donde es que estas funciones son importadas sabiamente, también podria gustarte cargar estas exportaciones en el Symbol Loader del SoftICE. Dentro de vld.exe, tenemos lo siguiente.

:00403649 CALL 00408002 <-- DK47wn32.DK47DriverInstalado.
:0040364E CMP EAX, 00000001 <-- El Driver Instalado fija EAX=1.
:00403651 JNZ 0040369C <-- Si_no_hay_driver_instalado_saltar.
:00403653 CALL 00407FFC <-- DK47wn32.FindDK47
:00403658 CMP EAX, 00000001 <-- Está Conectada la DoNgLe?
:0040365B JNZ 0040369C <-- Saltar_si_no.
:0040365D LEA EAX, DWORD PTR [ESP+04]
:00403661 PUSH 00000806 <-- Esto se ve como los datos de la DoNgLe.
:00403665 PUSH EAX
:00403667 PUSH 0000003B
:00403669 PUSH 00000006 <-- Empuja un carga completa de parámetros.
:0040366B PUSH 0000001E
:0040366D CALL 00407FF6 <-- DK47wn32.DK47ReadRandomNumbers
:00403672 MOV EAX, 00000447 <-- EAX inicializado en 447h.
:00403677 XOR ECX, ECX <-- Limpia ECX.
:00403679 MOV CL, BYTE PTR [ESP+EAX+04] <-- La DoNgLe retorna datos.
:0040367D ADD ESI, ECX <-- Almacenar el resultado en ESI.
:0040367F INC EAX <-- Incrementar el loop.
:00403680 CMP EAX, 00000806 <-- Está hecho el loop?
:00403685 JL 00403677 <-- Obtener más Datos.
:00403687 CMP ESI, 0001FECA <-- Buen Resultado.
:0040368D JNZ 0040369C <-- Mal_salto.
:0040368F MOV EAX, 00000001 <-- El Flag Buen chico (Good guy flag).
:00403695 ADD ESP, 00000808 <-- Gran Pila de correcciones para todos los datos de la DoNgLe.

Este código es sumamente fácil de entender, desafortunadamente para el programador, todos los malos saltos son de la forma JNZ 0040369C, y como sabemos que el código pasa el primer ¨está instalado el driver de chequeo?¨ es obvio como deberán trabajar los otros 2. FindDK47 Primero chequea el puerto Paralelo para ver si nuestra DoNgLe está conectada, si lo está, retorna EAX=1, si no EAX=0. Nuestro objetivo ahora es parchear lo que podamos del dll genericamente, notar que sería imposible parchear el dll para todas las aplicaciones viendo como los códigos de la DoNgLe son chequeados usualmente al lado de la aplicación.

En 00403679, CL apunta a valores que deben haberse obtenido de la DoNgLe, cada vez que he examinado el codigo CL ha sido FF, sugiriendo un error, ciertamente es posible en el lado de la aplicación, mejorar la eficiencia de este codigo, parcheando el loop, recordando que los valores de EAX necesitan ser ajustados. Viendo dentro de la lista desensamblada de dk47wn32.dll nuestra primera tarea es asegurarnos que FindDk47 siempre retorne verdadero, p.e. siempre hay una DoNgLe conectada. La función FindDK47 es controlada usando [EBP-04], parece que el dll chequea la presencia de la DoNgLe usando un 1 retornado por la DoNgLe actual. El código relevante es este:

:20001343 CALL KERNEL32.ReleaseSemaphore
:20001349 MOV EAX, DWORD PTR [EBP-04] <-- Esto necesita ser 1.
:2000134C AND EAX, 0000FFFF <-- Chequea los registros con un AND lógico.

Te recomiendo leer acerca de objetos semaforo en cualquier referencia system class decente, también puede ser valioso leer acerca de las funciones de espera. Es innecesario decir que pudieras reemplazar facilmente el AND EAX, 0000FFFF con un XOR EAX,EAX (33C0) y un INC EAX (40) + apropiado (s) NOP´s para asegurarse que tu DoNgLe siemptre esté conectada. Para parchear los codigos de retorno obtenidos de la DoNgLe podríamos conformarnos con quitar el salto en 0040368D, sin embargo, preferiría rescribir esta rutina entera y mejorar la eficiencia del código al mismo tiempo.

:00403672 MOV EAX, 00000806 (B806080000) <-- Como si el Loop hubiera terminado.
:00403677 XOR ECX, ECX <-- Dejar ECX como 0, no importa.
:00403679 MOV ESI, 0001FECA (BECAFE0100) <-- Lo que debería ser ESI.
:0040367E INC EAX
:0040367F DEC EAX <-- Se vé mejor que 2 NOP.

Aunque te mostré de forma tempranera como podrias parchear el dll, probablemente es mas apropiado parchear todo en primer lugar (p.e. la aplicación), dejare esto como un pequeño ejercicio. Aquellos de ustedes que no les guste los archivos innecesarios, les gustará remover la necesidad del driver parcheando el resultado de DK47DriverInstalled. Extraordinariamente, le voy a dar credito al autor por su poca inteligencia, probablemente ha comprendido que su aplicación es tan especializada en la naturaleza que el promedio warezer es inverosimil estafarle ingresos significantes.

La infortunada realidad de esta protección es que es potencialmente menor que lo que el autor podría hacer con su fabricante particular de DoNgLe, la seguridad de las rutinas que llaman a las DoNgLeS es el eslabon debil e incluso si siempre chequeara a través del programa, un cracker promedio fácilmente los aislaría.


© 1998 CrackZ. 4rth September 1998.
www.000webhost.com