127-Comenzando Suave a Entender Mochilas Hasp Con OLLYDBGa

download 127-Comenzando Suave a Entender Mochilas Hasp Con OLLYDBGa

of 15

description

book

Transcript of 127-Comenzando Suave a Entender Mochilas Hasp Con OLLYDBGa

127-Comenzando suave a entender mochilas Hasp con OLLYDBG

127-Comenzando suave a entender mochilas Hasp con OLLYDBGDe ms esta decir que no he visto ningn tute con OLLYDBG sobre mochilas HASP, no porque no se pueda hacer si no porque nadie aun lo ha hecho.

Como es un tema nuevo este de las mochilas HASP iremos de a poco, sabemos que como todo las mochilas HASP mas viejas sern mas fciles que las nuevas, as que iremos gradualmente desde una de las mas viejas HASP en este tute hasta las mas nuevas (si podemos jeje)

No desesperar que Roma no se construyo en un da y muchas de las bases y mtodos que se usan en las viejas Hasp aun sirven en parte para las nuevas (con agregados) as que no ser en vano meternos de a poco en el tema de esta manera.

Trataremos de ir perfilando el mtodo de injertar HASP con nuestra rutina, para solucionarla lo que evitara si lo hacemos bien cientos de parcheos y errores que pueden aparecer por ah al usar el programa, que se dan muchas veces al parchear solo saltos condicionales.

Es posible que algunos de los programas iniciales que veamos corren buscando algn salto e invirtindolo, pero trataremos de evitar ese mtodo para aprender a atacar Hasp de una mejor forma, mas global.

De ms esta decir que hay que tener informacin sobre HASP, el manual de la mochila estar en mi FTP y es material de consulta pues trae mucha info muy til, adems de los accesorios para el IDA, y todo lo que usemos en estos tutes.

Adems el tute lo voy escribiendo a medida que lo voy solucionando as que la verdad a esta altura no se si correr esto o no pero seamos optimistas ya le buscaremos la vuelta.

En todo Hasp sea el mas nuevo o el mas viejo siempre hay que buscar la api que utiliza hasp para comunicarse con la mochila, es una rutina que esta en el programa y veremos varias formas de localizarla, adems el programa en HASP SOLAMENTE se comunica con la mochila por medio de esta API as que su estudio es primordial.Bueno se puede hallar la call de hasp con el ida es un mtodo un poco lento, ya que hay que esperar que termine de analizar todo el programa pero bueno, lo pondremos tambin aqu, para aprender aunque se puede hacer con OLLYDBG el que no quiere a IDA saltee esta parte.En mi FTP en la carpeta IDA TOOLS estn las signaturas de hasp para IDA entre otras mochilas que estn all, ya que despus se puede elegir cual usar pueden bajarse todas y los que al descomprimir tengan extensin sig, los copian dentro de la carpeta donde esta instalado el IDA, dentro de la carpeta SIG.Tambin hay un haspmark idc que es mas rpido para identificar la hasp call, aunque con menos informacin, pero puede servir en casos de apuro ese hay que copiarlo en la carpeta IDC del IDA.

El programa se llama Micro-Cap y se baja dehttp://www.micro-cap.co.uk/zips/mc52.zipBueno abramos el IDA y busquemos el ejecutable del programa que es un nico archivo llamado MC5.exe no hay mas nada en la carpeta.

luego de aceptar sale esta ventana

Aqu no es necesario cambiar nada pues solo buscaremos la api de hasp, as que apretamos OK y empieza el IDA a trabajar podemos ir a comer o a baarnos y dejarlo analizando no se caracteriza por su velocidad la verdad

Bueno cuando en el log de los mensajes sale esto

No podemos aun usar las signaturas pues aun no termino de analizar si vemos abajo aun sigue trabajando.

el numero que all es 58947a sigue variando y el semforo que esta en la esquina superior derecha esta en amarillo.

Apenas se ve, para poder aplicar las signaturas debera estar en verde, mientras podemos usar el IDC o sea ese script para localizar, la api hasp.

all buscamos haspmark.idc que habamos puesto en la carpeta idc del IDA

Y aparece

y encuentra la marca de IDA aqu en el listado

Un poquito mas abajo vemos

conocida parte dentro del api de hasp ambas o sea que estamos dentro del api de hasp si subimos vemos donde empieza esta subrutina (547932) y desde donde es llamada esta api.

Nos posamos en donde dice en 547932

CODE XREF que quiere decir la referencia desde donde es llamada esta rutina, hacemos click derecho alli y elegimos JMP TO CROSS REFERENCE.

Entonces todos los lugares desde donde es llamada la api hasp

all localizamos todas las llamadas a la api hasp.

Ahora una vez que termin de hacer el anlisis el IDA y el semforo de la esquina superior derecha esta en verde (pequeo truco si tarda mucho o queda ciclando en forma infinita y no termina el anlisis ya que solo queremos ver la api hasp, vamos a..

Options-General pestaa anlisis y all en KERNEL OPTIONS 1oOo

le quitamos la tilde a TRACE EXECUTION FLOW y a TRACE STACK POINTER, el listado no ser tan completo pero servir y terminara mas rpido.

Bueno una vez listo vamos a

para cargar las signaturas de hasp

como vemos tengo 4 distintas empiezo por la primera

alli apreto para que se abra la ventana de signaturas para ver si ya termino de trabajar y esta aplicada

ah vemos que se aplico y en la columna de funciones halladas dice 0 as que no sirvi sigamos con la otra signatura

tampoco hallo nada sigo con la tercera y la cuarta y nada

bueno igual ya sabemos como se hace para algn otro programa con hasp (es posible que este programa como es viejo las nuevas signaturas no coincidan) nos arreglaremos igual ahora veremos los mtodos para detectar la api hasp con OLLYDBG (esto les gusto mas ehhhh)

Abrimos el programa en OLLYDBG y no esta comprimido (sino habra que descomprimirlo) y estamos en el EP.

80 ff 32 es la cadena hexa correspondiente a CMP BH,32

ahi encuentra la misma zona dentro de la api hasp y en el inicio de esta rutina subimos

y all en 547932 hacemos click derecho- label

y escribimos HASP API

Aparentemente parece que no paso nada pero si buscamos ahora las referencias, haciendo click derecho-find references to selected command

Vemos que debido al label que pusimos ahora en vez de una direccin numrica aparece el nombre call HASP API, lo cual nos ayudara a visualizar mejor.

Otra forma de llegar al mismo punto en OLLYDBG ya como debugger es usando la api

cuando para vemos en el Call Stack

en la segunda linea marcamos y hacemos SHOW CALL y llegamos al famoso

y un poco mas arriba

Esa es otra forma de determinar la api hasp.

bueno ahora ya la tenemos bien determinada volvamos a las referencias desde donde es llamada esa api y pongamos BPX en todas

Esas sern las ocasiones que el programa se conecte con la mochila para ver como van las cosas jeje.

Bueno demos reiniciar y veamos que pasa para en la call hasp api

Los parametros de la api son

"Communication with HASP is performed by calling the hasp( ) routine as follows:

hasp (Service, SeedCode, LptNum, Password1, Password2, Par1, Par2, Par3, Par4)"Aqu explicaremos un poco como trabaja la api hasp cada vez que para, se ingresan los parametros a la api. la cuestion debemos analizar los parmetros y reemplazar la api hasp por un injerto que devuelva los valores correctos para cada servicio de la misma que pueda ser llamado desde cualquier lugar del programa.

Aconseja hasp en sus medidas anticracking del manual no poner todos los parmetros de la api as en orden, hay algunos programas que pasan los parmetros ordenados perfectamente en el stack y es fcil ver cual es cual, igual traceando un minutito ya vemos cual es cada uno.Aqu tenemos el stack al momento de parar en la api

y estos son los registros en ese momento

traceemos dentro de la api hasp

con f7

en EAX esta el parmetro de numero de servicio que en este caso es 1, lo sabemos porque en BH al llegar al cmp bh,32 SIEMPRE se compara el numero de servicio, o sea que en EAX en la entrada de la api ya tenemos que estaba el numero de servicio.

Estos eran los registros al entrar a la api entonces eax era 1 y era el numero de servicio

hasp (Service, SeedCode, LptNum, Password1, Password2, Par1, Par2, Par3, Par4)"Bueno ya tenemos lo mas importante el numero de servicio, hay unos cuantos servicios, algunos mas sencillos otros mas difciles aqu solo veremos los que va utilizando este programa, en caso de que alguien este crackeando otro hasp y le aparezca otro servicio que no este en este tute debe consultar el manual de hasp a ver para que sirve y que respuestas da para emularlo bien.

Del manual de la hasp

Las salidas que retorna la api se guardan en la memoria hacia all apuntan los parmetros par1,par2, par3 y par4, all guarda la api la respuesta de la hasp en todos los servicios, veamos en el manual que es el servicio 1 y luego busquemos el lugar donde guarda la respuesta y cual ser la misma.

O sea el servicio 1 es el simple chequeo de si esta la mochila en el port, solo usa dos parmetros de la entrada, que uno es el que ya vimos en eax el valor del servicio que es 1 y el otro lo pondr el programa el valor de en que port buscara, no nos interesa eso, nosotros debemos buscar cual es la respuesta correcta y hallar el puntero donde la guarda para emular la mochila.

Vemos que el retorno es un solo parmetro en par1 all guardara si la mochila esta o no, as que busquemos entre los parmetros de la entrada de la api si encontramos los punteros par1,par2,par3 y par4 adonde guarda las respuestas de la mochila.

en el momento de entrar a la api hasp este era el stack esos cuatro punteros que estn all son muy sospechosos jeje son los punteros adonde guarda la mochila la respuesta, si seguimos traceando dentro de la api hasp. al pasar la call

Vemos que guarda los valores de eax, ebx, ecx y edx en las posiciones de memoria que apuntan esos cuatro punteros vemos que tambin par1 es eax, par2 es ebx, par3 es ecx y par4 es edx, y que guarda los valores retornados de la mochila, encima en el manual nos dice que la respuesta estara en par1 o sea el valor de eax que estamos ahora y que

si es 0 no hay hasp conectada y que si es 1 si encontr la mochila, vemos el valor que vale eax en este momento

quiere decir que si lo pongo eax a 1 ya salte el primer servicio de la mochila de la misma forma que si estuviera conectada

lo cambio antes de guardarlo y se ejecute la lnea que lo guarda en el puntero a par1 y listo, por supuesto haremos un injerto que emulara todos los servicios de la api hasp pero en este caso del servicio 1 no es muy difcil

podramos desviar que en vez de ir a ese call interno de la api hasp fuera a un injerto nuestro que podra tentativamente empezar as (ya haremos la rutina definitiva al final)cmp bh, 1 (si es el servicio1)

jnz al servicio siguiente

xor eax, eax

mov al, 1

jmp final

.....

....

siguientes servicios

y al final un retcomo vemos al retornar el mismo programa guarda eax en los lugares asignados as que no debemos preocuparnos por eso jeje

bueno ya vimos y liquidamos en memoria el primer servicio demos RUN de nuevo a ver el segundo..

Para all ahora sabemos que eax es el numero de servicio y en el stack estn los punteros adonde guardara el resultado, vemos que eax es 5 o sea que es el servicio 5.

estos son los valores de los registros al entrar a la api y abajo vemos los valores del stack.

Veamos en el manual que catzo es el servicio 5

bueno chequea el tipo de mochila vemos que abajo de la api hasp chequea el resultado de la respuesta de la hasp y ve si es cero, otro chequeo no hay asi que poniendo a cero eax que es el tipo de respuesta para OTHER KEYS que dice el manual, pasara la prueba asi que a nuestro injerto le deberemos agregarcmp bh, 1 (si es el servicio1)

jnz al servicio siguiente

xor eax, eax

mov al, 1

jmp final

cmp bh,5 (si es el servicio 5)

jnz servicio siguiente

xor eax,eax (pone eax a cero para la respuesta de la dongle)

jmp final

....

siguientes servicios

y al final ret

bueno como aparentemente de suerte me quedo eax valiendo cero al salir del call antes de guardar en par1, ya esta solucionado en memoria seguimos adelante.los siguientes servicios sern explicados y emulados en la parte 2 del tute por hoy ya tenemos bastante.Hasta la prxima y bay bay

Un abrazo a todos los crackslatinos

Ricardo Narvaja