You are on page 1of 30

NOMBRE: EMULANDO HARDKEY.

NET Fecha: 20-12-2009

Programa
Versin
Herramientas
Objetivo
Cracker
Proteccin

Discovery Easy Soft


3.40 SP1
Olly, WinAsm
Lograr que corra sin la llave
MCKSys Argentina
HARDKey.NET

Bien, este es mi sptimo tutorial (mmm, a estas alturas deberan ser ms )


Bueno, en esta ocasin, vamos a ver cmo emular las llaves HARDKey.NET. Para quienes no saben qu
tipo de llaves son stas, las mismas se obtienen aqu: http://www.hardkey.net/
Al principio pensaba que era muy difcil crackear este tipo de cosas, pero, luego de investigar bastante el
tema, descubr que, como siempre, DEPENDE de quin ha realizado la implementacin de la llave.
Tambin soy consiente de que este programa ya ha sido crackeado. Pero mi objetivo, no era crackear el
EXE, sino vencer la llave .
Ahora, antes de empezar como siempre, quiero contarles una cosa que me sorprendi mucho. En el sitio de
los que venden la llave (el anterior) puede descargarse el manual del programador. Dicho de otra forma, el
archivo (un .CHM) explica EXACTAMENTE cmo funciona el HARDKey (por supuesto, la parte referente al
programador). Esto lo considero un bug, no de la aplicacin, sin de los vendedores de la llave.
De cualquier manera, este archivo de ayuda, me fue de GRAN ayuda, para comprender el mecanismo de
comunicacin, entre la aplicacin y la llave (y viceversa). El archivo lo pueden bajar de aqu (Identificado
como Manual del kit: http://www.hardkey.net/soporte/actualizaciones.htm. El archivo se llama:
Hardkey.chm

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Les recomiendo bajarse este archivo, si es que van a atacar este tipo de llaves.
Antes de empezar a trabajar con las herramientas de siempre, vamos a investigar un poco cmo funciona
este tipo de proteccin.
Segn el manual de programador (manual), la aplicacin se contacta con la llave, mediante una librera,
llamada hkey-w32.dll. Para ser ms especficos, llama a la funcin HARDKey de dicha DLL.
La funcin HARDKey recibe slo un parmetro: una cadena de comando de 200 bytes de largo. Este largo
ES FIJO. Si los datos de comando (EXE) o de respuesta (DLL) no son suficientes para llenar la cadena
completa, entonces el resto contiene caracteres espacios (aunque actualmente estoy viendo otras
aplicaciones con la misma proteccin, que no cumplen con esta ltima condicin, sino que rellenan la
cadenas con cero (carcter 0 en el cdigo ASCII)).
El proceso de comunicacin EXE-DLL es asi:
1) El programa genera una cadena de comando.
2) La cadena de comando es encriptada utilizando una funcin ESPECIFICADA EN EL MANUAL DEL
PROGRAMADOR. La cual recibe como parmetros, la cadena de comando y una contrasea
(password) predeterminada. La funcin encripta la cadena usando la password y, adems, 2
vectores (arrays) de 256 nmeros tipo BYTE.
3) El comando encriptado se pasa a la DLL usando la funcin HARDKey.
4) La DLL procesa el comando, y sobre LA MISMA cadena (misma direccion de memoria) escribe la
respuesta obtenida del driver de la llave.
5) La respuesta es encriptada nuevamente, usando una funcin PARECIDA a la del programa, y se
retorna al programa.
6) El programa desencripta la respuesta, usando una funcin ESPECIFICADA EN EL MANUAL DEL
PROGRAMADOR. La cual es MUY parecida a la de encriptacin, pero que no es SIMETRICA con la
misma (ya veremos esto).
7) El programa verifica el formato de la respuesta obtenida, usando una funcin ESPECIFICADA EN
EL MANUAL DEL PROGRAMADOR.
8) El programa examina los valores devueltos en la respuesta, a fin de determinar si la llave est
presente y si la misma es vlida .
Bueno, eso es bsicamente, como trabaja la cosa. Lo que quiero destacar aqu, aparte de cmo interactan
EXE y DLL, es la parte de la funciones de encriptacin y desencriptacin. Tambin la password que se
necesita para usar las mismas, asi tambien como los arrays que utilizan las mismas para encriptar /
desencriptar.
El tema de la password y los arrays, lo veremos a continuacin y luego con Olly. Primero veremos en
profundidad las funciones.
Como les dije, el programa tiene 2 funciones: 1 de encriptacin (que llamaremos CifraString) y una de
desencriptacin (que llamaremos DescifraString). Y como puse en el punto 6, estas funciones no son
simtricas. Esto significa que la cadena encriptada con la primera, no se puede desencriptar con la
segunda.

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


De la misma forma, la DLL tambin posee 2 funciones: la de desencriptacin (que llamaremos
UNCifraString) y la de encriptacion (UNDescifraString).
Noten que el nombre que he utilizado, es idntico al de las funciones opuestas del EXE. Esto es as,
porque la funcin de desencriptacin de la DLL, desencripta lo encriptado por la funcin del EXE. Asimismo,
lo encriptado por la DLL, es desencriptado por la funcin de desencriptacin del EXE.
En una imagen, sera:

De esta forma, ya tenemos en claro cmo trabaja el mecanismo de comunicacin EXE-DLL.

Resolviendo la Encriptacin
Ahora, para poder emular la llave, debemos ver cmo trabajan las 4 funciones. Como les dije al principio, el
manual del usuario, nos provee de las 2 funciones que utiliza el EXE (CifraString y DesCrifraString). Luego

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


utilizando Ingeniera Inversa, vamos a obtener las 2 funciones de la DLL (UNCifraString y
UNDesCrifraString).
En el manual, las funciones estn definidas en Visual Basic 6. Veamos la funcin CifraString:

Bueno, como ven la funcin no es muy difcil. Vemosla detenidamente:


1) La funcin recibe 2 parmetros: buffer y password. buffer es la cadena de comando a encriptar y
password es la clave con la cual se encriptar la cadena. Normalmente, password se encuentra
definida a nivel global en la aplicacin, pues siempre se usa la misma para encriptar comandos.
2) Se inicializan 2 variables: cAnterior a 0 y bufEnc a (cadena vacia).
3) Vemos que la funcin tiene un bucle FOR principal, que va desde 0 a 199 (ese es el largo de la
cadena de comando). Internamente, tiene otro bucle FOR, que va desde 0 a 15 (ese es el largo de la
password). La password DEBE tener 16 caracteres.
4) El primer bucle comienza y obtiene en ctemp, el carcter de la cadena de comando que se
encuentra en la posicin indicada por i.

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


5) Si el carcter es menor que cero, entonces le suma 256. Esto, personalmente, lo veo ilgico, pues si
el carcter est en una cadena, NUNCA puede ser un valor negativo. Pero, bueno, asi esta definida
la funcin .
6) Luego, se realiza un XOR entre ctemp y el byte del array sBox1, ubicado en la posicion dada por
cAnterior. El resultado se guarda en ctemp. sBox1 es el primer array o matriz usado para
encriptar/desencriptar. El mismo array es utilizado tanto por la DLL como por el EXE.
7) Se inicia el segundo bucle FOR y la primera instruccin coloca en pw el carcter del parametro
password que se encuentra en la posicion indicada por k+1 (esto es asi, porque en VB, el primer
carcter de una cadena, est en la posicin 1, no 0).
8) Luego verifica si el valor ASCII ( ANSI) del carcter (pw) es impar (usando la funcin MOD, la cual
devuelve el RESTO de una divisin entre 2 nmeros).
a. Si el resto es 1, entonces es impar, por lo cual:
i.
Se realiza un XOR entre ctemp y el byte de sBox1, indicado por el byte de sBox2,
que se encuentra en la posicin indicada por pw. El resultado se guarda en ctemp.
ii.
Luego, el byte de sBox2 que se encuentra en la posicin indicada por ctemp, se
guarda en ctemp.
b. Si el resto es 0, entonces es par, por lo cual:
i.
Se realiza un XOR entre ctemp y el bute de sBox2, indicado por el byte de sBox1,
que se encuentra en la posicin indicada por pw. El resultado se guarda en ctemp.
ii.
Luego, el byte de sBox1 que se encuentra en la posicin indicada por ctemp, se
guarda en ctemp.
9) Con lo anterior, termina el bucle interior. A continuacin, se realiza un XOR entre ctemp y el byte de
sBox1, ubicado en la posicin dada por i.
10) Se establece cAnterior al valor de ctemp.
11) Se guarda en bufEnc el carcter representado por el valor de ctemp. Aqu termina el bucle FOR
principal.
12) Al terminar el bucle FOR principal, se guarda en el parametro buffer, la cadena bufEnc.
Como ven, la funcin de encriptacin NO es muy complicada. Lo que debemos notar aqu es la cantidad de
variables usadas y la forma en que se realiza la encriptacin.
Ahora, vamos a obtener la funcin de desencriptacin de la DLL: UNCifraString.
Usando nuestra querida Ingeniera Inversa, tenemos:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Bueno, debido a que el objetivo final es emular la llave, y, como la conexin entre el EXE y la llave es una
DLL, nuestro objetivo ser reemplazar dicha DLL.
Como no tengo mucha experiencia para hacer DLLs en C, la haremos en ASM (ms exactamente, en
MASM).
Vean qu sencillo es convertir cdigo VB en MASM:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

La conversin es casi directa usando las libreras de MASM (esto es para poder utilizar el .repeat y el
.if).
En el cdigo ASM, se ha omitido el parametro password, puesto que el mismo ha sido definido en la
seccion de datos de la DLL, como constante.
La funcin GetIndex se encarga de obtener el indice que ocupa un valor, dentro de un array. La misma est
definida asi:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Ac vale destacar, que los 2 vectores usados para encriptar / desencriptar (sBox1 y sBox2), estn
compuestos por bytes DISTINTOS. Por eso, la funcin retorna al encontrar el primer valor igual encontrado.
Noten que la funcin sirve tanto para encontrar un valor dentro de sBox1 como dentro de sBox2. (Por
supuesto, todo esto puede optimizarse, pero la f1aca es mayor ).
Ahora, veamos cmo est definida DesCifraSting y su opuesta en VB, UNDesCifraSting:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Y su conversin en ASM:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

As, de esta forma ya tenemos resuelta la parte de la encriptacin en la comunicacin EXE-DLL. Lo nico
que nos est faltando aqu, es el Parametro Password y los vectores sBox1 y sBox2. Para obtenerlos, nos
vamos a valer de Olly.

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Aqu quiero hacerles notar, que si bien el EXE tiene los vectores y la password, la DLL tambin deber
tenerlos. Esto es, por si las cosas se ponen complicadas con el EXE, pueden recurrir a la DLL.
Ahora, la DLL usa un truquito para que nos sea imposible poner un BP un HBP en la funcin que nos
interesa (HARDkey), por lo que vamos a tener que usar un procedimiento para poder hacer esto.
Al cargarse la DLL, el EntryPoint de la misma est en la RVA 31000h. Aqu si podemos poner un BP, pero lo
vamos a poner luego de que la misma haya terminado de modificar la imagen en memoria. Ustedes, pueden
ir traceando el EntryPoint para ir viendo cmo va trabajando la DLL.
Bueno, vamos a ir hasta el RVA 31764h (jmp eax) y vamos a ponerle un BP. Cuando Olly para, ya estamos
en condiciones de poder colocar un BP en la funcin HARDkey. Luego de colocar el BP y darle F9, Olly para
en el inicio de la funcin :

En la imagen, podemos ver que primero se llama a VirtualProtect. La direccin que se tratar ser (en este
caso) A35A00h. Recuerden que sta cambiar en sus mquinas.
Bien, si escrolan hacia abajo un poco, van a ver un CALL A35A00. Ah pondremos un BP, y le daremos F9.
Cuando Olly para, usamos F7 para entrar en la funcin:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Estando aqu, vamos a escrolar un poco hacia abajo. Especficamente, hasta llegar a A35BDAh (RVA
5BDAh).
Ah veremos un bucle:

En este bucle, la librera comienza a realizar la desencriptacin del comando. Vamos a ponerle un BP al
inicio y le daremos F9. Cuano Olly para, vamos a usar F7 para ir viendo las instrucciones.
Vemos, que en A35BE6h hay un MOV DL, BYTE PTR [ESP+ECX+51C].
Debido a que ECX vale 0 al inicio del bucle, lo que queda (ESP+51Ch) es la direccin de nuestro primer
vector: sBox1.
Parados en esa instruccin, hacemos click-derecho-Follow in dump-Memory Address.
En la ventana de dump tenemos:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Como ven, los valores estn guardados como WORD en la memoria de la DLL. Esto es, cada BYTE del
vector, ocupa 2 bytes en memoria, por lo cual, el segundo byte de cada item del vector, contiene el valor
00h.
Bueno, en la imagen estn seleccionados los 256 valores que componene sBox1. A estos valores los
seleccionamos en la ventana de dump y los guardaremos en el disco con click-derecho-Binary-Binary
Copy y pegando lo copiado al portapapeles en el Notepad o su editor de preferencia.
El segundo vector (sBox2) est referenciado a dos pasos (en la ventana de CPU) en A35BF7. De igual
forma que el anterior, debido a que ECX es 0, el vector comenzar en ESP+71Ch (Tambin, noten que
sBox2 est a continuacin de sBox1 en la memoria ).
Bueno, una vez guardados ambos vectores, slo nos falta descubrir la password usada. Esto es tan sencillo
como mirar los registros, pues EDI se encuentra apuntando a nuestra password: EXEkey++EXEkey++.
Ahora, si, ya tenemos lista la parte de la encriptacin de la comunicacin EXE-DLL.
Ya estamos en condiciones de analizar la comunicacin, a fin de poder crear nuestra DLL.

Resolviendo la cadena de Comandos


Bueno, aqu no hay secretos pues el manual del programador nos hace toda la tarea. (Es por esto que les
recomiendo nuevamente bajarse el archivo).
Como dijimos al principio, la cadena de comandos es un string de 200 caracteres. Debido a que se utiliza
como si fuera una API de windows, los valores retornados por la DLL (y la llave) sobreescribirn esta misma
cadena.

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Ahora, la cadena de comandos se puede partir en 2 partes: Subcadena de comando y Comando. La
Subcadena de comando es especial, pues se mantiene igual para todos los comandos que el EXE realice.
As tambin, la respuesta dada por la llave (DLL), contendr una Subcadena de comando como cabecera
del resultado del comando invocado.
Para verlo mejor, cito al manual del usuario :

Formato de la subcadena comando


Es el formato comn a todos los chequeos, este se encuentra como prembulo de la cadena enviada en cada comando.
La seccin salida describe el formato de la cadena respuesta de la llave que es comn a las respuestas de todos los
comandos.

Entrada - Formato

Detalle de los campos:


Caracteres Random:
Inicio: 0
Largo: 10
Valor: Cualquier cadena de 10 caracteres generados al azar.
Descripcin: En cada invocacin a la funcin HARDkey(...) se incluyen 10 caracteres al comienzo de la
cadena_parmetro generados aleatoriamente. Esta tcnica se utiliza para que todas las cadenas generadas se distingan
unas de otras aunque la informacin enviada sea la misma. Por otro lado, al descifrar la respuesta enviada por la librera
se comparan estos 10 caracteres con los enviados previamente, si son iguales tenemos la certeza de que la DLL de
HARDkey nos enva esta respuesta, en caso contrario puede ser enviada por un intruso. En este chequeo ayuda que los
algoritmos usados para cifrar y descifrar la cadena no son simtricos.
# Conexin:
Inicio: 11
Largo: 8
Valor: Numrico comprendido entre 00000000 y 99999999
Descripcin: Cuando se inicia la bsqueda de una llave electrnica y es localizada, la respuesta contiene un nmero de
conexin posteriormente usado para la comunicacin con la llave. Los comandos siguientes debern contener ese
"nmero de conexin" as la llave los identifica bajo una ruta previamente establecida. Establecer una conexin es
similar a abrir un canal de comunicacin entre la llave y la aplicacin, pueden existir distintos canales entre varias
aplicaciones y una llave. El uso del nmero de conexin es de vital importancia cuando se comparte una llave

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


HARDkey en red usando licencias para habilitar el uso de la aplicacin desde las terminales de la red. En este caso la
relacin que se establece entre una conexin es uno a uno con la cantidad de licencias disponibles en la llave.
Clave1:
Inicio: 20
Largo: 5
Valor: Numrico comprendido entre 00000 y 65535
Descripcin: Junto con la Clave 2 son valores establecidos por el usuario, requeridos para realizar operaciones sobre la
llave electrnica. Estos valores vienen de fbrica seteados en 0, es recomendable que se modifiquen cuando se utilizan
las llaves con valores de cinco dgitos, aumentando as la proteccin.
Clave2:
Inicio: 26
Largo: 5
Valor: Numrico comprendido entre 00000 y 65535.
Descripcin: Este es el valor asignado a la llave como Clave2. Este valor debe coincidir con el de la llave para poder
acceder a la misma.
Ejemplo:
Supongamos que tenemos una llave con clave1: 12345 clave2: 27508, para operar la subcadena_general debera ser
como sigue: "+_&%#$+!^! 00000000 12345 27508"

Salida Formato

Cuando retorna la llamada a la funcin HARDkey el formato de la subcadena_general se mantiene en todos los
comandos como sigue.
Detalle de los campos:
Caracteres Random:
Inicio: 0
Largo: 10
Valor: Cadena de 10 bytes.
Descripcin: Para evitar que la aplicacin sea engaada se utilizan estos caracteres generados aleatoriamente. Cuando se
realiza el llamado a la funcin HARDkey se envan calculando 10 caracteres al azar, los cuales tienen dos propsitos,

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


alterar el cifrado de la cadena, y validar la respuesta obtenida verificando que sea de la DLL HARDkey. Los algoritmos
se encuentran detallados en el directorio "\api\demos" de HARDKey para cada lenguaje en particular.
Conexin:
Inicio: 11
Largo: 8
Valor: Numrico comprendido entre 00000000 y 99999999
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es el nmero de conexin asignado a la aplicacin.
Este nmero debe ser utilizado en los sucesivos llamados a la funcin HARDkey.
Estado:
Inicio: 20
Largo: 5
Valor: Numrico comprendido entre 00000 y 00021
Descripcin: Al realizar la operacin sobre la llave cuando se invoca a la funcin HARDkey se pueden obtener distintos
resultados satisfactorios o no. Para diferenciarlos se implement el valor "Estado" en la respuesta. El contenido de este
campo indica el resultado obtenido al realizar la operacin. A continuacin se describen los valores vlidos:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

El nmero del parmetro "Estado" es el que primero se debe evaluar en toda respuesta de la llave, en base a este valor
determinamos si la operacin se realiz con xito y evaluamos el resto de la cadena.
Lote:
Inicio:26
Largo:4
Valor:Caracteres hexadecimales, entre 0000-FFFF
Descripcin:Cada llave HARDkey tiene un nmero nico de LOTE-SERIE que las identifica. El valor de este campo, si
l "Estado" es igual a 00000, es el nmero de lote de la llave HARDkey accedida.
Serie:
Inicio:31
Largo:5
Valor:Numrico comprendido entre 00000 y 65535.
Descripcin:El valor de este campo, si l "Estado" es igual a 00000, es el nmero de serie de la llave HARDkey
accedida.
Ejemplos:
La subcadena_general cuando retorna la llamada a la funcin HARDkey.NET si encuentra una llave con lote = 201A,
serie = 52639, conexin = 23456729, tiene el siguiente formato:
"########## 23456729 00000 201A-52639"
En caso de que no encuentre la llave nos retorna algo similar a:
"########## 23456729 00002 xxxxxxxxxxxxxxx"
Esto implica que si el estado es distinto de 00000 los dems campos no deben tenerse en cuenta.
Bueno, como ven el manual explica perfectamente todo. Por lo pronto, ya tenemos toda la informacin
necesaria para armar el esqueleto de nuestra DLL.

Repasemos qu debe realizar nuestra DLL para emular la llave:


1)
2)
3)
4)

Exportar la funcin HARDkey, la cual recibir la cadena de comando pasada por el EXE.
Desencriptar la cadena de comando
Analizar el comando y generar una respuesta
Escribir la respuesta en la cadena de comando y volver a encriptar.

Como ven, nuestra DLL va a ser MUY sencilla


Veamos la funcin exportada HARDkey ya terminada:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Como les dije, muy sencilla.


UNCifraString y UNDesCifraString ya las hemos definido. Lo cual nos deja slo con la funcin
procesarComando, la cual recibe la cadena de comando como parametro (ya desencriptada).
Bsicamente, la funcin deber:
1) Obtener el N de comando a procesar
2) Escribir la cadena de respuesta base en param.
3) Escribir la respuesta al comando ingresado.
Definimos la funcin procesarComando:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Bueno, aqu vemos que la funcin primero tiene una pequea seccin data, la cual se utiliza para poder
realizar un jmp DWORD PTR [procComTbl+eax*4]. En eax tendramos el n de comando.
Vemos que lo primero que hace la funcin, es recuperar el n de comando de la cadena. Utiliza la funcin
getComandoNum, la cual est definida as:

Ms adelante, veremos porqu la funcin est tomando el DWORD que comienza en el byte 20h (base
cero) de la cadena y lo transforma en nmero (DWORD), usando la funcin atodw (el resultado queda en
eax).
Seguido, la funcin usa un cmp para saber si el n de comando guardado en eax es mayor a 13d. Si lo es,
usa el ja para sacarnos de la funcin. Cabe destacar que si eax es 0, tambin sale la funcin.
Bueno, si van mirando el resto, vern que la funcin tiene definidos TODOS los n de comandos que tienen
este tipo de llaves. Pero, solamente estn implementados los que usa este EXE. Vean tambin que he
colocado comentarios para identificar qu comando es cada nmero.
Los comandos implementados son: Iniciar Conexin, Verificar Conexin, Finalizar Conexin y Leer Cadena
(el EXE tambin usa el comando 9: Configurar Modo Chequeo, pero veremos que no es necesario hacer
nada con este comando).
Debido a que la explicacin de cada comando es larga (al menos para este tutorial) vamos a ver que nos
dice el manual respecto al primer comando: Iniciar Conexin (La lectura y anlisis de los dems comandos,
quedar como tarea para el lector ).

Iniciar Conexin
Antes de realizar cualquier operacin sobre las llaves HARDkey debemos establecer una conexin, esto permite
verificar que est conectada en el puerto una llave electrnica con la configuracin establecida por el comando.
Este comando abre una conexin con la llave, chequea la presencia de la misma y retorna algunos parmetros
adicionales referentes a la versin de la librera y los drivers.
Es utilizado adems para manejar los usuarios en red, manejando licencias globales o por mdulo en forma automtica o
supervisada por el usuario.
En el campo "nmero de conexin" se enva el valor "00000000", cuando la llave responde manda el nmero asignado a
la conexin abierta, este debe usarse en cada comando enviado posteriormente hacia la llave.
La conexin entre la llave y la aplicacin permite manejar varios requerimientos hacia la llave de distintas aplicaciones.

Entrada Formato

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Detalle de los campos:


Comando:
Inicio: 32
Largo: 4
Valor: Numrico, 0000.
Descripcin: El nmero de comando le indica a la DLL la operacin a realizar. El valor cero establece que se quiere
iniciar conexin con la llave.
Nmero de mdulo:
Inicio: 37
Largo: 2
Valor: Numrico comprendido entre 00 y 32
Descripcin: Con una misma llave se pueden proteger varias aplicaciones manejando mdulos en la llave. El esquema
es que por aplicacin asigno un mdulo fsico de la llave que puede estar habilitado o no.
Entonces cuando se busca una llave con el comando Iniciar Conexin, se verifica que el mdulo indicado est activo.
Supongamos que desarrollamos un sistema de gestin, que consta de tres aplicaciones, sueldos, facturacin y
proveedores. De este sistema algunas empresas pueden no necesitar de todas las aplicaciones. En este caso es muy til
disear un esquema de proteccin modular, esto implica asignar en la llave mdulos a cada aplicacin, puede ser 02
para sueldos, 15 a facturacin y 25 a proveedores (Los nmeros de mdulo asignados a cada aplicacin son
seleccionados de modo que no sean consecutivos y sin patrn alguno. Esta medida se implementa para robustecer la
proteccin).
De esta forma al iniciar la conexin se enva el nmero de mdulo, entonces se habilita la conexin si este mdulo en la
llave conectada est activo. Entonces de acuerdo a las aplicaciones que requiera cada cliente en particular se habilitan o
no los distintos mdulos en la llave entregada.
El nmero de mdulo es un valor de 2 dgitos comprendido en el rango 00 32. El 00 se usa cuando se inicia conexin
y no se quiere chequear por un mdulo en particular. En el campo Tipo de manejo (notado como "m" en el esquema) se
setea el modo en que se realiza la conexin, para chequear mdulos debemos asignar el valor 03. Seguidamente se
explica en detalle este campo.
Tipo de manejo de usuarios en red:
Inicio: 40
Largo: 1
Valor: Numrico comprendido entre 0 y 3
Descripcin: Este campo determina la forma en la que se desean manejar las licencias.
- 0 (No limitar usuarios en red): En este modo la funcin no verifica ni modifica la cantidad de usuarios que estn
accediendo a la llave, simplemente realiza la lectura de la misma.

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


- 1 (Levantar usuario): En este modo la funcin realiza la consulta de la llave y si la misma est presente, aumenta en
uno la cantidad de usuarios de la licencia global, sin verificar el valor almacenado en la celda de mximo de licencias
globales.
- 2 (Automtico): En este modo la funcin controla que el mximo de licencias globales no haya sido alcanzado, si no lo
fue incrementa en uno la cantidad de usuarios y luego realiza el chequeo.
- 3 (Validacin de licencias por mdulos): En este modo la funcin controla que el mximo de licencias para el mdulo
descripto en el campo "Nmero de mdulo" no haya alcanzado el mximo permitido, si no lo fue incrementa el usuario
en uno y realiza el chequeo.
Ejemplos:
Como primer ejemplo asumamos que queremos iniciar una conexin con una llave cuyas claves son: clave1: 97865,
clave2: 27508. Primero veamos como sera si la llave se encuentra en el puerto paralelo de la PC donde se ejecuta la
aplicacin:
"########## 00000000 97865 27508 0000 00 0"
Si queremos levantar 1 licencia global:
"########## 00000000 97865 27508 0000 00 1"
Consumiento 1 licencia en el mdulo 14:
"########## 00000000 97865 27508 0000 14 3"

Salida Formato

Todos los campos de la subcadena_comando deben ser tenidos en cuenta slo si el campo "Estado" de esta misma es
'00000', en caso contrario implica que hubo errores, por lo que estos campos no contienen la informacin real.
Detalle de los campos:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Versin de la Dll:
Inicio: 37
Largo: 5
Valor: Cadena de la forma "v0.1b"
Descripcin: Esta campo contendr la versin de la librea HARDkey con que se interacta. El valor slo debe
considerarse como vlido si el estado es "00000".
Versin de los Drivers:
Inicio: 43
Largo: 5
Valor: Cadena de la forma "v0.1b" "USB01"
Descripcin: Este campo indica la versin de drivers HARDkey instalados en la mquina. Slo debe tenerse en cuenta
cuando el estado es 0. Si la llave es modelo USB la versin se expresa con la segunda cadena, el valor 01 indica que la
versin de firmware de la llave es la 0.1.
Versin del servidor de red:
Inicio: 49
Largo: 5
Valor: Cadena de la forma "v0.1b" o "?????"
Descripcin: Cuando se comparte en una mquina la llave electrnica en red, y la conexin se realiza mediante la red,
este campo contiene el la versin del servidor. En caso que la llave se encuentre en la mquina local ese campo
contendr los smbolos "?????". Esto slo es vlido si el estado es "00000".
Da de la fecha de vencimiento:
Inicio: 55
Largo: 2
Valor: Numrico entre 1 y 31
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es el da de la fecha de vencimiento almacenada en
la llave (celda 52).
Mes de la fecha de vencimiento:
Inicio: 58
Largo: 2
Valor: Numrico entre 1 y 12
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es el mes de la fecha de vencimiento almacenada
en la llave (celda 52).
Ao de la fecha de vencimiento:
Inicio: 61
Largo: 4
Valor: Numrico entre 0 y 9999
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es el ao de la fecha de vencimiento almacenada
en la llave (celda 53).

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Mdulos habilitados:
Inicio: 66
Largo: 32
Valor: Cadena formada por "0"(ceros) y/o "1"(unos)
Descripcin: Son 32 caracteres que representan el estado de los 32 mdulos en la llave. Los mdulos tienen dos estados
posibles, 1 que significa activo o 0 desactivado. Por ejemplo si la cadena comienza con 010001.... significa que el
mdulo 2 y 6 estn activos en la llave mientras que el 1,3,4 y 5 estn desactivados. Estos datos son vlidos si el Estado
es "00000".
Lmite de ejecuciones:
Inicio: 99
Largo: 5
Valor: Numrico entre 0 y 65535
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es el lmite de ejecuciones grabado en la llave.
Mximo de licencias globales:
Inicio: 105
Largo: 5
Valor: Numrico entre 0 y 65535
Descripcin: La llave HARDkey.NET adems de manejar licencias por mdulo permite proteger aplicaciones con un
esquema nico de licencias denominado "Licencias Globales". La razn por la que se implement esta metodologa es
nicamente la compatibilidad con los sistemas de proteccin anteriores. El uso de licencias globales como mtodo de
proteccin es similar a asignar un nmero de mdulo a la aplicacin.
Recomendamos utilizar licencias por mdulo en vez de licencias globales, lo que permite adaptar el sistema de
proteccin en caso de que crezca la aplicacin a proteger. Adems por la sencillez y las ventajas que tiene aplicar
proteccin modularizada.
Nmero de licencias de red en uso:
Inicio: 111
Largo: 5
Valor: Numrico entre 0 y 65535
Descripcin: El valor de este campo, si l "Estado" es igual a 00000, es la cantidad de licencias globales que estn
siendo utilizadas hasta el momento. Si el chequeo de la llave es local, este campo devuelve '00000'.
Ejemplos:
Al retornar de la llamada si no hubo problemas en el chequeo uno de los resultados posibles para una llave de lote =
201A, serie = 52639 es:
"########## 23456729 00000 201A-52639 v2.2a v2.0a ????? 12/05/2005 01000010000000000000000000000000
00000 00000 00000 ......".

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Esta cadena muestra que se encontr la llave colocada en la PC local porque en el campo "Versin del servidor de red"
se encuentra ?????.
Bien, si miran en la funcin procesarComando, vern que para resolver este primer comando, la funcin
llama a putRespuestaBase, luego a putRespuestaComando1 y finalmente, sale.
Como se imaginarn, putRespuestaBase, es la famosa cadena de subcomando de respuesta (la que es
comn a todas las respuestas que realice la DLL).
Veamos cmo est definida:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009


Bueno, si leyeron la parte de la subcadena de comando, vern que la funcin arma la cadena con los
valores necesarios: Nmero Random, Estado, Lote y Serie. Cabe recordar que Estado deber ser 00000, lo
cual indica que todo sali bien.
La funcin solveRandom se encarga de generar una cadena de 10 bytes aleatorios. La funcin est
definida as:

Veamos la funcin putRespuestaComando1:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Como ven, la funcin va colocando los valores 1 por 1 en la cadena de respuesta.


Bueno, hasta aqu hemos visto cmo trabaja la comunicacin del EXE y la DLL y cmo interpretar los
comandos enviados por el EXE a la DLL.
El cdigo fuente de la DLL (y la DLL compilada) estn adjuntos a este tutorial, con lo cual pueden armar
modificar la DLL como les parezca. Noten que el archivo .WAP, es el archivo de proyecto del IDE que uso
para MASM: WinASM. Como es de texto plano, pueden abrirlo con el Notepad y verlo. Entre otras cosas,
van a encontrar los parmetros que deben pasarle al compilador de MASM para generar la DLL.
Bien, asumiendo que ya tienen la DLL compilada, vamos a ver cmo funciona en nuestro EXE.
Para establecer un inicio, ejecutamos el EXE sin hacer ningn tipo de cambio. Nos encontramos con lo
siguiente:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Bien, como era de esperar .


Ahora, renombramos la DLL original hkey-w32.dll a hkey-w32.dll.original y copiamos nuestra pequea
DLL en la carpeta del EXE.
Si lo ejecutamos nuevamente, tenemos:

Je,je,je. El mensaje ya no sale . Como dice la ayuda del programa, ingresamos como Usuario:
DISCOVERY y como Contrasea: EASYSOFT. Le damos a Aceptar y:

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Slo para cercionarnos que todo est como se debe, vamos al Acerca de (Haciendo click en DiscoveryAyuda-Acerca de)

NOMBRE: EMULANDO HARDKEY.NET Fecha: 20-12-2009

Ah vemos los datos que est respondiendo nuestra DLL. Noten que el EXE toma el Nmero de Lote de la
llave, como Nmero de Serie.
Otra cosa que quiero destacarles: Al responder al comando 1 (Iniciar Conexin), en la parte de Mdulos
Habilitados devolvamos todos 1. Con esto indicamos que TODOS los mdulos que pueda tener el EXE,
estn habilitados. Si se ponen a jugar con estos 1, vern que las opciones que aparecen en el Acerca De
(Con controlador Fiscal, Conexin Marck y Habilitada para Terminal Server) van a ir cambiando. Por
ejemplo, si ponen en 0 el byte que se encuentra en la posicin 46h de la cadena, vern que Con
controlador Fiscal va a desaparecer (osea, esa opcin estar deshabilitada ).
Bueno, para terminar: La emulacin en s, no es complicada. Vemos que, como siempre, depender del
programador que implemente la proteccin. La mejor recomendacin que les puedo dar para este tipo de
llaves, es que lean el manual del programador. De ah sacarn todo lo necesario para entender a fondo el
mecanismo de trabajo entre el EXE y la DLL. Como prctica, pongan un BP en la funcin HARDkey de la
DLL que creamos y vean como trabaja. Fjense los comandos que pasa el EXE y bsquenlos en el manual,
a fin de saber qu debe responderse. Tengan en cuenta que hay comandos que requerirn la llave original,
por ej., el comando 5, lee una cadena de la llave. En este caso, debern buscar en el EXE qu se hace con
el valor devuelto , si no es posible determinarlo, hacer un inline para interceptar la respuesta de la llave y
guardarla en el disco. Despus todo es sencillo, pues ya sabemos cmo desencriptar esa respuesta y
podemos generar una nueva DLL, que devuelva el valor capturado .
Bueno, me despido como siempre agradeciendo al Maestro Ricardo Narvaja, y tambin a todos los que
integran CracksLatinos (en este caso en particular, a Solid y +NCR por el aliento que me han dado para
terminar este tutorial), puesto que sin los nimos que te dan y tutoriales que escriben, no podra haber
escrito yo ste.
Divirtanse mucho crackeando, que para eso estamos!!!!
MCKSys Argentina (mcksysargentina@yahoo.com.ar)