Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programa
Pagina de descarga
Pas origen software
Compilador
Proteccin
Objetivo
Herramientas
nivel
Cracker
justificacin
Ferretera 5.83
www.gdsistemas.com.ar
Argentina
Borland Delphi v 6.0 v 7.0
tElock v 0.98 segun rdgPacker v 0.6.5
Conseguir un serial valido y registrarlo
ollyDbg v 1.1, Cryptool v 1.4(www.cryptool.org), RdgPcker v
6.5, radsam, Vb 6, ide masm32
medio
Aestolent(Solo hice el tutorial todos los meritos a MCKSys
Argentina)
Me pareci un buen software bien protegido y algo nuevo en
proteccin, como para dejar asentado el mtodo.
Procedimiento:
I.-Anlisis compilador del programa
II.-Ejecucin de programa para ver limitantes o restricciones y forma de registro
III.-Ejecucin con Olly y posible solucin.
IV.-Determinacin de desemcriptacin de cdigo
V.-Haciendo Brute-Force para determinar el serial
Aestolent
II.-Ejecucin de programa y ver limitantes o
restricciones
Al correrlo nos manda una Nag de que nos quedan 99 usos del programa, adems tiene
la opcin de registrarlo, en el botn comprar.
Al parecer la limitante que tiene es el nmero de usos y que cada vez que cierro y abro
sin importar si entro o no al programa, me descuenta un uso, ahora nuestra intencin es
de registrarlo sin importar nada, as, que miremos que nos manda al dar click en
Registrarse y vemos
1592A616102
Aestolent
Y al dar click en OK, nos sale,
No es mensaje Box, en este caso detecto que la licencia o serial es invalido y trata de
enviar nuestros datos a la Web, y as obtener una licencia valida, por lo que si es seguro
que use este cdigo, y que dependiendo de la versin se usara un mtodo distinto para
generar la licencia a travs de este cdigo generado en mi maquina.
Puesto que al estar empacado lo mas seguro es que no corra, pero tratemos, carguemos
el programa ferreteria.exe y al momento de dar abrir nos dice esto
Aestolent
A ocurrido una excepcin, demos aceptar y despus Shift+f9, ojala y corra, y vemos,
Aestolent
Ahora por experiencia en los programas hechos en delphi es que he observado que los
delphi, cuando generan una box esta en un ciclo repetitivo, que hasta el momento de que
no se clickee un botn (aceptar o cancelar ) este ciclo seguir de manea infinita, ahora
para determinar este ciclo, procedemos de la siguiente manera: ya corriendo el
programa en la nag siguiente con el ollyDbg, damos F12(pausa) y despus traceamos
con varios F8, y pasar varios ret, hasta observar el ciclo, en este caso observaremos el
ciclo de la box de ingresar licencia.
Damos f12 (pausa), despus varios f8, y vemos que el ciclo en mi maquina esta aqu,
ciclo
Es de esperase que al dar click saldr de este ciclo, as que demos F9 (ejecutar) y
pongamos un Bp justo abajo del ciclo, as
Aestolent
Despus en la box damos aceptar, y para en este Bp, ahora la tcnica es de anotar la
direccin de las call de la cual va saliendo, y despus reiniciar el programa e ir a esas
direcciones y poner Bp o simplemente colocar Hbp, peo recuerden que es probable que
el packer detecte los Bp o Hbp, y cerrar el programa, pero bien hagmoslo:
Dando Ctrl +f9, y mas rpido llegar al ret
Direccin de la 1ra call que sale 004588F6
Direccin de la 2da call que sale 00CFDE5C
Al tratar de buscar una 3ra call el programa ya lanza la venta de navegador, vista
anteriormente, puesto que ya determino que la licencia (serial) no es valida.,
Bien reiniciemos el programa y sin ningn Bp puesto corremos el programa
nuevamente, llegamos hasta esta caja
Antes de dar click de ingresar licencia, colocamos los Bp y esperemos que pare en
alguno,
Ahora damos ingresar Licencia y vemos en olly, que paro justo ah en la direccin
00CFDE5C,
Aestolent
Entramos con f7 en esta call y veamos que realiza antes de llegar a esta direccin, al
parecer realiza una serie de operaciones lo mas seguro es que esta determinando el serial
que me va a mostrar en la box (1592A616502), y ya en si aparece la box como se
predijo en esa direccin (004588f6), por lo que nos queda solo seguir el proceso de
aparicin de la ventana Web, poniendo Bp justo a bajo de la direccin en la cual
apareci la box,
Ahora ingresar un serial cualquiera y dar OK, al dar click en OK vemos que
para en este ltimo Bp puesto, y no nos queda ms que tracear y observar que hace con
este serial falso,
Al tracear hasta el ret de esta rutina no se observa nada interesante, por lo que pasamos
el ret con f7, y ya salimos justo debajo de donde paro por primera vez (00cfde5c)
Por lo que se deduce que en esta call aparece la box y tambin checa si se dio OK o
cancelar, ya que el valor de Eax muestra 1, por lo tanto no brincara puesto que se dio
OK y en consecuencia el proceso de registro esta justo debajo de esta salto hacia abajo.
(Comprobado al dar cancelar a la box si salta despus hacer el Test).
Aestolent
Ahora que ya estamos en la zona caliente, del registro no nos queda ms que tracear y
observar en donde aparece la ventana de navegador y en si observar en donde empieza
el chequeo de registro.
Empecemos pues con el traceo, y observamos que en esta call de direccin 00CFE079
algo cambio en el cdigo de olly al pasarlo con f8,
Si vemos Antes de dar f8 se ve as
Aestolent
Despus de dar f8
Vemos que aparecieron unas call nuevas, pero porque?, bien sigamos, dando f8, y al
llegar aqu y dar f8
Aestolent
Nos manda directo a
Aestolent
Empieza a realizar una serie de operaciones y que utiliza mucho la zona de (EBP-3C),
sigmoslo en el dump vemos, (EBP=0012FBA8), entonces Ebp-3c=0012FB6C
Si damos f8, pasara el valor de Ebx a esta zona como podemos ver en los registros
Ebx=000012A,
Aestolent
Hasta llegar a esta direccin vemos que aisl la parte inicial y final de mi serial falso, y
ahora les va a aplicar la operacin Xor, si se dan cuenta Eax=11 y Ebx=88, como
recuerdan mi serial introducido es 1122334455667788, as que demos F8, y vemos que
el valor resultado lo pone en Ebx
Vale 99
Al dump que se encuentra en EBP-3C (aun vale 85), le va a restar Ebx=99, y que al dar
f8 esta cantidad en el dump ahora vale
Aestolent
Vale 00 00 00 50, bien sigamos, al seguir traceando nos damos cuenta que
En esta direccin 00CFE02F, mueve la cantidad del dump al valor de registro de Edx y
que vale 50, luego al seguir traceando nos damos cuenta que en esta ltima call, algo
ocurre,
Aestolent
Aestolent
Una vez llegando a la direccin de la call misteriosa que se encuentra en 00CFE079 y
antes de dar F8, copiamos la parte encriptada, as:
Aestolent
Una vez hecho esto, damos Pegar, como sigue,
Y realizamos un anlisis,
Aestolent
Un clave, podra ser el resultado de esta ecuacin resultado del anlisis a detalle, por lo
que probamos y sustituimos este valor en la ecuacin
85-(Num 1 Xor Num 2)+64=CD,
Recodemos que esta herramienta es usada para encriptar y a la inversa tambin y que
adems, realiza anlisis de cdigo encriptados y posibles claves, que en este caso es la
que se uso, con la opcin Xor, ya que es la que usa para determinar si es igual o no
ciertos valores en este programa gds
Despejando la ecuacin para determinar el inicio y fin del serial:
As:
ecuacin
-(Num 1 Xor Num 2)=CD-85-64
(multiplicamos por -1)
(Num 1 Xor Num 2)= -CD+85+64
= - CD + E9
= 1C
As suponiendo que fuera cierta, esta ecuacin, damos valores a un serial y que inicio y
fin del mismo al aplicarle la operacin xor, el resultado sea igual a 1C,
78 xor 1C = 64
As el inicio es 78 y termino es 64, ya que aplicamos la operacin xor entre ambos el
valor ser 1C,
Nuestro serial queda como sigue:
781122334455667764 (ponemos un largo cualquiera es de 18 dgitos)
Ahora reiniciamos con olly y llegamos hasta la zona caliente, e ingresamos nuestro
serial, y traceemos hasta llegar a la call que al parecer es la encargada de desenciptar
parte del programa que checar si es valido el serial:
Al llegar a la call y dar F8, vemos que si efectivamente, resulto cierto nuestro anlisis:
Aestolent
Y ha desemcriptado esta parte del programa y listo para empezar con el anlisis del
serial, y registrarlo, en consecuencia al tracear nos damos cuenta que
No debe de brincar
Otra call despus una comparacin y despus hay una comprobacin de cierto o
falso, vemos, y que si nos damos cuenta que comprobara que si el valor del dump de
[ESP], es igual a 9C5B, as que entremos, haber que hay ah,
Aestolent
Aestolent
Vemoslo arrancamos el programa e introducimos una licencia cualquiera yo
tomare 781592A61618976564 y vemos que solo mueve hasta el munero 65 es decir
solo toma 16 caracteres, mueve tambin el valor resultado del xor de los dos extremos
de mi licencia(1C)
Mas adelante ya dentro de la call que vemos que mueve este valor y vemos en el dump
que es, pues seguro que lo a usar para almacenar informacin o tomar valores para con
ellos hacer la rutina de chequeo de licencia, tomamos direccin del datos anteriores
Pues bien al parecer es todo lo que hay que tomar datos de los que hace uso, pero
seguramente hay un call antes de arrancar el programa que checa esta parte del
programa y determinar si esta registrado, por lo que hagamos search alls calls, e
introducimos la call 007D6CFC y vemos
Aestolent
As que reiniciamos y llegamos al oep mediante el uso del mtodo de las excepciones,
ponemos Bp en estas direcciones de estas call, y para primero en 007D6F67,
Y que usa para chequear la licencia puesto que lo mueve a de EAX a [ESP], y [ESP]
Es usado aqui
Aestolent
pasamos esta call y llegamos al ret , salimos y vemos arriba, algo que dice registro
exitoso, pero nos damos cuenta que la comparacin al salir de la call no es la
comparacin con el num 9C5B, sigamos damos F9, y llegamos hasta la call de
07D6EBF, la pasamos y vemos arriba, un valor que al parecer es una fecha que toma
como referencia,
En fin que al salir de la call miro en el sstack y veo que ha aparecido un valor que es
15200605
1592A616
En consecuencia checo que antes de esta call esta una llamada al registro y toma el
valor de la bios en mi maquina que vale 05/15/06
Pero como lo pide en
formato ddyyyymm, resulta 15200605, en fin que multiplicado este valor por el num 25
y pasamos el resultado a valor hexagesimal resulta 16A69215 valor que esta invertido
en la stack, y resulta que este valor me muestra en la box de registro y que usara
seguramente para el registro de cada maquina en si, y que para hacer el keyGen ser
necesario hacer una llamada a este registro y tomar este valor y transformarlo y as
obtener una licencia valida para cada maquina.(yo tomare el de mi maquina)
Analizando ms el cdigo antes de esta 2da call vemos que mueve estos valores
Aestolent
Que en este caso tambin usara para checar si esta registrado o no el programa, as pues
llegamos hasta el pop esi y vemos en el dump que ya paso estos valores a esta direccin
Bien entramos a la call para verificar si estamos o no registrados, y vemos que mueve
valores cero puesto que no hay ningn valor dentro en fin si corremos el programa y
llegamos a la nag vemos
Asi que como datos necesitamos la fecha de la bios, necesitamos los valores que estan
en el dump los de 00D73484, los valores del offset que esta en el dump 007d59FAC
Es todo lo que hay que hacer, y nada mas se creara una dll importante en la cual se hara
el llamado para hacer el brute force, y obtener la licencia valida y que cumpla con la
condicion
Cmp Word ptr SS:[esp], 9c5b
Sete al
Y obviamente que cumpla con la ecuacion, asi pues ponder en orden el cuerpo del
keygen
Aestolent
1ro hacemos la llamada a la dll
Antes creamos una form
De la siguiente manera
Text1
Text3
Command3
Text2
Command1
bGenerar
Command2
Luego copio o escribo el codigo que me da la nag de registro en text1, y al dar clic en boton bGenerar
Resulta
Aestolent
Private Sub bGenerar_Click()
Dim Serial0 As String
Dim SerialN As String
Dim b As Byte
Dim I As Long
Err.Clear
On Error GoTo ErrorDLL
Codigo = Trim(Text1.Text)
ValorFechaBIOS = Text3.Text 'mueve a mi fecha bios 15200605 por 25
If Text1.Text = "" Then
MsgBox "falta introduzca codigo", vbCritical + vbOKOnly, "Lo siento"
End If
La funcin HexaByte
Aestolent
Otro commandButton en evento clic, para ingresar la fecha bios, automticamente
Private Sub Command3_Click()
Dim MiObjeto As Object
'Creamos el objeto
Set MiObjeto = CreateObject("Wscript.Shell")
'Lo usamos, en este caso leemos una clave y mostramos el valor
MsgBox MiObjeto.regRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\SYSTEMBiosDate")
Text3.Text = MiObjeto.regRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\SYSTEMBiosDate")
'Eliminamos la variable
Set MiObjeto = Nothing
End Sub
Bien la parte importante del KeyGen esta en el botn bGenerar, que hace llamadas a las
distintas funciones.
Asi pues compilamos y guardamos el exe.
Ahora haciendo uso de Radasm, crearemos una dll en la cual meteremos los valores que
se lleva el programa de gds para la determinacin de la licencia valida
1.- la FechaBios
2.- valor que se encuntra en el dump de 00D73484
3.- Los valores en el dump de 007D59FAC
As pues quedan el archivo asm y def, como sigue, no lo explicare como funciona.
Fererteria.Asm
.386
.MODEL flat,stdcall
OPTION CASEMAP:NONE
Include windows.inc
Include user32.inc
Include kernel32.inc
IncludeLib user32.lib
IncludeLib kernel32.lib
.DATA
; Ferreteria direccion 007D59FAC
tabla1_0
db 00h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 01h, 00h, 00h,
00h, 00h, 00h, 00h, 00h
db 02h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 00h, 00h, 00h,
00h, 01h, 00h, 00h, 00h
Aestolent
db 00h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 03h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 03h, 00h, 00h,
00h, 01h, 00h, 00h, 00h
db 096h, 079h, 069h, 039h, 051h, 003h, 062h, 0F5h, 088h, 083h, 0A5h, 002h, 02Bh, 048h, 06Fh, 0DCh
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
ret
DllEntry Endp
Proc0 proc matcodigo:DWORD, fechaBIOS:DWORD
add esp, -8
mov eax, offset tabla2_0
mov dword ptr [eax], 039697996h
mov ecx, fechaBIOS
xor dword ptr [eax], ecx
inicio0:
mov edx, matcodigo
mov ecx,dword ptr ds:[edx]
mov dword ptr ss:[esp],ecx
mov ecx,dword ptr ds:[edx+4]
mov dword ptr ss:[esp+4],ecx
mov edx,esp
xor ecx,ecx
call Proc0_calcula
;llama a rutina de comparacion de serial
cmp word ptr ss:[esp],09c5bh
jne seguir0
mov eax, dword ptr [esp+4]
and eax, 02h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 04h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 020h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 040h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 080h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 0100h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 0200h
jz seguir0
mov eax, dword ptr [esp+4]
and eax, 0400h
jnz fin0
seguir0:
mov eax, matcodigo
inc byte ptr[eax+7]
cmp byte ptr[eax+7], 0FFh
jne vuelta0
mov byte ptr[eax+7], 0h
inc byte ptr[eax+6]
cmp byte ptr[eax+6], 0FFh
jne vuelta0
mov byte ptr[eax+6], 0h
inc byte ptr[eax+5]
cmp byte ptr[eax+5], 0FFh
jne vuelta0
mov byte ptr[eax+5], 0h
inc byte ptr[eax+4]
cmp byte ptr[eax+4], 0FFh
jne vuelta0
mov byte ptr[eax+4], 0h
inc byte ptr[eax+3]
cmp byte ptr[eax+3], 0FFh
jne vuelta0
mov byte ptr[eax+3], 0h
inc byte ptr[eax+2]
cmp byte ptr[eax+2], 0FFh
jne vuelta0
mov byte ptr[eax+2], 0h
inc byte ptr[eax+1]
cmp byte ptr[eax+1], 0FFh
jne vuelta0
mov byte ptr[eax+1], 0h
Aestolent
inc byte ptr[eax]
cmp byte ptr[eax], 0FFh
jne vuelta0
jmp fin20
vuelta0:
mov eax, offset tabla2_0
jmp inicio0
fin20:
xor eax, eax
jmp salida0
fin0:
mov al, 1
salida0:
add esp, 8
ret
Proc0 endp
Proc0_calcula proc
push ebx
push esi
push edi
add esp,-018h
mov byte ptr ss:[esp+8],cl
mov dword ptr ss:[esp+4],edx
mov dword ptr ss:[esp],eax
mov eax,dword ptr ss:[esp+4]
mov eax,dword ptr ds:[eax]
mov dword ptr ss:[esp+0ch],eax
mov eax,dword ptr ss:[esp+4]
mov eax,dword ptr ds:[eax+4]
mov dword ptr ss:[esp+010h],eax
mov dword ptr ss:[esp+014h],4
mov esi,offset tabla1_0 ;0d82fach
@Ferreter_008035f70:
mov edx,dword ptr ss:[esp+0ch]
xor eax,eax
mov al,byte ptr ss:[esp+8]
mov ebx,eax
add ebx,ebx
lea ebx,dword ptr ds:[ebx+ebx*2]
mov eax,dword ptr ds:[esi+ebx*8]
mov ecx,dword ptr ss:[esp]
mov ecx,dword ptr ds:[ecx+eax*4]
mov eax,dword ptr ds:[esi+ebx*8+4]
mov edi,dword ptr ss:[esp]
mov eax,dword ptr ds:[edi+eax*4]
mov ebx,dword ptr ds:[esi+ebx*8+8]
mov edi,dword ptr ss:[esp]
mov ebx,dword ptr ds:[edi+ebx*4]
add edx,ebx
add ebx,edx
mov edi,edx
shr edi,7
xor edx,edi
add ecx,edx
add edx,ecx
mov edi,ecx
shl edi,0dh
xor ecx,edi
add eax,ecx
add ecx,eax
mov edi,eax
shr edi,011h
xor eax,edi
add ebx,eax
add eax,ebx
mov edi,ebx
shl edi,9
xor ebx,edi
add edx,ebx
add ebx,edx
mov edi,edx
shr edi,3
xor edx,edi
add ecx,edx
mov edx,ecx
shl edx,7
xor ecx,edx
add eax,ecx
mov edx,ebx
shr edx,0fh
xor eax,edx
add ebx,eax
mov eax,ebx
shl eax,0bh
xor ebx,eax
Aestolent
mov eax,dword ptr ss:[esp+010h]
xor eax,ebx
mov edx,dword ptr ss:[esp+0ch]
mov dword ptr ss:[esp+010h],edx
mov dword ptr ss:[esp+0ch],eax
add esi,0ch
dec dword ptr ss:[esp+014h]
jnz @Ferreter_008035f70
mov eax,dword ptr ss:[esp+4]
mov edx,dword ptr ss:[esp+010h]
mov dword ptr ds:[eax],edx
mov eax,dword ptr ss:[esp+4]
mov edx,dword ptr ss:[esp+0ch]
mov dword ptr ds:[eax+4],edx
add esp,018h
pop edi
pop esi
pop ebx
Ret
Proc0_calcula endp
End DllEntry
Y el archivo Ferretera.def
Library skeleton
EXPORTS
Proc0
Damos assemble y rebuild , y ya esta en una carpeta copiamos el exe y la dll, corremos
y vemos , tipeemos la fecha bios: "C:MI
PC\HK_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\SYSTEMBiosDate",
Aestolent
Conclusin:
En este caso se hizo con ayuda de de herramientas como lo es cryptool, radsam y visual
Basic. En fin un poco largo lo del cdigo para realizar el programa, pero en fin realizado
por McksysArgentina, y yo me tome el tiempo para realizar este tute, pues me pareci
interesante este mtodo para registrar este programa.
Hay que leerse algunos tutes de creacin de Keygen en Vb y Compilar programas en
Radasm, etc. Para entender bien lo que hace la Dll
Como comentario adicional es que las textbox de fecha bios se puede evitar y los
commandbuton de cargar y fecha bios tambin se pueden evitar, se hizo con la finalidad
de observar que valores toma y los transforma, y como es que si usa el cdigo de
registro que manda la nag,, tambin de tomar valores aleatorios en los dos extremos de
la licencia aqu, en fin es todo.
Saludos a la lista