Descripción Creo que Barudan Punchant es software para controlar máquinas de coser, es funcionalmente mucho más útil de lo que no puede parecer.
Tipo de Protección TimeHASP-4, otros trucos :-).
Size 15Mb de archivos de instalación.
Nombre Barudan Punchant v6.0G (Tajima DGML v6.0, Wilcom ES-65).
Dirección http://www.barudan.co.jp/

Voy a comenzar uno de mis tutoriales de nuevo estilo con una pequeña historia. Mi batalla contra estos programas comenzó hace alrededor de 2 años cuando yo utilizaba un programa muy similar a este llamado 'Wilcom ES-65 Designer'. Al principio de 1997 fué uno de los primeros con una buena protección del tipo TimeHASP,al menos de los que yo había visto, muchos servicios y dos códigos responsables también :-), esto me dió un gran dolor de cabeza con sus pequeños trucos los cuales se repiten ,a pesar de la ligera diferencia en este ejemplo.

TimeHASP-4 es uno de los HASP dongle que utiliza más memoria tiene 496 bytes de memoria asi como también un contador de tiempo real. Encontrando nuestra rutina HASP es bastante sencillo desensamblarlo, una vez desensamblado bp.exe encuentras un 'cmp bh, 32' en 00402DD6, tras esto puedes hallar fácilmente la instruccón JMP HASPDOSDRV. Nosotros añadiremos la rutina de emulación según el procedimiento habitual (lee el tutorial de CasMate's si tu no sabes como hacerlo) cambiamos el E9 en el offs al natural. 18FA68 a E8 y comienza tu rutina de emulación en el offs al natural. 182CAA.

Nuestro primer problema será encontrar que dongle utilizar para este programa , después de falsificar la comprobación IsHasp() tú encontrarás 4 conjuntos de contraseñas utilizados en los passwords con HaspCode (34A7/3268, 50ED/5017, 1F97/68E0 y 3C39/2047). Aún hoy no he encontrado cuál es el correcto, sólo puedo asumir diferentes controles de HASP de varios programas de ésta compañía. Aún así ésto probará que no hay ningún problema con el primer conjunto y también funcionará con los otros · programas que yo tengo. Todos los programas programs llaman 4 call 4 servicios principales HASP, los abordé en poco tiempo. IsHasp como cabía esperar demostrará que son inefectivas. Las comprobaciones HaspCode sin embargo son muy buenas, el programa mira iniciálmente 8 códigos aleatorios que están en la tabla e utiliza el índice para llegar a las respuestas deseadas, cuando yo lo rompí por primera vez en 1997 programé una rutina básica que anulaba la tabla, recuperaba el índice de la pila y conseguía que continuase con la ejecución.

No es necesario decir que hace mucho que yo emulé HaspCode() generalmente no es una cosa muy larga ni complicada. Service 4E o HaspID() son también fácil de emular (escoge tu número de serie y podrás :-) ). Nuestro principal problema está en Service 3 y 49 (ReadWord() y GetDate()). Yo lo parcheé normalmente GetDate() pero Barudan Punchant verifica el regreso de la rutina la cuál no es muy divertida de parchear , los días que te quedan también comprobados usando words del Dongle (al final verás como remediar esto). Llegando por consiguiente la fecha actual, nuestro primer dilema , a pesar de eso nosotros tenemos la respuesta situada frente a nuestros cansados ojos, nosotros sólo tenemos que usar GetLocalTime() que está importado en bp.exe ya.

VOID GetLocalTime(

LPSYSTEMTIME lpSystemTime // la dirección de la estructura de tiempo
);

typedef struct _SYSTEMTIME { // st
WORD wYear; <-- devuelve la igualdad 4.
WORD wMonth; <-- devuelve la igualda 2.
WORD wDayOfWeek;
WORD wDay; <-- devuelve la igualdad 1.
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;

Aquí tenemos la forma de traducirlo a ensamblador :-

CMP BH, 49 <-- GetDate().
JNZ $+x <-- Hace el siguiente servicio.
PUSHAD <-- graba los registros.
LEA EDI, [EBP+offset] <-- estructura de 10h dup(0).
PUSH EDI <-- lpSystemTime.
CALL GetLocalTime()
SUB ESP, 4 <-- pila correcta.
POP EDI <-- Restaura EDI.
POPAD <-- Restaura los registros.
LEA ECX, [EBP+offset] <-- nuestra estructura.
MOVZX EAX, WORD PTR [ECX+6] <-- Día.
MOVZX EBX, WORD PTR [ECX+2] <-- Month.
MOVZX EDX, WORD PTR [ECX] <-- Año.
SUB DX, 76Ch <-- Sub 1900 decimal.
XOR ECX, ECX <-- elimina el status requerido.
RET <-- regresa del emulador.

Es siempre una satisfacción saber usar las facilidades que el programa nos presenta en bandeja :-). El servicio 3 funciona como sigue: todas las words de 0 - F7 son leidas por el programa y sumadas, EDI preserva la word que está siendo leída read tu puedes utilizar un breakpoint adicional para saltarte la mayor parte de esto. Las posiciones F6 y F7 actúan como checksums y son verificadas, te aconsejo nopear estas comprobaciones y regresar a resolverlas al final (004FF048 & 004FF062).Apartir de aquí tu sólo necesitarás leer la word y preocuparte sólo de las 0 - 3D. La mayoría de ellas son sólamente interruptores de opciones,lee la word, anula la tabla con su índice, XORéalas {dudo que exista éste término pero no encuentro otra forma de expresarlo ; P} con su tabla correspondiente y compara el resultado con FFFFh.

Sinembargo, todos los programas tienes excepciones que han necesitado mucha investigación por mi parte. En primer lugar te aconsejo,que repares la word 1C, esto actuará como una opción de validación, reparar esto traerá consigo el arrancar el programa sin el error "Invalid Product". Las Words 1A y 1B son las opciones de fecha, son XOReadas con las entradas de la tabla y manipuladas para conseguir una DWORD más abajo.

07CF 0C1D
^^^^ ^^^^
 1A   1B

Esto debe ser suficientemente explícito, 07CF es el año, 0C el mes, 1D el día). Esta DWORD es provista por una rutina ue calcula los días que quedan apartir de la fecha actual con el Service 49 (supongo que es correcta). Esto es por consiguiente muy fácil conseguir darte unos 20 o 30 años para probar este software o mejor aún XORea ambas hacia FFFFh y nunca se comprobará la fecha de expiración. Word 1E controla algún tipo de información de la versión y debe ser XOReada a 32 (se comprueba si es correcto al final del loop del 3er service).

Voy a darte un listado de las Words que controlan opciones, tu puedes XORearlas con seguridad hacia FFFFh, lo que realmente te aconsejo que hagas es verter la tabla XOR y escribir un programa que haga el trabajo sucio por tí.

graba XOR a FFFFh :- 2-D (inclusive), F, 10, 11, 14, 15, 18, 19, 1F, 23, 2B, 2C, 2E-3B (inclusive), 3D.

Todos estos programas tienen 2 trucos adicionales el promero implica una una segunda parte que es desensamblar ciertas funciones (la segunda parte es un controlador de tiempo que será trucado al para terminar). El segundo truco deshabilita las opciones del inicio. Nosotros nos ocuparemos del segundo truco primero, las opciones de inicio se deshabilitan muy rápidamente y termina con una Messagebox que puede ser bpx'd {lo cual yo traduzco por breakpointeada ; P} con facilidad, pulsa 2 veces el F12 y tu encontrarás los contadores, son controlados usando una word 20 de lectura desde el dongle el cual será XOReado con ésta entrada de tabla (9D08h) y entonces dividido por 3E8h, los 3 programas que poseo han producido diferentes resultados de esta división, en Barudan Punchant es 3, así que XORea la word 20 a BB8h en este caso.

Las 2 otras words de dongle dongle , 24 y 3C desactivan la opción de grabar e imprimir así que no las XORees hacia FFFFh aún así son comprobadas por el mismo método que las otras. El final de la primera parte implica el mayor problema que implica un contador de tiempo que desactiva varias opciones del menú , este es el verdadero bit inteligente de esta protección. He intentado en primer lugar averiguar como desactivan las words 24 y 3C la opción de grabar, después de alrededor de 15 lineas de anotaciones copiadas del resultado del XOR varias veces lo conseguí. Bueno, pero que hay del la activación/desactivación del contador de tiempo de las APIs?, el timer API's el cuál parcheé demasiado sólo permitía dejarnos en un loop dentro deI mfc42.dll, lo cual no funciona demasiado bien ; P.

La solución que encontré fue muy fácil y me cabreó un poco(porque ahí es donde debería haber ido desde el principio). Comencé colocando un bpx en CreateFileA y clickeando en mi versión actual de activar grabación, entonces desenrrollé la pila hasta que alcancé el id del Menú manipulando el procedimiento el cuál toma el parámetro de id através de EBX, esto desactiva el ID para grabar el cuál es 8127h. Por supuesto bp.exe no tiene recursos de menú lo cual explica que yo no la hubiese encontrado rápidamente, a pesar de que estén situados en un archivo llamado bpres.dll (si, ya lo sé un nombre así da muchas pistas y no me explico como pude dejarlo pasar :-) ). llegarás aquí también 8125h como la opción de grabar como ID. Vamos a buscar 8127 en W32Dasm y veremos que encontramos :-

:0041E102 MOV [ESP+0C], 00008127 <-- Aquí.
:0041E646 PUSH 00008127 <-- aquí (doble rutina).
:00473213 PUSH 00008127 <-- busca las CALLs.

Una inspección a revelado la referencia a 00473213 es una rutina de activación (puedes comprobarlo porque sólo es alcanzada por la word 24 no la XORees hacia FFFFh). La referencia 0041E646 es muy paecida a la de 0041E102 con funciones de procesos ID detrás de cada una. Coloqué un bpx en ambas localizaciones pero sólo saltó 0041E102 , mi mejor conjetura es que ambos . 0041E102 traza de regreso a CALL 0041E090 al cual no hace referencia ninguna otra impulsada, de hecho es alcanzado através del CALL [EAX+4] en 0041F71B, éste es otro toque inteligente.

CALL [EAX+4] toma una base variable a .rdata (obtenido através de [ESI]) y entonces añadiéndole 4 engancha a un vector de datos DWORD conteniendo la dirección real de la función. Mediante la utilización de HEX editor nosotros también podremos encontrar la referencia al CALL 0041E3F0 (nuestra segunda cadena misteriosa acabó arriba). Como puede ayudarnos esto?, bien nosotros sabemos por nuestro trabajo que de ese modo distante que traza esa función más alta no será una opción así que mejor vamos a entregarnos a una redirección inversa y puede acarrear alguna investigaciones.

Una posible solución puede ser cambiar las 2 DWORD de la sección .rdata para señalar nuestra propia rutina, todas ellas probablemente necesitarán constituir una RET y puede que también alguna corrección de pila (la cual nosotros podemos parchear directamente para desviar las rutinas de desactivacióne o cambiar los ID pushes a 0). Podemos comenzar también buscando la dirección de base 00539F50, así esto nos saca una única referencia, un MOV DWORD PTR [ESI], 00539F50 el cual puede o no puede ser interesante (dependiendo de lo que busques y del tiempo qu ehayas invertido en ello).

Esto es realmente todo lo que hay que ver aquí, los otros 2 programas funcionan igual que este, Tajima desactiva unas cuantas opciones más y tiene un poco más de truco, Wilcom es más simple. .


© 1999 CrackZ. 28th December 1999.

Traducido por John Keeper 2.000 JKEEPER@CORREO.DE
www.000webhost.com