Sei sulla pagina 1di 15

127-Comenzando suave a entender mochilas Hasp con OLLYDBG

De 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 de
http://www.micro-cap.co.uk/zips/mc52.zip
Bueno 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 1

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 ret
como 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 agregar
cmp 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

Potrebbero piacerti anche