Karpoff Spanish Tutor

Programa:

Cimagrafi v5.0


 

PROTECCION: Mochila HASP
Objetivo: Eliminar las entradas de las mochilas.
Descripcion: Buscar en la WEB la utilidad de este soft.
Dificultad: Media.
DOWNLOAD: http://www.graphitech.net/
Herramientas: Softice W32dasm, IDA,  HIEW
CRACKER: CrackZ   FECHA: ../../....

 

 INTRODUCCION

Bienvenidos nuevamente a un tutorial sobre dongles, esta vez estaremos trabajando con HASP (de la empresa Aladdin Knowledge Systems). HASP, es vista por la mayoría de los crackers, como una de las mas difíciles dongles, al menos por supuesto, que tengas acceso al dongle original. Entonces comparando las respuestas es obviamente fácil. HASPs, vienen en varios sabores, yo los categorice en dos grupos, las que devuelven código de retorno, y las que usan un reloj interno.

Gran cantidad de información sobre las APIs de HASP esta disponible en: ftp://ftp.hasp.com/, si estas realmente interesado en el dongle, baja el CD de documentación entero, sino baja alguno de los PDFs. Cuando estas trabajando con HASP, conocer el modelo especifico ayuda mucho. Cuando estés desensamblando, usa el IDA. Las implementaciones de HSAP varían, pero no te preocupes si encontrás que usando un bpio -h 378 rw no funciona. En la mayoría de los casos hay que olvidarse de trabajar con los NAG Box, (mas tarde voy a explicar algunas de las características usadas en HASP acerca de Nag Box).

Con el dongle de Sentinel, no instalar el drivers puede ser una ventaja, sin embargo es lo contrario para HASP, (instalá el driver vxd ahora y mas tarde los removemos).

 

 

 AL ATAKE

Voy a comenzar el trabajo; hay cuatro archivos Exe en total, pero por ahora me voy a enfocar solamente en graficad.exe, la teoría que aplicamos aquí es que una vez que crackeamos uno los demás son los mismo. Ejecutando el programa, se produce el siguiente mensaje "PLUG NOT FOUND", que es creado usando la famosa MessageBoxA, solamente anotamos la dirección, y nos olvidamos de buscar el salto para evitarlo, de esta manera nunca lo lograras.   

Poner un bpio -h 378 rw no hace nada, de manera que usamos  bpx CreateFileA, esto es porque asumimos que el programa necesita abrir el driver vxd/dongle para comenzar a comunicarse. Permití que se ejecuten varios break hasta que aparece el MessageBox, y anota la dirección de el ultimo lugar que interceptaste. Que tiene que ser parecido al siguiente código.

:004AB91C CALL [KERNEL32!CreateFileA] <-- 2º breaks aqui.

Una ves que estamos en este lugar, deshabilitamos el brekpoint, y comenzamos a tracear con F10. Usa F12 hasta ir al entry point en 004A99DE, una mas  y aparece el MessageBox.

:004A99DE MOV EAX, [EBP-4]
:004A99E1 MOV [EAX+12h], BL <-- Puede ser una bandera interesante, consultar las referencias en las APIs.
:004A99E4 CALL SUB_402A58 <-- Función x.
:004A99E9 MOV EAX, 0FFh
:004A99EE CALL SUB_402D08 <-- Función y, (El valor que retorna  EAX es interesante).
:004A99F3 MOV EDX, [EBP-4] <-- Puede ser peor 'watching' EBP-4.
:004A99F6 MOV [EDX+11h], AL <-- Almacena AL.
:004A99F9 CMP ds:dword_50C7FC,0 <-- 1º respuesta del dongle.
:004A9A00 JNZ 004A9A29 <-- Este lugar tiene que ser chequeado.
:004A9A02 CMP ds:dword_50C800,0 <-- 2º respuesta del dongle.
:004A9A09 JNZ 004A9A29 <-- Nuevamente.
:004A9A0B CMP ds:dword_50C804,0 <-- 3º respuesta del dongle.
:004A9A12 JNZ 004A9A29 <-- El chequeo final.

Cuando te pones a pensar acerca de códigos como el de arriba, es malo ponerse a ponerle nombre a cada función y especular acerca de que hace cada línea. El JNZ 004A9A29 es evidentemente critico para el flujo del programa, cuando lo tracees, te encontraras  dword puestos en cero, poco después aparece un call que presenta "PLUG NOT FOUND", de manera que alguno de los saltos condicionales hace que esto suceda. La pregunta es: Cual es la manera mas fácil para resolver esto?

:004A9A29 MOV EAX, ds:dword_50C800 <-- Es este dword.
:004A9A2E DEC EAX <-- resta  1.
:004A9A2F SUB EAX, 2 <-- resta otros 2.
:004A9A32 JB 004A9A38 <-- "ILLEGAL PLUG" tambien en esta parte.
:004A9A34 JZ 004A9A55 <-- "ILLEGAL PLUG" aqui tambien, pero es el salto bueno.
:004A9A36 JMP 004A9A72 <-- "PLUG NOT FOUND" Inevitable ecepcion.

Para realmente entender esto, necesitas tener bien claro la siguiente sección de código. Saltando por JB o JZ, la ejecución del código continua por el JMP 004A9A8B, aunque un llamado de función presenta "ILLEGAL PLUG" antes que podamos continuar. 

Tené en cuenta los valores que corresponden a las tres banderas (Flag), que tienen que ver con JB y JZ. [EAX+10h] - es puesto en 1 o 0, [EAX+8] es puesto en 32h o 4Dh, y [EAX+0Ch] en 33h o 4ChEl JZ es el salto "bueno", porque? bueno, porque ningún programador serio se molestaría con un salto preciso como es JZ (por ejemplo dword_50C800 = 3),  si un simple JB fuera suficiente, también esta conclusión se refuerza por el hecho que  [EAX+10h] es puesto a 1 (verdadero).

Bueno ahora haremos un emparchado preliminar aquí, usaremos el espacio de direcciones de todas estas comparaciones y el JNZ a 004A9A29 para poner MOV dword_50C800, 3. y después ponemos la comparación, y el salto si no es cero, en realidad se puede hacer un salto directo porque la bandera no se cambia en ningún lado mas. Si tenes ganas podes bajar al final del tutorial, los GIF donde muestro en el Hiew, como hacer esto.

Ahora cuando corremos graficad.exe este nos presenta "ILLEGAL PLUG" este mensaje aparece en la función CALL SUB_4A9FC4, que es donde empezaremos a trabajar. Tené en cuenta que si usas W32Dasm, la primera parte de la función no es desensamblada correctamente. Por favor no te olvides de buscar cualquier instancia de dword_50C800.

:004A9C2A CALL SUB_4AA3B8 <-- Lee el dongle nuevamente (talvez).
:004A9C2F CMP ds:dword_50C800, 0 <-- Check.
:004A9C36 JNZ 004A9C4D <-- No necesito decir que hace este salto.

En esta instancia no vamos a poder hacer un parche tan elegante como el anterior, debido a las restricciones de direcciones, aunque posiblemente podríamos usar el espacio de memoria entre 004A9C38 y 004A9C42. Volvemos al SICE, y tracemos entre las inmediaciones de 004A9FC4, la primera sección de este llamado setea 11 WORD, de una manera horrendamente ineficiente. (Codifique esto nuevamente con muchos menos bytes),  desde EBX,  0, hasta el primer salto a  JNZ 004AA01D. El traceo de esta sección tiene que ser hecha prestando mucha atención.

:004AA04B PUSH offset dword_50C7FC
:004AA050 PUSH offset dword_50C800 <-- Reconoces esto.
:004AA055 PUSH offset dword_50C804 <-- Esto sera checkeado.
:004AA05A PUSH offset dword_50C808 <-- Esto es datos del dongle.
:004AA070 CALL SUB_4AA3B8 <-- Ahora conocemos aqui lee el dongle.
:004AA075 CMP WORD PTR [EBX], 192h <-- La comparación inevitable. 
:004AA07A JZ 004AA094 <-- Jump_nice_dongle_return.

Lentamente hemos ido quebrando esta protección. Cuando anteriormente hicimos la búsqueda por lugares que chequearan el dword_50C800, Yo especule que la función  SUB_4AA3B8 podía ser la función de lectura del dongle, y el código de aquí confirma la sospecha. Tenemos que hacer dos cosas mas, primero emparchar en la forma correcta el código de aquí, y segundo buscar por otras apariciones de la función  SUB_4AA3B8. Cuando emparchaba esta sección usaba desvergonzadamente el espacio de direcciones para asegurarme que la bandera cero fuera seteada por la comparación.

Después de hacer esto continuamos inspeccionando el código un poco mas. Otro chequeo aparece en este código. 

:004AA094 CMP ds:dword_50C804, 0 <-- Check dongle data por 0.
:004AA09B JZ 004AA0B5 <-- Good_jump (salto bueno).

Después de empachar esto, retornamos uno o dos pasos atrás y buscamos por SUB_4AA3B8, encontraremos que aparece nuevamente en este código (no creo que sea necesario corregirlo)

:004A9EAB CALL SUB_4AA3B8 <-- Lectura del Dongle.
:004A9EA0 TEST BL,BL <-- Test BL=0.
:004A9EA2 JZ 004A9EAB <-- No hay que saltar aqui (bad_Jump)

Ahora corremos graficad.exe y igual tenemos el menssage box "ILLEGAL PLUG", después de mucho pensar encontré finalmente donde emparcharlo. Conocemos que la  función SUB_4AA3B8 lee el dongle, y en términos del flujo de ejecución el ultimo chequeo que se hace es el del arriba. Usamos el  Symbol Loader y llegamos a la dirección 004A9EA0 poniendo un comando g temporizado. El JZ funciona como deseamos no necesitamos emparcharlo, (posiblemente porque en cada API de la HASP, BL solamente retorna 0 si un por LPT no fue encontrado), la función SUB_4A9DA4 siguiente es la que tenemos que investigar. 

:004A9DAF TEST EDX,EDX
:004A9DB1 JNZ 004A9DD3 <-- Dirección del Good_jump.
:004A9DB3 TEST ECX,ECX
:004A9DB5 JNZ 004A9DD3 <-- Dirección del Good_jump.
:004A9DB7 TEST EAX,EAX <-- Pregunta si es cero.
:004A9DB9 JNZ 004A9DD3 <-- El mejor Good_jump para forzar.
:004A9DC9 CALL SUB_4A96D4 <-- Si no es cero llama esta función.

Este código se explica por si solo, cualquiera de los JNZ tendrá que ser forzado. Sugiero el ultimo por la razon de que antes de hacer este chequeo el valor del registro EAX es seteado por  (DWORD PTR [EBP+14]), y además este es de propósito general, contrario a los registros ECX/EDX, que pueden retener sus valores muy profundo en el proceso de chequeo. Esto concluye con el truco de la sección de ingeniería inversa. Los otros tres archivos son similares, por lo tanto aplica la misma técnica.   

Apartado sobre tablas de salto - HASP DWORD

Siempre que ataques un HASP, desensamblalo y examiná con cuidado por string de NAGs, y asegurate de tener presente la tabla de salto de DWORD, la cual he visto en la mayoría de los HASP que he atacado hasta aqui. En la mayoría de los programas que tengan HASP necesitaras emparcharlo en mas de un lugar, y el primer paso será probablemente cambiar el string NAG "Incorrect Plug" o algún mensaje similar.

:04A9713 ADD ESI,03 <-- ESI usado como variable se salto.
:004A9716 CMP ESI,0E <-- Maximo numero de posibilidades.
:004A9719 JA 004A97E7 <-- Quick Exit.
:004A971F JMP DWORD PTR [4*ESI+offset] <-- Tabla de salto para string de errores.

Resta por decir que cuando crackeas un HASP correctamente, llegas a este código. Como un ejercicio final para vos queda sacar los string de DEMO y EXP del EXE, solamente con fines estético. 

Traducción: AFTOSA

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com