TRUQUITOS VARIOS
(LECCION CUARENTA Y UNO)
El programa de hoy se llama PC DATA FINDER 5.5, y sirve para buscar datos y muchas
otras cosas dentro de una PC. Se baja de
http://www.silverlaketech.com/PCDFmain.asp
y es un programita que tiene algunas cositas para despistar aunque como veremos se puede
crackear, las trabas no son muy grandes pero si lo suficientes para complicar un poco la
vida.
Abrimos el ejecutable con el Wdasm y carga bien, vemos entre las cadenas de texto
(STRINGS REFERENCES) que dice por ahí BORLAND, DEPLHI, etc, lo que significa
que esta escrito en DELPHI.
Abrimos el programa y vamos a ABOUT y nos aparece la opción para registrarnos
ponemos una clave falsa y cualquier nombre y cuando le damos a REGISTER, nos sale
INVALID REGISTRATION CODE, bueno probamos con BPX MESSAGEBOX, BPX
HMEMCPY (increíble que no pare en el SOFTICE con este), y varios mas y no entra en el
SOFTICE y nos sale el funesto cartelito.
Dicho cartelito no aparece entre las STRINGS REFERENCES.
Probamos un BPX que suele servir bastante en DELPHI que es BPX DRAWTEXTA y ahí
si por lo menos para en el SOFTICE y con F12 volvemos al ejecutable, aunque en cualquier
lugar, borramos con BC*, y observamos algo raro.
En el SOFTICE las posiciones de memoria cuando estamos en el ejecutable son valores
tipo 46eca7, en cambio en el WDASM son valores tipo 7ec18 muy diferentes, hmmm.
Que pasa aquí.
Vayamos al WDASM y veamos el ENTRY POINT, vamos a GOTO - GOTO PROGRAM
ENTRY POINT y eso nos lleva aquí
//******************** Program Entry Point ********
:0009A018 55
push ebp
:0009A019 8BEC
mov ebp, esp
:0009A01B 83C4EC
add esp, FFFFFFEC
a 9A018 seria en ENTRY POINT según el WDASM.
Ahora tratemos de cargar el programa desde el SYMBOL LOADER del Softice para que
pare cuando arranque en el mismo ENTRY POINT, y vemos que allí nos dice 48a018 en
realidad marca 48a017 pero ese valor es 00 y el siguiente es el 55 que corresponde a push
ebp.
O sea que 9a018 del WDASM corresponde a 48a018 del SOFTICE y porque ocurre esto,
debe ser si miramos el ejecutable con el PEEDITOR vemos que la image base es 10000, y
ya que no esta comprimido ya que cargo directamente en el WDASM con sus STRINGS
REFERENCES y todo, podemos suponer que este numero esta cambiado para despistar, o
sea que si restamos 9a018 -10000 obtendríamos el offset que seria 8a018 y si allí le
sumamos la image base que generalmente se utiliza que es 400000 seria
400000 + 8a018 = 48a018 que es el valor que sale en el softice.
O sea que hallamos una formulita para pasar los valores del WDASM al Softice en este
caso, seria la siguiente al valor del WDASM restarle 10000 y sumarle luego 400000, para
hacerlo en un solo paso le podemos sumar al valor de WDASM 3f0000 y listo ya que en
hexa eso equivale a hacer toda esa operación en una sola.
9a018 + 3f0000 = 48a018
WDASM + 3f0000= Softice
Con esa formulita nos ayudaremos un poco. Bueno dado que no tenemos ganas de dar
muchas vueltas y como esta hecho en DELPHI usaremos el DEDE, para eso tenemos la
versión 2.50 que es la ultima y completa, tratamos de cargarlo con el dede y puum, error de
no se que y se cierra el dede, ufff.
Otro truquito, pero para algo este cracker guarda todo, probaremos con una versión vieja
del dede la 2.34 que le faltan muchas utilidades pero nos servirá.
Cargamos desde este DEDE y carga perfectamente.
Vamos a procedures y vemos REGISTRATION y si hacemos click allí a la derecha en
EVENTS nos aparece OKBTNCLICK, y dado que cuando ingresas la clave apretas un
botón que dice OK, probemos con esto.
Si hacemos click derecho encima de OKBTNCLICK, y vamos a Disassemble nos aparece
0007F0F4
0007F0F5
0007F0F7
0007F0FD
0007F0FE
0007F100
0007F103
0007F105
0007F107
55
8BEC
81C4FCFEFFFF
53
33C9
894DFC
8BD8
33C0
55
push ebp
mov ebp, esp
add esp, $FFFFFEFC
push ebx
xor ecx, ecx
mov [ebp-$04], ecx
mov ebx, eax
xor eax, eax
push ebp
O sea que haciendo la conversión para el SOFTICE seria
7f0f4 + 3f0000 = 46f0f4
Pondremos un BPX allí en 46f0f4
podemos poner primero un BPX DRAWTEXTA y cuando vuelve al ejecutable poner el
BPX 46f0f4 allí.
Ahora vemos que cuando ingresamos un nombre y una clave, para el softice en
46f0f4 push ebp
bueno a partir de allí podemos hacer F10 hasta que aparezca el cartelito
INVALID REGISTRATION CODE
Esto ocurre en 46f1ff
CALL 45f3ff
Un poquito antes hay un CALL, un test al, al y un salto que puede evitar este cartelito.
46f1d3
call 46ebd0
test al, al
jnz 46f21f
si a este salto lo invertimos y cuando llegamos allí con f10 ponemos
r eip=46f21f
vemos que nos dice que estamos registrados, pero al volver a arrancar el programa, vuelve
a arrancar desregistrado.
se ve que realiza la comprobación en otra parte cuando comienza, esto lo vemos en el
WDASM cuando entramos en ese CALL que dice que también es llamado desde otra parte
del programa
esto se ve en el WDASM
* Referenced by a CALL at Addresses:
|:0007F070 , :0007F1D3
|
:0007EBD0 55
push ebp
:0007EBD1 8BEC
mov ebp, esp
:0007EBD3 83C4F8
add esp, FFFFFFF8
:0007EBD6 53
push ebx
:0007EBD7 33C9
xor ecx, ecx
allí dice que viene de 7fd13 que era donde estábamos y de otro lugar que es 7f070, todo
esto en valores WDASM sumar 3f0000 para obtener el valor en el SOFTICE.
7f070 + 3f0000 = 460f70
allí también hay una llamada al CALL un test al, al y un salto condicional pero si ponemos
un BPX allí y una vez que arranca el programa invertimos el salto, arranca desregistrado,
hmmmm.
Entonces el problema debe estar dentro del CALL miremos dentro
ESTO MUESTRA EL WDASM SUMAR 3f0000 para obtener los valores para el
SOFTICE.
Esto encontramos un poco mas abajo dentro del CALL
:0007EC15 83F80B
:0007EC18 0F858B000000
cmp eax, 0000000B
jne 0007ECA9
parece ser una comparación de la cantidad de cifras ya que 0b en hexa es 11, y podría ser
11 cifras, probemos poniendo un BPX allí y cuando pare veremos que en EAX esta la
cantidad de cifras que pusimos, o sea que la clave debería tener 11 cifras, pero también
sabemos que si no tiene 11 cifras va a 7eca9 que es que te manda al cesto de basura ya que.
:0007ECA9 33C0
:0007ECAB 5A
:0007ECAC 59
:0007ECAD 59
:0007ECAE 648910
:0007ECB1 68CBEC0700
xor eax, eax
pop edx
pop ecx
pop ecx
mov dword ptr fs:[eax], edx
push 0007ECCB
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0007ECC9(U)
|
:0007ECB6 8D45F8
lea eax, dword ptr [ebp-08]
:0007ECB9 BA02000000
mov edx, 00000002
:0007ECBE E86D4EF9FF
call 00013B30
:0007ECC3 C3
ret
alli hace EAX = 0 en el XOR EAX, EAX y llega al RET siendo EAX=0 y luego en TEST
al, al como al es igual a cero no te registra.
Un par de sentencias mas arriba de 7eca9 vemos que sale de muchas comparaciones y hace
BL = 1
deberíamos probar que pasa si salteamos desde donde comprueba las cifras a donde hace
BL=1 para ver si registra.
:0007EC15 83F80B
:0007EC18 0F858B000000
cmp eax, 0000000B
jne 0007ECA9
Reemplazamos jne 7eca9 por jmp 7eca7 y ponemos un BPX en ese salto 7ec18 para que
pare también allí cuando arranca el programa, y vemos que poniendo un JMP 7eca7 nos
registra y cuando arranca el programa para allí dos veces y si hacemos también allí JMP
7eca7 arranca registrado.
O sea que lo único que hay que hacer para crackearlo es reemplazar el jne 0007ECA9 por
jmp 7ECA7 Y LISTO HACE BL=1 Y LUEGO PASA EL 1 A EAX, Y TE REGISTRA
PERFECTAMENTE.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
OTRO PROGRAMA DE 16 BITS
(LECCION CUARNTA Y DOS
SE llama MEGAPAK 8.1.2 Multiempresa y esta hecho en 16 bits, se baja de:
http://148.233.25.146/sisteval.html#megapaqw
Aparentemente sirve para Facturación, compras ventas y esas cositas que hacen las
empresas, jua.
Como ya saben por las lecciones anteriores, le huyo bastante a estos programas, pero
bueno, era para un amigo, y bueno lo hicimos.
Tratamos primero de encontrar la clave, la cual esta bastante encriptada, para el que quiere
practicar con claves encriptadas y la quiere hallar, le doy una ayuda transcripta de los mails
que nos mandamos en la lista crackslatinos sobre el tema, por supuesto como yo encontre la
forma de crackearlo sin tener la clave este camino quedo inconcluso, para el que lo quiera
investigar le transcribo los mails, para el que quiere saber como crackearlo, saltee esto y
siga mas abajo en donde esta el titulo COMO CRACKEARLO.
MAILS SOBRE LA CLAVE ENCRIPTADA
pones la clave falsa
BPX HMEMCPY
vas con F10 hasta REPZ MOVSB
allí haces
d es:di
me sale la clave falsa a mi (EN MI MAQUINA EN LA TUYA PUEDE VARIAR)
en
3677:354c
hago
PAGE 3677:354c
y me sale el resultado
LINEAR
811130cc
si hago d 0030:811130cc
me aparece la clave falsa donde la guardo
pongo un BPR allí en ese rango
BPR 0030:811130cc 0030:811130dc rw
borro el BPX HMEMCPY con BC00
y le doy a X para que corra el programa
para la primera vez que toca la clave en
015f:a9f5 Repz scasb
que se usa para ver cuantas cifras tiene
seguís con F10 hasta el RET y allí en EAX las dos últimas cifras son la
cantidad de cifras de tu clave falsa
hay que ver si la compara con algo
si compara AX con cero así que aquí no pasa nada le doy con X de nuevo
para en 0eff:5400
compara la primera cifra con cero
sigo con X
compara en 0eff:53e8
compara con 20 (espacio)
este ciclo se repite cifra por cifra
una vez que sale de allí
para en
015f:a9f5 REPNZ SCASB
cuenta las cifras igual que antes al salir del RET
en 0eff:0dd1
Compara la cantidad de cifras con 1a o sea 26 y parece que si no es 26 te tira al tacho por lo
que hay que poner 26 cifras de la clave para seguir a partir de aquí. Luego en 0eff:5370 un
poco más adelante empiezan comparaciones con valores fijos.
Bueno este es un programa que encripta la clave, por lo cual hay que seguirlo bastante, y
tener en cuenta cada lugar que guarda y cada operación que hace, y lleva su tiempo. Como
ya te dije tiene que tener la clave 26 cifras según lo que se ve en la comparación que te
mencione en el mail anterior.
Otra cosa que hay que ver cuando pones un BPR en tu clave falsa es que cuando el
programa toma una cifra y la coloca en EAX , en este caso AX o cualquier otro de esos,
además de verificar las comparaciones y adonde lo guarda y allí volver a poner otro BPR,
también hay que fijarse que casi siempre estos programas que comparan cifra por cifra,
guardan con alguna sentencia tipo PUSH EAX o PUSH AX, (SIEMPRE QUE EN AX este
el valor de alguna de tus cifras de la clave falsa)
De esta forma lo guarda en el STACK y mas adelante lo recupera de allí, por lo que si en
este caso mi clave falsa la primera cifra es 9 , o sea que en hexa es 39, y lo guarda en AX, si
el programa hace PUSH AX, lo esta guardando en el STACK y lo puede recuperar mas
adelante, en este caso lo que hay que hacer, es poner un BPR en el lugar que lo guarda cosa
de que cuando lo quiera volver a leer pare el SOFTICE allí en 10df:51b2 PUSH AX (puede
variar la primera parte o sea 10df según la maquina) en AX esta 39 que es el 9 de mi
primera cifra y donde lo guarda cuando hace PUSH EAX, hay que fijarse en registro ESP
que es el puntero del STACK ese indica donde se guarda.
En mi caso es 10df:5370 pongo un BPR allí, conviene hacer el mismo procedimiento que
hicimos cuando paramos en el HMEMCPY que te explique en el mail anterior o sea
PAGE 10df:5370
LINEAR
xxxxxxxxxx
D 0030::xxxxxxxxx
y si allí aparece el 39
hacer
BPR 0030:xxxxxxxxx 0030:xxxxxxxy rw
para que abarque el valor y pare el SOFTICE cuando lo lea de nuevo.
En este programa es este caso, lo guarda allí a la cifra
y cuando para el SOFTICE que la vuelve a leer sigue trabajando con ella,
esta es una forma de esconder la búsqueda de la clave y despista a la
mayoría de los novatos, es muy importante saber esto y si ves que EAX es 39
o EBX o cualquiera de esos, tracear con F10 y ver lo que hace y donde guarda
esos valores y si hace PUSH, por lo menos hasta que cambie el valor de EAX a
otra cosa.
Bueno
luego anote varios lugares donde para el SOFTICE
10df:51dd add es: [bx+si], al
allí guarda los valores si lo seguís vas a ves que a cada cifra la
transforma y si mi clave falsa es 9898989898 ....... (26 cifras)
toma el 9 , lo transforma en 90 y lo guarda en
550f:2e56
luego toma el 8 y se lo suma en la sentencia que te mostré antes
10df:51dd add es: [bx+si], al
o sea que si miro allí guardo 98 como es mi clave, y así sucesivamente
guarda la clave 98 98 98 98 98 98 98 .... cifra por cifra.
Ahora empieza lo bueno la encriptación
lógico que hay que poner un bpr allí donde esta mi clave así guardada 98 98.....
sigo corriendo el programa y para en
10df:56de mov al , [bp+si-66]
que es tomar la primera cifra de la clave, luego la guarda en 550f:2dd6,
poner otro BPR aquí
luego hay que ir anotando las operaciones que le realiza a cada cifra.
en
10df:56e5 XOR al, [bp+ff0e]
hace un XOR (muy usado en encriptaciones) con el valor E4, hay que anotar
todo ya que mas adelante hay que realizar todas las operaciones que realizo
sobre tu clave falsa, hacia atrás sobre el número que compara con el tuyo
encriptado para encontrar la clave verdadera.
Al es 7c luego de realizarle el XOR y lo guarda en 550f:2e00, poner otro BPR
aquí.
Bueno hasta aquí llegaron mis ganas de hallar la clave quizás a alguien le sirva y le interesa
practicar y seguir desde aquí, bueno yo me canse.
COMO CRACKEARLO
Cuando ingresamos la clave ponemos un BPX MESSAGEBOX sin la A al final ya que es
16 bits y cuando para allí, puedo volver con RET, pero este camino no me lleva (esto ya
que probé y probé si alguno de esos saltos que había antes del MESSAGEBOX me
registraba. Como no pude hacer nada opte por ver las STRINGS REFERENCES y alli
estaba.
Su... no está registrado quedan... veces para entrar al sistema que es un cartel que aparece
cuando no estás registrado, si podemos lograr saltearlo puede funcionar como registrado,
veremos. Aquí viene una larga parte copiada del WDASM que termina justo en la
referencia a esa STRING.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.13E3(U)
|
:0001.1471 3D0000
cmp ax, 0000
:0001.1474 7503
jne 1479
:0001.1476 E96DFF
jmp 13E6
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.1474(C)
|
:0001.1479 3D0100
cmp ax, 0001
:0001.147C 7503
jne 1481
:0001.147E E9CBFF
jmp 144C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.147C(C)
|
:0001.1481 3D0400
cmp ax, 0004
:0001.1484 7503
jne 1489
:0001.1486 E97FFF
jmp 1408
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.1484(C)
|
:0001.1489 3D0500
cmp ax, 0005
:0001.148C 7503
jne 1491
:0001.148E E999FF
jmp 142A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.148C(C)
|
:0001.1491 E90000
jmp 1494
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0001.1405(U), :0001.1427(U), :0001.1449(U), :0001.146B(U), :0001.146E(U),
|:0001.1491(U)
|
:0001.1494 FFB650FB
push word ptr [bp+FB50]
:0001.1498 FFB654FB
push word ptr [bp+FB54]
:0001.149C 9AFFFF0000
call LCRYPKYD.CKCHALLENGE
:0001.14A1 898652FB
mov [bp+FB52], ax
:0001.14A5 8B8652FB
mov ax, [bp+FB52]
:0001.14A9 39865AFB
cmp [bp+FB5A], ax
:0001.14AD 7503
jne 14B2
:0001.14AF E91B00
jmp 14CD
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.14AD(C)
|
:0001.14B2 6A00
push 0000
* Possible StringData Ref from Data Seg 002 ->"Fall"
|
:0001.14B4 B80E03
mov ax, 030E
:0001.14B7 8CDA
mov dx, ds
:0001.14B9 52
push dx
:0001.14BA 50
push ax
* Possible StringData Ref from Data Seg 002 ->"Error"
|
:0001.14BB B80803
mov ax, 0308
:0001.14BE 8CDA
mov dx, ds
:0001.14C0 52
push dx
:0001.14C1 50
push ax
:0001.14C2 683020
push 2030
:0001.14C5 9AB90A0000
call USER.MESSAGEBOX
:0001.14CA E9BA05
jmp 1A87
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.14AF(U)
|
:0001.14CD 6A01
push 0001
:0001.14CF 9AFFFF0000
call LCRYPKYD.GET1RESTINFO
:0001.14D4 8986ECFC
:0001.14D8 83BEECFC02
:0001.14DD 7503
:0001.14DF E90A00
mov [bp+FCEC], ax
cmp word ptr [bp+FCEC], 0002
jne 14E2
jmp 14EC
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.14DD(C)
|
:0001.14E2 83BEECFC01
cmp word ptr [bp+FCEC], 0001
:0001.14E7 7403
je 14EC
:0001.14E9 E96801
jmp 1654
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0001.14DF(U), :0001.14E7(C)
|
:0001.14EC 8B46F8
mov ax, [bp-08]
:0001.14EF 8B56FA
mov dx, [bp-06]
:0001.14F2 398660FB
cmp [bp+FB60], ax
:0001.14F6 7403
je 14FB
:0001.14F8 E95601
jmp 1651
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.14F6(C)
|
:0001.14FB 399662FB
cmp [bp+FB62], dx
:0001.14FF 7403
je 1504
:0001.1501 E94D01
jmp 1651
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.14FF(C)
|
:0001.1504 6A02
push 0002
:0001.1506 9AD0140000
call LCRYPKYD.GET1RESTINFO
:0001.150B 8946FC
mov [bp-04], ax
:0001.150E 6A03
push 0003
:0001.1510 9A07150000
call LCRYPKYD.GET1RESTINFO
:0001.1515 8946F4
mov [bp-0C], ax
:0001.1518 8B46FC
mov ax, [bp-04]
:0001.151B 2B46F4
sub ax, [bp-0C]
:0001.151E 89865CFB
mov [bp+FB5C], ax
:0001.1522 837E1A00
cmp word ptr [bp+1A], 0000
:0001.1526 7503
jne 152B
:0001.1528 E91801
jmp 1643
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.1526(C)
|
:0001.152B FF761C
push word ptr [bp+1C]
:0001.152E 6A00
push 0000
* Possible Reference to Dialog: DialogID_03F3
|
:0001.1530 68F303
push 03F3
:0001.1533 6A00
push 0000
:0001.1535 6A00
push 0000
:0001.1537 6A00
push 0000
:0001.1539 9AFFFF0000
call USER.CREATEDIALOG
:0001.153E 898656FB
mov [bp+FB56], ax
:0001.1542 8B5E0A
mov bx, [bp+0A]
:0001.1545 D1E3
shl bx, 01
:0001.1547 D1E3
shl bx, 01
:0001.1549 FFB75200
push word ptr [bx+0052]
:0001.154D FFB75000
push word ptr [bx+0050]
* Possible StringData Ref from Data Seg 002 ->"Registro de %s"
|
:0001.1551 B85B03
mov ax, 035B
:0001.1554 8CDA
mov dx, ds
:0001.1556 52
push dx
:0001.1557 50
push ax
:0001.1558 8D86EEFE
lea ax, [bp+FEEE]
:0001.155C 8CD2
mov dx, ss
:0001.155E 52
push dx
:0001.155F 50
push ax
:0001.1560 9ACA0E0000
call USER._WSPRINTF
:0001.1565 83C40C
add sp, 000C
:0001.1568 FFB656FB
push word ptr [bp+FB56]
:0001.156C 8D86EEFE
lea ax, [bp+FEEE]
:0001.1570 8CD2
mov dx, ss
:0001.1572 52
push dx
:0001.1573 50
push ax
:0001.1574 9ADC0E0000
call USER.SETWINDOWTEXT
:0001.1579 83BEECFC02
cmp word ptr [bp+FCEC], 0002
:0001.157E 7403
je 1583
:0001.1580 E92D00
jmp 15B0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.157E(C)
|
:0001.1583 FFB65CFB
push word ptr [bp+FB5C]
:0001.1587 8B5E0A
:0001.158A D1E3
:0001.158C D1E3
:0001.158E FFB75200
:0001.1592 FFB75000
mov bx, [bp+0A]
shl bx, 01
shl bx, 01
push word ptr [bx+0052]
push word ptr [bx+0050]
* Possible StringData Ref from Data Seg 002 ->"Su %s no ha sido registrado, quedan "
->"%d veces para entrar al sistema."
En negrita están los diversos saltos que probando con el SOFTICE no sirven ya que
arrancando el programa y poniendo BPXs en todos esos y invirtiéndolos el programa
arranca desregistrado, aquí influye mucho esto de probar, pero si vemos el listado que
acabo de transcribir, yo sospeche primero que nada de la REFERENCIA que esta al
comienzo del listado.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.13E3(U)
Yo sospeche que de aquí podia provenir ya que todas las otras referencias eran dentro de
este mismo listado en cambio la referencia sospechosa provenia de otro lugar, como si el
programa esta registrado no salta hacia este sector y sigue por otro lado, y era asi, el
programa registrado no pasa por todo el listado que puse antes, entonces si viene de 13e3,
vemos que hay por alli, para tratar de evitar que venga hacia el cartel maldito.
Ahora vemos el listado que termina en 13e3 donde está el salto que hay que evitar.
:0001.13A5 837EF200
:0001.13A9 7E03
:0001.13AB E9DC06
cmp word ptr [bp-0E], 0000
jle 13AE
jmp 1A8A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.13A9(C)
|
:0001.13AE 8B46F2
mov ax, [bp-0E]
:0001.13B1 E9C006
jmp 1A74
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.1A81(U)
|
:0001.13B4 8D8656FB
lea ax, [bp+FB56]
:0001.13B8 8CD2
mov dx, ss
:0001.13BA 52
push dx
:0001.13BB 50
push ax
:0001.13BC 9ABE355E13
call 0001.35BE
:0001.13C1 83C404
add sp, 0004
:0001.13C4 898650FB
:0001.13C8 8D8656FB
:0001.13CC 8CD2
:0001.13CE 52
:0001.13CF 50
:0001.13D0 9ABE35BF13
:0001.13D5 83C404
:0001.13D8 F7AE50FB
:0001.13DC 898654FB
:0001.13E0 8B460A
:0001.13E3 E98B00
mov [bp+FB50], ax
lea ax, [bp+FB56]
mov dx, ss
push dx
push ax
call 0001.35BE
add sp, 0004
imul word ptr [bp+FB50]
mov [bp+FB54], ax
mov ax, [bp+0A]
jmp 1471
Vemos que las sentencias en negrita son las que importan, arriba en 13a9 esta la clave de
todo, alli ponemos un BPX 13a9 para probar arrancamos el programa y vemos qoe para
que no vaya al salto en 13e3 no tiene que saltar ya que si salta va a 13ae y cae
irremediablemente al salto de 13e3 que lleva al cartel maldito.
Bueno una vez que para allí por el BPX lo tenemos que nopear o sea hacemos
R eip= 13ab
que es la sentencia subsiguiente y luego hacemos X y arranca registrado, sin problemas.
O sea que si vamos al ULTRA EDIT y buscamos la cadena de es salto que es
7e 03 e9 dc 06 8b 46 f2 e9 c0 06 8d 86 56 fb
y reemplazamos en 7e 03 por 90 90 quedara el programa registrado perfectamente.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
PROGRAMAS BASTANTE MOLESTOS
(POR LO EXTENSO DE LA PROTECCIÓN)
(LECCION CUARENTA Y TRES)
Este es un programa llamado BANK EASY 2.1 que sirve para llevar cuentas bancarias y
ese tipo de transacciones.
Se baja de:
http://www.ghostsolutions.com/Main/BankEasy/BankEasy.htm
Y la verdad que tiene tantos lugares que parchear que ya ni recuerdo bien todos, trataremos
de ir de a poco.
Lo que si es cierto es que no esta comprimido ni nada, las STRINGS, aparecen bien aunque
no todas salen en la lista de STRINGS REFERENCES del WDASM, a pesar que en el
listado desensamblado del WDASM si aparecen.
No se cual es la verdadera razón de esto pero creo que puede ser esta:
Si en el Wdasm voy a Search - FIND y tecleo por ejemplo para que busque PC DATE que
es parte de un cartelito molesto que aparece cuando adelantas la fecha de tu compu y
ejecutas el programa y después volvés atrás la fecha y lo ejecutas te sale un cartel de que
hubo un problema con la fecha de tu pc y es el siguiente:
* Possible StringData Ref from Data Obj ->"MessagesThere seems to be an error "
->"with your PC date. The last time "
->"the program was run was the "
Eso es lo que aparece en el maldito cartel exactamente THERE SEEMS TO BE AN
ERROR WITH YOUR PC DATE. THE LAST TIME......
Sin embargo esa STRING no aparece entre las STRINGS REFERENCES dela lista, y hay
muchas así, no se la razón pero creo que debe ser por el tipo de cartel que utiliza la función
DialogBoxIndirectParama, que si ponemos un Bpx allí para en esos cartelitos maléficos.
Que hay muchos y surtidos y cuando aparecen el programa arranca pero como vencido, los
iconos no aparecen activos y no se puede usar, así que no solo hay que tratar de que el
programa piense que estamos registrados sino también, que saltee todas estas protecciones
de que si adelantaste el reloj, otro cartelito dice que no tenés licencia valida, otro que tu
licencia es fraguada, otro que falta un driver (mentira) , y así hay varios, la cuestión es que
cuando aparece uno de estos carteles, no arranca bien el programa, de idéntica forma como
si esta vencido.
En cualquier caso que queramos buscar una STRING de esos cartelitos conviene mas
buscarlas por SEARCH-FIND y poner una o dos palabras del cartelito y si no sale nada
probar con otras dos palabras que buscarlas en la lista de STRING REFERENCES.
Bueno al ataque mis valientes con paciencia vamos a ir al revés de la solución a la
explicación:
Aquí va primero la lista de bites que hay que modificar para crackear esta protección
pelmazo. (por lo larga)
La primera columna tiene el offset la segunda los valores originales y la tercera los que hay
que colocar en lugar de los originales.
Es bueno ver que para hallar la posición de memoria en el WDASM no podemos sumarle
400000 que es la Image base, porque si vemos con el PEDDITOR las secciones no están
arregladas, o sea que por eso no da la suma pero podemos calcular fácilmente viendo el
ENTRY POINT o cualquier punto, la diferencia entre el offset y el valor en el WDASM.
aquí hay que sumarle 400C00, podríamos arreglarlo con el PEEDITOR y luego sumar
directamente 400000, pero por si acaso chequee las secciones o algo así, mas vale
tomémonos la molestia y sumemos no es difícil calculadora en mano.
<offset>
<File 1 Byte>
45277h
28h
452C8h
80h
452C9h
3Dh
452CEh
0h
452CFh
Fh
452D0h
84h
452D1h
B7h
452D2h
0h
452D3h
0h
452D4h
0h
45335h
83h
45336h
F8h
45337h
0h
4538Ch
89h
4538Dh
F0h
9B21Dh
Fh
9B21Eh
85h
9B21Fh
9Bh
9B222h
0h
B194Fh
7Eh
B1986h
7Eh
B19C6h
Fh
B19C7h
8Dh
B19C8h
C2h
B19C9h
1h
B19CBh
0h
B1BA0h
Fh
B1BA1h
8Eh
B1BA2h
C2h
B1BA3h
1h
B1BA5h
0h
B1D6Fh
75h
B1DAEh
74h
B1DD8h
75h
<File 2 Byte>
50h
C6h
5h
1h
90h
90h
90h
90h
90h
90h
B0h
0h
90h
B0h
0h
E9h
9Ch
0h
90h
EBh
EBh
E9h
C3h
1h
0h
90h
E9h
C3h
1h
0h
90h
EBh
EBh
EBh
los primeros valores de la lista 45277 que corresponden al WDASM 445e77 son de la
rutina de registro, se llega a ella por cualquier lugar pero podemos ver que es el
CALL 445e1c
en este listado se ve claro
:004B4572 E8A518F9FF
:004B4577 3C00
:004B4579 7524
:004B457B 8B442427
:004B457F E848BDF8FF
:004B4584 89E8
:004B4586 BBFF000000
call 00445E1C
cmp al, 00
jne 004B459F
mov eax, dword ptr [esp+27]
call 004402CC
mov eax, ebp
mov ebx, 000000FF
* Possible StringData Ref from Data Obj ->"This feature is not avaliable "
->"in your Level of the program. "
->" Consult your application supplier "
->"for more information"
|
Ahí esta el llamado al CALL 445e1c y al volver de la rutina si AL es 0 es como si
estuvieras registrado (mas o menos ya veremos) y saltea el cartelito de que THIS
FEATURE IS NOT AVAILABLE .... o sea que generalmente saltea las restricciones del
programa si AL=0
Vemos también que las restricciones son bastantes observando las REFERENCES de
donde es llamado ese CALL 445e1c
Sin aburrirnos miremos todos los lugares de donde proviene
* Referenced by a CALL at Addresses:
|:00402D32 , :00402D8A , :00402FB6 , :0040309B , :00404F90
|:00404FBD , :00406466 , :004065EA , :00409E6D , :0040A913
|:0040B475 , :0040B502 , :0040B579 , :0040B597 , :0040B5C1
|:0040B5DF , :0040B605 , :0040B623 , :0040D8BB , :0040F464
|:0040F6D0 , :0040FE00 , :00411E2E , :00415E80 , :00415EBF
|:00415EFB , :00415F8F , :00415FE2 , :00416035 , :00416085
|:00419E6B , :0041A82A , :0041EA0D , :0041EA59 , :0041EAC9
|:0041EAE3 , :0041EE23 , :0041EE8B , :0041EEF1 , :00421644
|:004216B6 , :0042172C , :004217A3 , :004217C5 , :0042182D
|:00421895 , :004218D6 , :004218FB , :00421920 , :00421945
|:0042196A , :0042198F , :004219B4 , :00421A84 , :00421AA9
|:00421B19 , :00421B3B , :00421BAF , :00421C31 , :00421C56
|:00421CCB , :00421D31 , :00421D53 , :00421DB9 , :00422C60
|:0042337C , :00423404 , :00425700 , :00425771 , :004257AA
|:0042581B , :00425890 , :00425945 , :00425967 , :004259CE
|:00425A35 , :00425A9E , :00425AC3 , :00425AE8 , :00425B0D
|:00425B2F , :00425B51 , :00425B73 , :00425BF0 , :00425C77
|:00425CE6 , :00425D08 , :00425D7B , :00425E01 , :00425EB4
|:00425F19 , :00425F3B , :00425FA0 , :00425FD5 , :004260AF
|:00426122 , :0042CD5B , :0042CDD3 , :0042D01E , :0042EE84
|:0042EEB7 , :0042EEEA , :0042EF1E , :0042EF67 , :0042EFB0
|:0042EFF6 , :0042F086 , :0042F20C , :0042F26D , :0042F31E
|:0042F7AD , :0042F7EB , :0042FA20 , :004307A3 , :00430913
|:00430961 , :00430D08 , :004316BA , :004316FB , :00432924
|:00433FB7 , :004340AC , :0044DCDD , :0044DD1D , :0044DE3C
|:0044DEA5 , :00488910 , :004889DC , :00489DE9 , :0048A1B5
|:0048A683 , :0048A6BD , :0048A6F7 , :0048A72E , :0048A765
|:0048A7A6 , :0048A7E7 , :0048A828 , :0048A85F , :0048A896
|:0048A8D7 , :0048A91E , :0048ABCC , :0048B3C7 , :0048B5B8
|:0048B660 , :0048B73F , :0048B827 , :0048B94A , :0048BA6D
|:0048D3AD , :0048D4B5 , :0048D612 , :0048D813 , :0048D938
|:0048DB3A , :0048DCA6 , :0048DEA8 , :0048DFB2 , :0048E175
|:0048E2CD , :0048E4CF , :0048E5A8 , :0048E5D2 , :0048E682
|:0048E6AC , :0048E75C , :0048EA12 , :0048EA5F , :0048F2BA
|:0048F33D , :0048F3C0 , :0048F54C , :0048F660 , :0048F98F
|:0048F9E8 , :0048FED0 , :0048FF3E , :0048FF5D , :0048FF7C
|:0049028E , :00490332 , :00490425 , :00490617 , :00491144
|:004927BA , :004927FE , :00492892 , :004928BC , :004928E6
|:00492944 , :0049299F , :00492A16 , :00492F36 , :0049315B
|:0049328E , :004932AC , :004932CF , :00493488 , :004936F6
|:00494517 , :00494D11 , :00494D2F , :00495847 , :00496832
|:00496A57 , :00496A7C , :00496AA1 , :00496D8A , :00496EA0
|:00496EBF , :00496F96 , :00496FB8 , :00497196 , :004976A4
|:00498C38 , :00498DCE , :00499F31 , :0049A2AA , :0049B31B
|:0049B5FA , :0049B62E , :0049EEFC , :0049F50B , :004A1EF8
|:004A2519 , :004A2535 , :004A25B8 , :004A26C0 , :004A4929
|:004B1189 , :004B1817 , :004B1BFC , :004B1C6A , :004B1C88
|:004B1CAA , :004B1CF7 , :004B1DFD , :004B3253 , :004B414C
|:004B42D2 , :004B4419 , :004B445E , :004B44A3 , :004B44E8
|:004B452D , :004B4572 , :004B45B7 , :004B45FC , :004B4641
|:004B4686 , :004B46CB , :004B4710 , :004B4755 , :004B479A
|:004B47DF , :004B4824 , :004B4869 , :004B48AB , :004B497F
|:004B49F0 , :004B5235 , :004B59B1 , :004B5A3E , :004B5DAD
|:004B5F48 , :004B6090 , :004B673A , :004B6797 , :004B735B
|:004B73E3 , :004B7CA0 , :004B7D3C , :004B858C , :004B871C
|:004B886E , :004B92D8 , :004BA99D , :004BA9FD , :004BAA39
|:004BB25E , :004BB426 , :004BB4FB , :004BB640 , :004BB6A0
|:004BD67C , :004BDDC3 , :004BDECA , :004BDF3A , :004BDF7C
|:004BDFEE , :004BED31 , :004BEF8E , :004BEFD4 , :004BF0DF
|:004BF3C3 , :004BFE67 , :004BFEBE , :004BFEF7 , :004C08A4
|:004C090C
Bastantes no?
O sea que si hacemos que AL sea cero ya superaremos este primer escollo, que son las
limitaciones de tiempo del programa y muchas cosas que no te deja hacer si no estas
registrado.
Se puede parchear como lo hice yo que es mas complicado o directamente en el RET del
CALL poner XOR AL, AL que hace cero a AL y RET
El programa originalmente es así
:00445F94 83C420
:00445F97 C3
add esp, 00000020
ret
* Referenced by a CALL at Address:
|:004C9359
|
:00445F98 60
pushad
Quedaria asi
:00445F94 83C420
:00445F97 32 C0
add esp, 00000020
XOR AL , AL
* Referenced by a CALL at Address:
|:004C9359
|
:00445F98 c3
RET
Yo no lo hice así originalmente porque como no hay lugar para escribir las sentencias, me
sobrescribe el CALL siguiente pero probé de esta forma y funciona igual, no afecta
aparentemente al otro CALL siguiente.
Sino pueden probar la forma que yo lo parchee en la lista de cambios realizados, es igual,
sale siendo AL igual a cero.
Una vez que hacemos esto el programa al arrancar comienza a molestar con carteles
distintos, y no arranca bien, los siguientes saltos son para evitar esto:
Nos sale un cartelito de un driver que no esta cargado es esta parte:
:0049BE1A 83F801
:0049BE1D 0F859B000000
:0049BE23 B8F0515600
:0049BE28 BBFF000000
:0049BE2D E86626FBFF
cmp eax, 00000001
jne 0049BEBE
mov eax, 005651F0
mov ebx, 000000FF
call 0044E498
* Possible StringData Ref from Data Obj ->"FM2: Warning - Driver not located "
->"- GPF likely"
|
Ese cartel aparece y si lo ignoras no arranca bien el programa, parcheando el salto que esta
en 49be1d que esta en negrita, superamos este escollo.
Este otro salto
:004B254F 7E28
:004B2551 83FE00
:004B2554 7514
:004B2556 B89C125900
:004B255B BB13000000
:004B2560 E833BFF9FF
:004B2565 E8261E0000
jle 004B2579
cmp esi, 00000000
jne 004B256A
mov eax, 0059129C
mov ebx, 00000013
call 0044E498
call 004B4390
Era para saltar el CALL 4B4390 que si entra allí si o si caes en un cartelito maldito, dentro
del CALL hay para todos los gustos, este es mas difícil de explicar solo que en determinado
momento me aparecía un cartelito y para saltearlo, la única forma era no ingresando al
CALL y salteándolo desde 4b254f que esta en negrita.
Ahora hay otros saltos como este
:004B2579 E826E3F8FF
:004B257E 8B1DAD195700
:004B2584 39D8
:004B2586 7E28
:004B2588 83FE00
:004B258B 7514
·
call 004408A4
mov ebx, dword ptr [005719AD]
cmp eax, ebx
jle 004B25B0
cmp esi, 00000000
jne 004B25A1
Possible StringData Ref from Data Obj ->"ProductExpired"
Aqui se ve claro que al volver del CALL 4408a4 si no salta caemos en el cartelito
PRODUCT EXPIRED, por lo tanto para saltearlo hay que parchear el salto en
negrita.
Estos saltos tiene en común que siempre ocurren como el anterior al retornar del
CALL 4408a4, ese CALL es de seguridad así que si lo visitamos y vemos las referencias
de donde proviene veremos los saltos que nos quedan por parchear.
:004B25B0 E8EFE2F8FF
:004B25B5 8B1DB1195700
:004B25BB 39D8
:004B25BD 9C
:004B25BE 8B54240C
:004B25C2 83E204
:004B25C5 9D
:004B25C6 0F8DC2010000
:004B25CC B801000000
:004B25D1 BB01000000
call 004408A4
mov ebx, dword ptr [005719B1]
cmp eax, ebx
pushfd
mov edx, dword ptr [esp+0C]
and edx, 00000004
popfd
jnl 004B278E
mov eax, 00000001
mov ebx, 00000001
:004B25D6 B92F080000
:004B25DB E894DEF8FF
:004B25E0 3905AD195700
:004B25E6 0F8DA2010000
:004B25EC 83FA00
:004B25EF 0F8599010000
:004B25F5 83FE00
:004B25F8 0F8586010000
mov ecx, 0000082F
call 00440474
cmp dword ptr [005719AD], eax
jnl 004B278E
cmp edx, 00000000
jne 004B278E
cmp esi, 00000000
jne 004B2784
* Possible StringData Ref from Data Obj ->"MessagesThere seems to be an error "
->"with your PC date. The last time "
->"the program was run was the "
|
Bueno aquí esta el otro cartelito cuando adelantas el reloj de la computadora y usas el
programa, cuando lo volvés a la normalidad y usas el programa te salta este cartelito,
parcheando el salto en negrita que esta después del CALL 4408a4 lo salteamos.
Este es similar al que parcheamos para saltear el CALL 4b4390, igual que el que
parcheamos anteriormente.
:004B2968 833D5C1E570000
:004B296F 752C
:004B2971 8B442408
:004B2975 83E002
:004B2978 83F800
:004B297B 7520
:004B297D 83FE00
:004B2980 7514
:004B2982 B860145900
:004B2987 BB0C000000
:004B298C E807BBF9FF
:004B2991 E8FA190000
cmp dword ptr [00571E5C], 00000000
jne 004B299D
mov eax, dword ptr [esp+08]
and eax, 00000002
cmp eax, 00000000
jne 004B299D
cmp esi, 00000000
jne 004B2996
mov eax, 00591460
mov ebx, 0000000C
call 0044E498
call 004B4390
Este es idéntico para saltear CALL 4b4390
:004B29AE 7420
:004B29B0 83FE00
:004B29B3 7514
:004B29B5 B86C145900
:004B29BA BB0B000000
:004B29BF E8D4BAF9FF
:004B29C4 E8C7190000
je 004B29D0
cmp esi, 00000000
jne 004B29C9
mov eax, 0059146C
mov ebx, 0000000B
call 0044E498
call 004B4390
Y este tambien
:004B29D8 7531
jne 004B2A0B
:004B29DA 8B442408
:004B29DE 83E008
:004B29E1 83F800
:004B29E4 7525
:004B29E6 83FE00
:004B29E9 7514
mov eax, dword ptr [esp+08]
and eax, 00000008
cmp eax, 00000000
jne 004B2A0B
cmp esi, 00000000
jne 004B29FF
* Possible StringData Ref from Data Obj ->"FileCorrupted"
|
:004B29EB B878145900
mov eax, 00591478
:004B29F0 BB0D000000
mov ebx, 0000000D
:004B29F5 E89EBAF9FF
call 0044E498
:004B29FA E891190000
call 004B4390
Este último es de los que viene luego de CALL 4408a4 y saltea un cartelito de que cambio
la fecha de la PC, está un poco más abajo no lo pongo aquí por no hacerlo tan largo.
:004B278E E811E1F8FF
:004B2793 2DDA020000
:004B2798 8B1DB1195700
:004B279E 39D8
:004B27A0 0F8EC2010000
call 004408A4
sub eax, 000002DA
mov ebx, dword ptr [005719B1]
cmp eax, ebx
jle 004B2968
Luego de parchear todos estos saltos el programa arranca perfectamente, como registrado,
no cuenta mas el tiempo, no esta limitado, y no expira, por suerte, porque ya de que me
aparezcan cartelitos diversos estoy cansado uffff.
Lo que queda son algunas llamadas al mismo CALL 4408A4 que no me saltaron hasta
ahora, pero son pocas por lo que parece que ya quedo bien.
Esperemos que la lección 44 sea más breve no?
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
UN MUNDO NUEVO EL P-CODE
(LECCION CUARENTA Y CUATRO)
Hagamos una pequeña introducción al P-CODE, como en todos estos casos les aclaro que
yo estoy aprendiendo con ustedes, por lo que disculpen algún error que pueda tener al
explicar ya que el P-CODE es un tema difícil, diferente a lo anteriormente visto, y nuevo
para mi aunque ya tuve varios fracasos y medios aciertos con el crack del programa
exponente máximo del P-CODE y una cuenta pendiente que me queda el
CUENTAPASOS, esperemos que podamos ir avanzando con el P-CODE para que
podamos también realizar un crack del CUENTAPASOS mas adelante.
Este tutorial como yo estoy aprendiendo esta basado en un tutorial en ingles sobre un
crackme que se encuentra en la misma pagina de bajada de la herramienta que utilizaremos
para crackear estas pesadillas y que a pesar de todo simplifica bastante el problema del PCODE a punto de poder analizarlo con tranquilidad, igual yo he hecho algunos cambios
sobre el tute en ingles que creo que lo hacen mas fácil para entender.
Bueno primero debemos conseguir el programa a crackear
http://vacarescu.addr.com/WkT/vbdebug/tutos/vbcrackme10.zip
Se baja de allí y por supuesto para los que no lo saben aun todos los programas que se
craquearon en el curso así mismo, como este también están alojados en mi Kturn, el que los
quiere bajar solo debe ir a www.kturn.com y allí registrarse gratis para sacar un Kturn
propio te da 125 megas de almacenamiento y es gratis, una vez que ya tiene su Kturn entran
y allí van a la opción OTHER USERS y allí teclean ricnar458 y con eso ya entraron en la
carpeta PUBLIC están todos los programas que se crackearon en el curso, obviamente sin
crackear para el que quiera practicar, por orden y numerados según la Lección que
corresponde.
En
http://vacarescu.addr.com/WkT/vbdebug/downloads.htm
esta El VBDEBUGGER.
Que diferencia hay entre P-CODE y Visual Basic sin P-CODE, bueno eso es algo muy
técnico para explicarlo aquí, pero es bueno que sepan que en el P-CODE el ejecutable no se
ejecuta nunca, paradójicamente.
El ejecutable en realidad son las librerías de Visual Basic.
Y entonces como sabe la librería de Visual Basic que es lo que tiene que hacer?
Buena Pregunta
Va ejecutando sentencias según los valores de memoria que encuentra en el ejecutable del
programa, o sea para aclarar en un ejemplo burdo, el ejecutable del programa es una serie
de números sueltos que si los desensamblamos no significan nada ya que podemos probar
con el WDASM y no tienen ninguna coherencia, son solo como semáforos para que las
librerías de Visual Basic sepan que hacer.
Es complicado verdaderamente.
O sea que si uno quiere crackear esto en la forma tradicional apenas arranca el programa si
lo seguimos con el SOFTICE vemos que en la línea verde siempre se esta ejecutando
MSVBVM60.dll si es en Visual Basic 6.0
y allí esa librería hace todo, y toma decisiones según los valores que toma del ejecutable,
pero como valores sueltos de la memoria no como sentencias.
El hecho es que si hallamos por ejemplo en la librería de Visual Basic un salto que
deberíamos parchear y hace registrar un programa, no podemos parchear ese dll ni
cambiarlo porque Todos los programas de Visual Basic usan esa misma librería y dejarían
de funcionar o los afectaría.
La única forma de parchear seria ver que valores del ejecutable hacen a la librería de Visual
tomar ciertas decisiones, y cambiarlo allí, pero esto es una verdadera pesadilla y un dolor
de cabeza total.
Por eso se hizo este debugger especial para P-CODE, para tratar de facilitar el trabajo a los
pobres crackers vagos como yo, jua jua.
Es también de notar que el Smart Check no sirve para programas en P-CODE y sale un
cartel diciendo que el programa es P-COMPILADO y que Smart Cheack no puede
funcionar correctamente con el o algo así.
Bueno vamos a bajar la herramienta
Se baja de
http://vacarescu.addr.com/WkT/vbdebug/downloads.htm
De allí hay que bajar varias cosas no solo el programa.
De la pagina de bajada:
This new version fixes some loader bugs, and adds a more detailed error
message if something goes bad, also fixes some invalid opcodes, and fixes a
minor visual dumping error ;-).
Thanx to oskie for being so nice and helping in finding many bugs.
WKTVBDebugger v.1.3 (with English Help)
WKTVBDebugger v.1.3 (with Spanish Help)
Luego estan los tutoriales de ejemplo
Also check out this tutorials :
Cuentapasos v3.85,Se abrió La lápida (only spanish)
Eternal's Bliss VB CrackMe 10 (only english)
Sobre el segundo esta basado este tutorial aunque con algunos cambios.
Luego para el que no tiene instalado los runtimes de Visual Basic están aquí
para bajarlos
Visual Basic Virtual machine files (latest version we have):
MSVBVM60.DLL v.6.0.89.64
MSVBVM50.DLL v.5.0.82.44
Estos habría que copiarlos en el c:/WINDOWS/SYSTEM aunque yo
prefiero siempre estas cosas bajarlas directamente de Microsoft y
completas con instalador y todo.
http://download.microsoft.com/download/vb50pro/utility/1/win98/ENUS/Msvbvm50.exe
http://download.microsoft.com/download/vb60pro/install/6/Win98Me/ENUS/VBRun60.exe
de aquí se bajan completos desde la pagina de Microsoft luego de bajarlos
instalarlos y listo.
Luego viene estas filas que se bajan y hay que copiarlas dentro de la carpeta
de instalación del programa VBDEBUGGER ,
C:\Archivos de programa\WKTVBDE en la carpeta DBG
Symbolic debug files (DBG) files for use with the debugger:
MSVBVM60.DBG v.6.0
MSVBVM50.DBG v.5.0
Puff ya terminamos lo ultimo es la fila Bdasmdll.dll
la pueden buscar en su maquina, si la encuentran deben dejarla donde esta y
copiarla además a la carpeta de instalación del programa también junto con
el otro dll que trae el programa WKTVBDE.dll y por supuesto bdasmdll.dll.
El que no la encuentre en su maquina a la fila esta la puede bajar de Internet
o bajarla de mi Kturn que allí va a estar.
Bueno esto es todo, cuesta un poco instalar todo esto pero el ahorro de
tiempo y la facilidad de uso vale la pena.
Hay en la pagina de donde se baja el programa un FAQ aquí
http://vacarescu.addr.com/WkT/vbdebug/faq.html
por cualquier problema que tengan.
Bueno arrancamos el VBDEBUGGER, y allí vamos a OPEN y buscamos el
archivo para crackear, el VBcrackme 1.0.
Este podemos ejecutarlo antes para ver como es, aparece una grilla donde
hay que poner una combinación exacta de tildes, entonces vamos a CHECK
y si es la combinación correcta nos aparece un cartel de felicitación y si no,
no aparece nada.
Lo arrancamos desde el debugger y una vez que cargo vamos a EXECUTE y
comienza a funcionar el programa aparecen algunos carteles que debemos
aceptar, y si todo esta bien llega el programa a la ventana con la grilla y el
botón CHECK.
Cuando hacemos click en Check luego de poner cualquier combinación de
tildes, caemos dentro del debugger, el cual puede ser activado igual con la
combinación de teclas CTRL+P como si fuera el SOFTICE.
Caemos aquí
004043DC: 28 LitVarI2 0063F360h 0h , 0
Como vemos los OPCODES de P-CODE son diferentes a los que
conocemos ya los iremos aprendiendo pero aquí hay uno que importa y es el
salto condicional BRANCHF y BRANCHT si presionamos OPCODES nos
muestra la lista de comandos existentes aquí y estos dos corresponden a los
valores 1C y 1D respectivamente.
Estos saltos equivalen a que salta si es Falso BranchF (false)
y salta si es verdadero BranchT (true)
Estos son las claves de las decisiones que toma el programa.
Hay un botón llamado BRANCH x que nos lista todos los saltos que hay en
esta parte que esta listada aquí, que también puede ayudar.
00404404h : BranchF 00404410h
0040442Fh : BranchF 00404442h
00404461h : BranchF 00404474h
00404493h : BranchF 004044A6h
004044C5h : BranchF 004044D8h
004044F7h : BranchF 0040440Ah
00404529h : BranchF 0040443Ch
0040455Bh : BranchF 0040446Eh
0040458Dh : BranchF 004044A0h
004045BFh : BranchF 004044D2h
004045F1h : BranchF 00404404h
00404623h : BranchF 00404436h
00404655h : BranchF 00404468h
00404687h : BranchF 0040449Ah
004046B9h : BranchF 004044CCh
004046EBh : BranchF 00404401h
00404720h : BranchF 00404436h
00404755h : BranchF 0040446Bh
0040478Ah : BranchF 004044A0h
004047BFh : BranchF 004044D5h
004047F4h : BranchF 0040440Ah
00404829h : BranchF 0040443Fh
0040485Eh : BranchF 00404474h
00404893h : BranchF 004044A9h
004048B7h : BranchF 004043E3h
Estos son los saltos y vemos que todos caen adelante del siguiente así que
podríamos probar si el último es el que toma la decisión final de si lo
resolviste o no.
Pongamos un BPX en 4048b7
Vamos al BOTON breakpoints para poner un Breakpoint allí
por supuesto será BPX o sea al botón ON EXECUTION
escribimos 4048b7 y tecleamos ADD para que lo agregue y luego lo
marcamos y vamos a ENABLE para que lo conecte.
Luego vamos al BOTON GO que es para que el programa siga corriendo,
vemos que vuelve a parar en ese salto y que algunas sentencias mas abajo
esta el cartel YOU HAVE SOLVED, esta listo para saltar como indica el
debugger pero si lo dejamos que salte no saldrá el cartel que queremos así
que habrá que invertirlo, podemos hacerlo aquí mismo cambiando el 1C por
1D que es BranchT con lo que estaría invertido el salto, aquí pulsamos el
botón EDIT y doble cliqueamos encima del 1C que esta arriba de todo y
queremos cambiar, nos aparece una ventanita donde cambiamos por 1D y
luego vamos a PATCH NOW con lo que habremos cambiado en la memoria
este valor. (copiamos la cadena de números que siguen al 1c para luego
modificarlos con el Ultra Edit)
Cerramos esa ventana quitamos el BPX con DISABLE y luego vamos a GO
y cada vez que ante cualquier combinación ponemos CHECK nos sale el
cartel YOU HAVE SOLVED IT.
Por supuesto para cambiarlo definitivamente abrimos el ULTRA EDIT
cerramos el debugger y como ya habíamos copiado en la ventana de EDIT la
cadena que sigue al 1c que es
1c 07 05 27 e4 fe 27 04 ff 27 24 ff f5 00 00 00
la buscamos aquí cambiamos el 1c por 1d y programa crackeado.
No saben lo que es crackear esta pavada sin este debugger una pesadilla, así
que mil gracias a los autores de esta linda herramienta que facilita el trabajo
una barbaridad, seguiremos aprendiendo a usarla de a poco en lecciones
siguientes.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
SIGAMOS CON EL P-CODE
(TIEMBLEN CRACKERS "EL CUENTAPASOS")
(LECCION CUARENTA Y CINCO)
La verdad que este programa siempre fue mi clavo, una espina clavada y creo que la de
muchos crackers, pude hacer un crack parcial pero tenia algunos problemas, con el nuevo
VBdebugger para solucionar el P-CODE puede facilitarse (UN POCO) .
Además contamos con un tutorial sobre este tema en la pagina en la cual se baja el
debugger que esta en castellano y esta muy bien, aunque yo no me limito a copiar, lo voy
haciendo y según como me va resultando hago lo mismo o no, y trato de facilitar las cosas,
si hay algo complicado, en la medida que puedo.
Bueno este tutorial es para el CUENTAPASOS 3.80 REVISION 394 que es el ultimo que
salió, se baja de
http://www.cuentapasos.com
Lo instalamos y tomamos el ejecutable cpasos32.exe y lo analizamos con algún analizador
de filas, como el un-pack , nos dice que esta comprimido con NEOLITE 2.0 el cual esta
incluido en los descompresores que trabaja el PROCDUMP con lo que se puede
descomprimir fácilmente.
Sabemos que el debugger no trabaja con programas comprimidos así que ahora que esta
descomprimido debería funcionar.
Una vez descomprimido lo copiamos a la carpeta del programa, lo ejecutamos y nos sale el
cartel:
"No se ha encontrado el conjunto de opciones de INICIO C\Windows\......."
Bueno dado que como yo tengo el ejecutable descomprimido con el nombre
UNPACKED.exe en este ultimo cartel dice C\WINDOWS\Unpacked.ini por lo que quizás
este cartel aparezca por tener un nombre distinto el ejecutable cambiémoslo a Cpasos32.exe
a ver que pasa.
BUMMM
No sale el cartel anterior pero sale otro que dice "No existe ninguna tarifa , se va a crear
una tarifa de ejemplo" , aquí dado que este cartel aparece cuando ejecutamos el programa
descomprimido y no cuando ejecutamos el original, puede ser que el programa testee el
largo de la fila Cpasos32.exe o el checksum, ya veremos que es la primera opción la que
hace aparecer este cartelito.
Bueno, comencemos, carguemos el cuentapasos desde el debugger , hay allí una ventana
para poner breakpoints en APIS por lo que abrimos allí y nos aparecen una lista de las
funciones utilizadas, veremos si hay alguna función que informe sobre el largo de una fila,
que es lo que seguro el programa checkeará, miramos con paciencia ya que son muchas
funciones y ponemos BPX en las que tengan algo que ver con largo de filas, nos guiamos
por el nombre de las que hay allí hay rtcFILELen y rtcFILELenght que aparecen tener
que ver con el largo de la fila, pongo BPXs en ambas
Voy a GO para que arranque y para en
004C57BF: 5E ImpAdCallI4 rtcFileLen on address 0F036192h
Si le doy GO el programa sigue funcionando hasta que sale el cartel de la tarifa de ejemplo
y no para mas en ese BPX así que, el bodrio debe estar allí, antes de volver a arrancar el
debugger vayamos al ejecutable descomprimido del cuentapasos y fijémonos cual es el
largo del mismo haciendo click derecho encima del mismo y viendo las PROPIEDADES,
en el mío el largo es 1033728 bytes.
Esto puede variar un poco pero el valor estará cerca de ese.
Luego volvemos al debugger ejecutamos el CALL con F10 y la próxima sentencia es
004C57C4: 99 FMemStI4 004C8590 -> 000FC600h , 1033728
Aquí vemos el numero 1033728 que es el largo del ejecutable y la función FMEMStI4 lo
que hace es volcar el contenido del STACK que si vamos al cuadrito de la derecha y
cambiamos la opción a DWORD podremos ver que allí esta el valor FC600 que es el
hexadecimal de 1033728 y lo guarda en la posición de memoria 4c8590, si vamos a
MEMORY DUMP y buscamos que muestre el contenido de la memoria 4c8590 vemos que
hay solo ceros ahora al apretar F8 y ejecutar la sentencia se llenara con los valores 00 C6 0f
que es fc600 al revés.
Bueno ya vimos que guarda el valor del largo en esa posición de memoria ahora ya que
FMEMStI4 la palabra St debe significar STORAGE o sea GUARDAR debe haber entre los
opcodes una función opuesta que cargue el valor ese de la memoria al STACK para operar
o compararlo.
Si miramos entre los OPCODES
0F0FE145h
0F0FE16Ch
0F1056F8h
0F10571Ch
0F10573Dh
0F0FE1B5h
0F0FE1DCh
0F105789h
0F1057ADh
0F1057D8h
93h
94h
95h
96h
97h
98h
99h
9Ah
9Bh
9Ch
FMemLdI2
FMemLdR4
FMemLdCy
FMemLdFPR4
FMemLdFPR8
FMemStI2
FMemStI4
FMemStR8
FMemStFPR4
FMemStFPR8
Allí vemos el OPCODE 99 que es el que corresponde a FMemStI4 la función opuesta
parecería ser la 94 FMemLdR4 ya que es FMEM LD parece ser LOAD o sea cargar y R4
en vez de I4 intentemos haciendo doble click sobre esta funciona a ver que pasa.
Parara varias veces allí pero son los valores que carga de distintos lugares de la memoria al
STACK por ejemplo para aquí
004C57CE: 94 FMemLdR4 004C8514 -> 00000000h , 0
Que no sirve ya que no es esa posición de memoria ni el valor buscado seguimos haciendo
click en GO varias veces hasta que para en
004C5FF4: 94 FMemLdR4 004C8590 -> 000FC600h , 1033728
aquí vemos de nuevo que cuando hagamos F8 para ejecutar esta sentencia va a tomar el
valor que había guardado en 4c8590 , el valor fc600 que es el largo de la fila
descomprimida y lo va a cargar al STACK, hacemos F8 y en el cuadro superior derecho
siempre que este activado DWORD veremos el Fc600 allí,
En 4c5fff carga de nuevo el mismo valor en el STACK, cuando hacemos F8.
Luego lo compara con AAE60 que debe ser el valor que debería tener el ejecutable una vez
descomprimido de NEOLITE.
Luego viene el salto condicional que esta después que invertiremos a ver que pasa.
004C600B: 1C BranchF 004C6018 (No Jump)
Cambiando 1C por 1E es cambiar por BRANCH que es equivalente a JMP o sea que salte
siempre ya que el programa nos avisaba que no iba a saltar.
Vamos a EDIT reemplazamos el 1C por 1E y volvemos le damos a GO y no sale el
CARTELITO mas hemos acertado, podemos volver al mismo lugar para copiar la cadena
que hay que reemplazar con el ULTRAEDIT para que el cambio no sea solo en la memoria
y se guarde.
1C F0 0B 00 0A 1B 42 00
54 08 00 74 01 00 02 00
Y HAY QUE CAMBIAR EL 1C POR 1E
con eso ya tenemos el primer salto parcheado.
Ahora vamos por la nag o sea ese cartel que dice los días que te quedan y que tiene los
botones aceptar, cancelar, etc.
Aquí hay que aplicar el método que usamos a veces en el SOFTICE de ir traceando con
F10 hasta que aparezca la NAG, allí anotamos la sentencia que provoco la aparición y
volvemos a arrancar el debugger, y ponemos un BPX en esa dirección que hizo aparecer la
NAG, entramos ahora con F8 y seguimos con F10 hasta que vuelva a aparecer la NAG y
repetimos el proceso anotando cuando apareció poniendo un bpx allí, y luego cuando
volvemos a arrancar el programa y para allí otra vez dentro con F8, así llegaremos a uno de
los dos lugares en donde aparece la NAG, ya que este Tobarra (el autor) puso dos rutinas
gemelas, y a veces a unos le salta la NAG en una y a otros en otra.
ambas son
4BB3B7: 0d VCallHresult
meth__imethSHOW
4BB5ED: 0d VCallHresult
meth__imethSHOW
ya sabiendo que ambas hacen aparecer la NAG esa buscamos un salto anterior que pueda
saltearlas sin que aparezca el maldito cartel.
Esto se puede hacer con el programa EXDEC que es como un WDASM para P-CODE y
muestra un listado muerto de todas las sentencias, o se puede poner un BPX un poco
anterior a estas sentencias y buscar un salto que las esquive.
los saltos están en
4BB28A: 1c BranchF:
4bb3e4
4BB4E6: 1c BranchF:
4bb61a
Cada uno de estos saltos si cambiamos 1c por 1e se convertirá en un BRANCH o sea como
si fuera un JMP y salta sobre los CALL respectivos, haciendo que el programa arranque y
no aparezca la NAG y encima no venza, si vamos a ABOUT vemos que siempre esta en el
día cero. Bueno una espina menos pongamos las cadenas que hay que parchear en ambos
saltos:
1C 2C 04 00 15 04 10 FF
0A 26 00 04 00 04 10 FF
y el otro salto
1C 62 06 00 09 F4 FF 98
08 00 00 00 00 0C F4 FF
En ambos cambiamos 1C por 1E.
La verdad quien pensaría que cambiando solo tres valores estaría vencido este coloso.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
HAGÁMOSLO CON TRW2000
(TIRO AL PICHON)
(LECCION CUARENTA Y SEIS)
Al final de este tute pongo las claves para ingresar a los nuevos drives donde están los
programas de TODAS las lecciones así como las mismas lecciones y las herramientas mas
usuales para crackear.
En esta lección crackearemos con TRW2000, utilizaremos este programa en vez del
SOFTICE dado que no solamente hemos hecho muchos tutoriales con Softice, sino que
además no hay muchos tutoriales con TRW2000 y es bueno saber usarlo, dado que hay
veces que el Softice no se puede utilizar y entonces hay que trabajar con TRW2000, así que
cada tanto realizaremos un tute para TRW2000 así practicamos.
La victima es un programa llamado SCIENTIFIC NOTEBOOK y el link para bajarlo es
ftp://www.mackichan.com/download/version351/scinoteb351.exe
o de la pagina del programa
http://www.mackichan.com/
donde hay otros dos programas llamados SCIENTIFIC WORKPLACE y SCIENTIFIC
WORD que tienen una protección similar lo cual hace que si descubrimos esta habremos
crackeado tres en vez de uno.
Yo decidí bajar el SCIENTIFIC NOTEBOOK porque es el que menos pesa (20 megas
aprox) los otros son mucho mas pesados (50 megas aprox)
Bueno instalemos el programa y veamos, ejecutémoslo, tomemos como norma siempre
hacer una copia del ejecutable original y guardarlo en el escritorio o en algún lugar por si
acaso corrompamos sin querer el ejecutable original podamos rescatar el funcionamiento
sin tener que instalar todo de nuevo.
Bueno en el programa yendo a HELP-REGISTER y poniendo el punto en "I have and
unlock code and want to enter it ", nos aparece la pantalla para ingresar la clave.
Aquí la sorpresa es que además de la clave para registrar el programa y que no expire
también hay otros números de serie para registrar el programa para SPELLING
DICTIONARYS y COMPUTACIÓN ENGINE o sea que para habilitarlo todo
necesitaríamos como 20 claves para los distintos idiomas y para habilitar el resto de las
opciones que tiene el programa.
Bueno, ya que avisa allí que la clave tiene que tener doce caracteres pongamos una
cualquiera llenemos el cuadro con una clave falsa para cada opción (las tres principales
nada mas) a ver que pasa cuando nos queramos registrar.
Luego vamos a SAVE YOUR LICENSE FILE cliqueamos allí y nos dice que para habilitar
todas las nuevas opciones tenemos que cerrar y volver a abrir el programa.
Bueno hacemos eso y cuando lo volvemos a abrir es lógico que verifica si el serial es
correcto.
Nos aparece un cartelito que parece ser del tipo messageboxa que nos dice LICENSE
VERIFICATION ERROR, y después si queremos ver los detalles, luego arranca el
programa y si vamos a HELP - SYSTEM FEATURES que es donde muestra las licencias
habilitadas vemos que seguimos igual sin licencia.
VIEWER available
ENGLISH installed not licensed
no han cambiado mucho las cosas por aquí.
Si cerramos y volvemos a abrir el programa sin ir a la ventana de registro sigue apareciendo
el cartel LICENSE VERIFICATION ERROR.
Bueno abramos el TRW2000 vayamos a BROWSE para buscar el ejecutable que esta en
C:\Archivos de programa\Scientific Notebook y se llama scinoteb.exe , luego vamos a
LOAD para que comience a ejecutarse.
Rompe en el inicio del programa en el trw2000 y hacemos f10 para ejecutar una sola
sentencia y ya estar en el punto de entrada del programa.
Aquí en el TRW2000 ya que los números hexadecimales que corresponden a las sentencias
no se muestran tenemos que activarlos a mano tecleando CODE ON con eso ya estaremos
mas cerca de lo que estamos acostumbrados a ver en el SOFTICE.
Bueno ya que esa ventanita que dice LICENSE VERIFICATION ERROR parece una
messageboxa, pongamos pues un BPX messageboxa para ver si para allí el TRW2000 .
Hagamos X para que corra y para dentro del MESSAGEBOXA.
En la línea donde marca que archivo se esta ejecutando vemos USER32 así que para que
termine de ejecutarse esta función de windows y volver al ejecutable, a la sentencia
posterior al punto donde entro, tecleamos F12 sale el cartelito maldito de LICENSE
ERROR y luego de aceptar en el cartel, ponemos que no queremos ver los detalles y
entonces llegamos hasta el RET donde termina esta función MESSAGEBOXA.
Aprieto F10 y salgo a la sentencia posterior a la llamada al messageboxa en 6e8302.
Aquí vemos una diferencia entre el SOFTICE y el TRW2000 si hubiéramos tecleado F12
en el mismo punto en el SOFTICE este nos hubiera depositado directamente aquí en
6e8302, con el trw2000con f12 llega hasta el RET y luego hay que teclear F10 para llegar a
la misma posición.
Bueno una vez que llegamos allí a la sentencia posterior anotamos el CALL que
corresponde al MESSAGEBOXA que esta en la sentencia anterior o sea 6e82fc.
Supuestamente debería encontrar un salto anterior que permita esquivar esta sentencia y
que no se ejecute así que busco con CTRL. + FLECHA DEL CURSOR PARA ARRIBA
las sentencias anteriores a 6e82fc algún salto condicional que esquive ese call o sea que
salte después de 6e82fc para que no aparezca el cartelito de LICENSE ERROR.
Hay algunos saltos anteriores JZ, JA, JNA, JNZ pero todos saltan antes del call maldito,
ninguno lo salta por encima a posiciones de memoria posteriores a 6e82fc, por lo que no
nos sirven.
Volvemos a hacer F12 para terminar hasta el RET y luego F10 para volver a la sentencia
posterior a la entrada del CALL donde estábamos.
Vemos que caemos en 5b0510 y que la sentencia anterior ahora que hay que esquivar para
que no salga el cartelito es la anterior 5b0510 Call 6e824a.
El que quiere probar vuelva a arrancar el programa cuando para en el inicio ponga BPX
5b0510 y va a parar allí y al ejecutar el CALL con F10 aparecerá el cartelito maldito.
Bueno repetimos el proceso y buscamos con CTRL. + FLECHA ARRIBA para buscar
algún salto que pase por encima de este CALL.
hay uno solo en 5b048a jz 5b0493que no salta a posiciones de memoria posteriores a
5b0510, por lo que no sirve.
Otro no se ve así que repitamos el proceso y volvamos a hacer F12 y F10 para llegar a la
sentencia posterior al Call donde estábamos antes y esto nos hace caer en 6e8353 y el Call
anterior que hay que esquivar es 6e834d call near [edx+8c]
Buscamos para arriba algún salto anterior y hay uno en 6e833e jz 6e8355 que saltearía justo
el CALL maldito del cartel LICENSE ERROR.
Arranquemos de nuevo el programa y desde el trw2000 y cuando se inicia pongamos un
BPX en el salto ese o sea BPX 6e833e.
Cuando para allí vemos que a la derecha del salto dice NO JUMP así que para invertirlo y
que salte por encima del CALL maldito hay que hacer que JUMP o sea que salte a 6e8355.
Como EIP marca la próxima sentencia que se va a ejecutar, cambiando el valor de EIP a
6e8355 haremos que salte allí .
En el SOFTICE con poner R eip = 6e8355 ya estaba listo aquí hay que teclear R y enter,
con eso se resalta EAX arriba entre los registros, luego con las flechas de cursor se mueve
hasta que quede resaltado EIP y ahí tecleamos 6e8355 y listo se invirtió en salto.
El salto al ejecutar F10 pasa por encima del CALL maldito 6e834d pero si sigo tecleando
F10 vemos que luego de ya haber esquivado el CALL que queríamos al pasar por encima
del otro CALL posterior que esta en 6e8360 aparece también el cartel de LICENSE
ERROR, eso quiere decir que el salto ese no sirve y para esquivar los dos carteles juntos
debemos seguir hasta el RET con F12 y luego F10 y caer el la sentencia posterior al CALL
que contiene los dos carteles, si saltamos ese CALL esquivaremos ambos juntos.
Ahora caímos en 63da13 vemos que el CALL maldito ahora es 63da0e , el que contiene los
dos carteles de error dentro y que hay que esquivar.
Busquemos un salto anterior mirando hacia arriba con CTRL. + FLECHA para arriba.
Hay un JMP 63da13 que no es condicional y que saltearía por encima el CALL pero que
pasa hay un salto condicional anterior AL JMP que lo pasa por encima y nos tira directo
dentro del cartel maldito en 63da0e.
El salto condicional esta en 63d9f3 jz 63da07 ponemos un BPX allí y arrancamos de nuevo
el programa, veo cuando para que dice JUMP y que va a pasar por encima del salto que
esquiva el cartel, así que tengo que invertir este salto para que en vez de JUMP no salte y
siga en la sentencia siguiente, o sea debo cambiar EIP a 63d9f5 así sigue ejecutándose allí.
sigo con F10 y al pasar por 63da00 sale otro cartel de LICENSE ERROR distinto al de
63da0e, por lo tanto el salto no sirve y debemos salir con F12 y F10 hasta la sentencia
posterior a este CALL que contiene estos cartelitos para saltearlos a los dos juntos.
Caigo en 63d40a y el CALL ahora a esquivar es la sentencia anterior o sea 63d405 .
Miramos hacia arriba y hay unos cuantos saltos prueben si quieren practicar pero no sirve
ninguno ya que no arranca bien el programa (prueben ustedes que pasa)
Vuelvo a apretar F12 y F10 y aparezco ahora en 63dac8 y el CALL a saltear es 63dac3.
Los saltos anteriores tampoco sirven si los invierto.
Vuelvo a hacer F12 y F10 y caigo en 51c41c y el call a esquivar es la sentencia anterior
51c417.Los saltos no hacen nada bueno.
Vuelta F12 y F10 aparezco en 51c1f0 y el call a saltear es 51c1eb.
Hay un salto anterior en 51c1e7 , arranco de nuevo el programa y cuando se inicia pongo
un BPX allí.
Cuando para dice que no va a saltar (NO JUMP), si lo invierto de la forma que hicimos las
veces anteriores no me sirve porque para como veinte veces en el mismo lugar y cada vez
que para debo hace R y cambiar EIP por lo que mejor es cambiar la sentencia directamente
una sola vez.
TECLEO A y ENTER cuando estoy encima del salto.
Si te dice que ese comando se puede usar solo en versiones registradas buscate otro
TRW2000 bien crackeado.
luego de teclear A y ENTER escribo la nueva sentencia JMP 51c1f8 borro el BPX con
BC* y arranco el programa con X.
Bueno por lo menos arranca el programa pero si voy a HELP-SYSTEM FEATURES
vemos que las licencias no se han habilitado.
Hay allí varios saltos anteriores para probar pero el correcto es el que esta un poco mas
arriba en:
51c195 Jz 51c214
pongo un BPX allí arranco el programa de nuevo.
Copio la cadena de números hexadecimales (ACORDARSE DE CODE ON SI NO NO SE
VAN A VER) correspondiente a ese salto y algunos mas que le sigan.
74 7D 8A 55 2D 84 D2 0F 85 16 01 00 00
Sigamos hacemos A y enter, cambiamos por JMP 51c214, la única cifra que cambió en la
cadena fue la primera en 74 por EB.
Borramos los BPX y le damos X para ver que pasa.
Sale un cartelito que dice que hay un error en la licencia que tenemos el numero de licencia
de otro programa de la serie, aceptamos este, luego aparece otro, aceptamos y arranca el
programa,
Si vamos a HELP -SYSTEM FEATURES vemos que el programa habilito TODAS las
funciones diccionarios, y engines sale una lista de 30 todas habilitadas con su licencia.
Por lo tanto vemos que esos cartelitos anteriores de que teníamos la licencia de otros
programas los pusieron para despistar.
Bueno podemos buscar la cadena con el ULTRA EDIT y cambiar el 74 por EB y hemos
hecho la primera parte.
La tarea para el hogar (QUE YO YA HICE) y no es tan difícil como lo que ya se hizo es
que ustedes por el mismo método encuentren el salto que complementa al que ya
parcheamos y que hace que no salgan estos otros dos cartelitos falsos.
No lloren no hay que hacer tantos F12 como en la lección, unos poquitos no mas, ya saben
BPX messageboxa y luego F12 y F10 así repetir el proceso buscando un salto que esquive
estos dos carteles .
AYUDA
El salto esta en
_ _ _ _ _ 8 : JZ _ _ _ _ _ E
Completar aquí para saltear los dos carteles.
FIN
Para ingresar a los drives donde están los programas no hay que registrase ni sacar un drive
propio ni nada, solo ir a
http://www.oodrive.com/
y entrar en la pestaña VISITEUR y allí poner las siguientes claves:
para el primer drive con los programas que se crackearon en el curso
user: ricnar456
pass: ricnar456
para el segundo drive con mas programas de las lecciones, mas las mismas lecciones y
algún tutorial:
user: ricnar457
pass: ricnar457
Y para entrar al tercer drive donde hay herramientas para crackear
user: ricnar001
pass: ricnar458
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
DURO PERO UTIL
(LECCION CUARENTA Y SIETE)
Este programita es como dice el titulo bastante duro para crackear pero es útil para todos
aquellos que se la pasan convirtiendo archivos MP3 a WAV y MP3PRO entre otras cositas,
además tendremos también el reproductor de MP3PRO la verdad nunca había escuchado
nada en este formato nuevo y quede sorprendido al ver que un archivo Mp3 de 2.6 megas al
transformarlo en MP3PRO quedo reducido solo a 1 mega y se escuchaba igual o mejor.
Bueno este programita añade una opción cuando hacemos click derecho sobre un MP3 la
opción CONVERT y allí ya nos sale si queremos convertirlo a WAV a MP3 o a MP3PRO
es muy útil y rápido, muchas veces al intentar grabar un CD el programa nos dice que el
archivo esta muy comprimido y tenemos que hacerlo WAV de nuevo y volverlo a hacer
Mp3 lo cual significa abrir dos programas cargar el archivo y blablabla, aquí con hacer
click con el botón derecho encima del tema ya casi lo estamos convirtiendo.
Bueno adelante el programa se llama dbPoweramp y es gratis una parte, luego se baja un
agregado que se llama POWERPACK que vence a los 30 días y es totalmente operativo
que además de agregarle muchas opciones permite agregar efectos de sonido y muchas
cositas mas.
El programa hay que bajarlo de
http://admin.dbpoweramp.com/
y el link directo para bajarlo es
http://admin.dbpoweramp.com/bin/dMC-r7.exe
el POWERPACK se baja de
http://admin.dbpoweramp.com/bin/dMC-PowerPack.exe
Los codecs para MP3pro se bajan de
http://codecs.dbpoweramp.com/store-alpha/codec-central.htm
user: codecs
pass: dream23
Allí en la pagina hay varios plugins inclusive se bajan aparte los codecs para MP3PRO y el
player para MP3PRO se baja de
http://www.codingtechnologies.com/mp3PROzone/assets/mp3PROAudioPlayer_v1_0_2.ex
e
También hay un plugin para entradas auxiliares para ingresar de cassete o discos y que se
yo cuantas cosas mas.
El que no quiere matarse bajando todo por separado en el oodrive de programas esta todo
esto dentro de un solo zip, así uno lo baja en una sola vez ya que nos son largos los
archivos.
Bueno una vez que bajamos todo y lo instalamos cuidadosamente vemos que hay un
archivo que llama POWERPACK STATUS si hacemos click en el nos dirá que no estamos
registrados, que nos quedan treinta días y que aun este programa no expiro.
No conviene parchear este programita porque solo nos dice en estado en que esta
funcionando, por mas que lo parcheeemos y le hagamos decir que estamos registrados el
POWERPACK vencerá a los 30 días así que, este powerpack status nos ayudara para saber
el estado de las cosas, no lo parchearemos.
Para ver como trabaja nos posicionaremos encima de un archivo MP3 y haremos click
derecho encima y nos posicionaremos encima de la opción CONVERT sin hacer click,
entraremos en el SOFTICE y pondremos un BPX GETVERSION a ver que pasa saldremos
del SOFTICE y haremos ahora si click en CONVERT, caemos en el SOFTICE y después
de cómo 20 F12 mas o menos vemos en la línea verde que llegamos al ejecutable
MUSICONVERT ejecutamos un par de sentencias con F10 hasta llegar al RET y salir de
allí y caemos en
413b50, donde podremos un BPX para que cada vez que queramos ingresar al ejecutable no
tengamos que repetir lo del BPX getversion.
Caemos por aquí:
:00413B50
:00413B56
:00413B5C
8B15CC624200
8B82E0000000
50
mov edx, dword ptr [004262CC]
mov eax, dword ptr [edx+000000E0]
push eax
Bueno ya tenemos la forma de ingresar y sabemos que el ejecutable es el archivo
MusicConverter.exe así que lo abrimos con el WDASM para mirar un poco.
La siguiente STRING REFERENCE podría ser útil
* Possible StringData Ref from Data Obj ->"The 'Power Pack' part of dMC has "
->"now expired, all advanced"
Sin embargo al poner un BPX en los saltos que están arriba de esa STRING
:00410623 0F87E2010000
:00410629 0F84CB010000
:0041062F 8BC1
:00410631 48
:00410632 0F8463010000
:00410638 83E80E
:0041063B 740C
:0041063D 48
:0041063E 0F85E5010000
:00410644 E9CF020000
ja 0041080B
je 004107FA
mov eax, ecx
dec eax
je 0041079B
sub eax, 0000000E
je 00410649
dec eax
jne 00410829
jmp 00410918
En ninguno para cuando el programa esta funcionando normalmente sin estar vencido por
lo que aquí no es un punto donde decide si esta vencido o no, es probable que eso sea antes
pero los autores del programa se cuidaron bastante bien de sugerirnos de donde viene esto,
ya que si seguimos hacia arriba para ver si hay alguna REFERENCE anterior para saber
desde donde llega hasta aquí vemos que no hay el comienzo de la rutina es:
:004105F9 90
:004105FA 90
:004105FB 90
:004105FC 90
:004105FD 90
:004105FE 90
:004105FF 90
:00410600 64A100000000
:00410606 8B4C2408
nop
nop
nop
nop
nop
nop
nop
mov eax, dword ptr fs:[00000000]
mov ecx, dword ptr [esp+08]
Y no hay ninguna REFERENCE de donde puede provenir esto.
Aquí los programadores han leído muchos tutes de crackers y saben que a veces uno se guía
por las referencias que obtiene en un desensamblador como el WDASM por lo que para
ingresar a esta parte llaman a la rutina desde una sentencia como:
CALL ESI o CALL [EAX+05]
o algo así que el WDASM no puede saber que valor tiene ESI o EAX+05 por lo que no
puede determinar de donde proviene la llamada a la rutina.
Distinto seria si fuera una llamada numérica como CALL 4105f9 que llamar a la primera
sentencia de esta rutina entonces el WDASM nos diría todos los lugares donde se encuentra
una llamada así y sabríamos de donde proviene.
Podríamos adelantar el reloj para que venza y llegue hasta esta zona, y después hacer F12
para al salir de esta rutina volver a la sentencia posterior a donde fue llamada.
Yo seguiré por otro camino.
Les comento que si adelantan el reloj para que venza , no aparecerá mas el POWERPACK
aunque luego vuelvan a atrasar el reloj de nuevo.
Para desbloquear el POWERPACK y que vuelva a funcionar, (esto se puede ver con el
REGMON una vez bloqueado) el programa pone una marca en el registro para que no se
pueda utilizar mas.
La clave es :
[HKEY_CURRENT_USER\Software\SCC]
Y hay que ingresar allí el valor 0 para que vuelva a funcionar y por supuesto volver a
retrasar el reloj sino volverá a bloquearse.
[HKEY_CURRENT_USER\Software\SCC]
"DSTT"=dword:00000000
Entre las SRTINGS hay también una REGISTERED pero al igual que la anterior el
comienzo de esa larga rutina no tiene ninguna REFERENCE para ver de donde proviene y
al estar desregistrado ningún BPX en esa zona para allí por lo que es una parte que no
podremos acceder.
El que quiera registrarlo tiene que estudiar esta parte mas exactamente el CALL 410000
que decide si luego de aparecer la palabra REGISTRADO si vas a YES O NO, miren.
* Possible StringData Ref from Data Obj ->"Registered: "
|
:00409981 BF0C394200
mov edi, 0042390C
..
..
..
..
:004099AB E850660000
:004099B0 83C404
:004099B3 8D942478010000
:004099BA 84C0
:004099BC 740A
call 00410000
add esp, 00000004
lea edx, dword ptr [esp+00000178]
test al, al
je 004099C8
* Possible StringData Ref from Data Obj ->"Yes"
|
:004099BE BF08394200
mov edi, 00423908
:004099C3 E91E010000
jmp 00409AE6
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004099BC(C)
|
* Possible StringData Ref from Data Obj ->"No "
Bueno era posible que modificando dentro del CALL para que salga siendo al=1 nos
registráramos ya que eso hace que vayamos a la palabra YES y salteemos el NO, pero
alguna comprobación posterior hace que no arranque el POWERPACK así que como no
tenemos mas tiempo dejaremos abierta esta vía de crackeo para el que la quiera investigar.
Trataremos de que el programa no venza en vez de registrarnos igual funciona muy bien,
así que miremos un poco esto.
Utilicemos el REGMON para ver si encontramos donde guarda la fecha de inicio de los 30
días de plazo que te da, cualquier clave rara que encontremos puede ser, abramos el
REGMON y en filtro pongamos MUSIC* y arranquemos haciendo click derecho sobre un
archivo MP3 hasta que arranque.
Nos salen varios resultados pero mi ojo avizor sospecha de algunos en particular, veamos:
Esto me resulta muy sospechoso:
CloseKey
HKCU\Software\SCC\
OpenKey
HKCU\Software\Illustrate\dBpowerAMP
QueryValueEx
HKCU\Software\Illustrate\dBpowerAMP\dMCPPi
CloseKey
HKCU\Software\Illustrate\dBpowerAMP
OpenKey
HKCU\Software\Illustrate\dBpowerAMP
CloseKey
HKCU\Software\Illustrate\dBpowerAMP
OpenKey
HKCU\Software\Illustrate\dBpowerAMP
QueryValueEx
HKCU\Software\Illustrate\dBpowerAMP\dMCPPi 0 3B 76 26 1A
4B C1 1
CloseKey
HKCU\Software\Illustrate\dBpowerAMP
Uno cuando practica bastante por lo menos ya sabe separar la paja del trigo en el caso del
REGMON, entre tanta información que da hay que saber descartar las que son claves
utilizadas por el sistema de las del programa en particular, bueno esta clave dice
dbPOWERAMP, podría ser, veamos si esta en el WDASM por algún lado.
AQUIIIIIII
* Reference To: KERNEL32.GetSystemTime, Ord:015Dh
|
:00410B2E FF152CF14100
Call dword ptr [0041F12C]
:00410B34 8D54240C
lea edx, dword ptr [esp+0C]
:00410B38 8D44241C
lea eax, dword ptr [esp+1C]
:00410B3C 52
push edx
:00410B3D 50
push eax
* Reference To: KERNEL32.SystemTimeToFileTime, Ord:029Bh
|
:00410B3E FF1530F14100
Call dword ptr [0041F130]
* Possible StringData Ref from Data Obj ->"Software\Illustrate\dBpowerAMP"
|
:00410B44 68242A4200
push 00422A24
:00410B49 6801000080
push 80000001
·
Possible StringData Ref from Data Obj ->"dMCPPi"
Mas sospechoso imposible justo es abierta esa clave del registro después de hacer
GETSYSTEMTIME o sea después de que el programa se entera de la fecha que es, quizás
esta cifra que esta en dmcppi sea la fecha inicial de prueba del programa pero encriptada.
Hagamos una prueba, adelantemos el reloj un año y antes de ejecutar el programa, vayamos
a HKEY_CURRENT_USER\Software\Illustrate\dBpowerAMP
y marquemos DMCPPi y exportemos la clave al escritorio o algún lado seguro o sea luego
de marcarla, REGISTRO - EXPORTAR ARCHIVO DEL REGISTRO, para poder jugar
con esta clave a ver que pasa y si nos equivocamos poder restaurarla como estaba antes.
Ahora luego de haberla exportado borrémosla.
Ejecutemos el programita que nos dice el STATUS de cuantos días nos faltan para que
venza POWERPACK STATUS.
DICE QUE NOS QUEDAN 30 días para probar jua jua, y si vamos a ver y cerramos y
volvemos a abrir la misma clave vemos que creo otra diferente con la que debe ser la fecha
actual encriptada a partir de la cual nos da de nuevo 30 días.
Si volvemos de nuevo el reloj hacia atrás tenemos que borrar esta clave de nuevo para que
nos cree de nuevo la clave actual porque si lo ejecutamos fuera de fecha vencerá y se
bloqueara para lo cual habrá que buscar para desbloquearlo la otra clave que hallamos al
principio del tute.
Bueno la cuestión es que el programa busca la clave esta y si no esta, crea una nueva,
podemos borrar la clave vieja y poner un BPX en REGCREATEKEYEXA para ver donde
crea la nueva clave.
Para en
* Reference To: ADVAPI32.RegCreateKeyExA, Ord:015Fh
|
:00418078 FF151CF04100
Call dword ptr [0041F01C]
:0041807E 85C0
test eax, eax
:00418080 7529
jne 004180AB
:00418082 8B44240C
mov eax, dword ptr [esp+0C]
:00418086 8B4C2408
mov ecx, dword ptr [esp+08]
:0041808A 8B542404
mov edx, dword ptr [esp+04]
:0041808E 50
push eax
:0041808F 8B442418
mov eax, dword ptr [esp+18]
:00418093 51
push ecx
:00418094 6A03
push 00000003
:00418096 6A00
push 00000000
:00418098 52
push edx
:00418099 50
push eax
·
Reference To: ADVAPI32.RegSetValueExA, Ord:0186h
Allí crea la nueva clave y con SET VALUE le da un valor nuevo.
Hagamos F12 para ver de donde viene esta llamada a este CALL ya que en el WDASM
vemos que puede provenir de diferentes lugares.
Caemos en el mismo lugar que habíamos visto antes
* Possible StringData Ref from Data Obj ->"dMCPPi"
|
:00410B70 68C8384200
push 004238C8
:00410B75 E8C6740000
call 00418040
Ahora veamos un poco mas arriba hay un salto condicional que puede evitar que llegue a
crear una clave nueva o sea que eso debe ocurrir normalmente cuando el programa
encuentra la clave, y si no la encuentra crea una nueva, lo que podemos hacer nosotros es
parchear ese salto para que siempre este o no este la clave SIEMPRE caiga donde crea una
nueva y cada vez que se ejecute el programa nos de 30 días mas, jeje.
Aquí vemos el salto a parchear
:00410B5D 751E
jne 00410B7D
* Possible StringData Ref from Data Obj ->"Software\Illustrate\dBpowerAMP"
|
:00410B5F 68242A4200
push 00422A24
:00410B64 6801000080
push 80000001
:00410B69 8D4C2414
lea ecx, dword ptr [esp+14]
:00410B6D 6A08
push 00000008
:00410B6F 51
push ecx
* Possible StringData Ref from Data Obj ->"dMCPPi"
|
:00410B70 68C8384200
push 004238C8
:00410B75 E8C6740000
call 00418040
Podemos probar poner un BPX 410b5d y veremos que cuando para allí siempre quiere
saltar a no sea que hayamos borrado la clave donde guarda la fecha de inicio.
Por lo tanto cambiemos esos dos números del salto por 90 90 y no saltara nunca y siempre
CAERA EN EL CALL donde esta createkey tendremos 30 días mas de uso cada vez que lo
ejecutemos y nunca vencerá. La cadena a modificar en el ULTRA EDIT es:
75 1E 68 24 2A 42 00 68 01 00 00 80
Y debemos cambiar 75 1E POR 90 90
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
BUSCANDO CLAVES UN POCO MAS DIFÍCILES
(LEECION CUARENTA Y OCHO)
En esta oportunidad buscaremos la clave de un programa que es un poco bastante mas
difícil que lo normal, quizás no llegue al nivel del encriptamiento furioso, ni nada que ver
ya que la rutina de comparación es simple.
El problema es que pone un montón de partes para despistar como si estuviera encriptando,
y yo llene como seis hojas de paginas con un encriptamiento de la clave que era falso, que
era solo para despistar, por lo tanto en casos de claves que hay mucho que perseguir la
táctica es desde que ponemos la clave falsa y caemos dentro del HMEMCPY hasta que
llega al cartel de que la clave es incorrecta, conviene hacer una primera pasada superficial
luego de poner los BPRs donde esta en la memoria la clave falsa, y anotar todos los lugares
donde va parando y mirando un poco, sin seguir por primera vez por caminos donde
empieza a hacer operaciones con los números de la clave falsa.
En mis hojas de anotaciones hay un montón de lugares donde paraba y tomaba uno o varios
números de la clave y los empezaba a sumar y a operar con otros inclusive hay un ciclo
terrible de que va tomando cifras le hace mil cuentas las suma divide multiplica etc etc, las
guarda y sigue, y al final es una farsa completamente inútil, así que yo voy a hacer un breve
repaso de los lugares mas importantes donde para sin operar demasiado hasta que llega a la
rutinita de comparación, y suprimiré muchas de las partes puestas para despistar, que si uno
anota donde comienzan y sigue adelante sin prestar atención, llega a la rutina de
comparación perfectamente, y si uno no la encuentra entonces si vuelve atrás y comienza a
revisar con mas cuidado lo que paso de largo.
El programa a analizar es el
http://ftp.idg.se/programbanken/pc/grafik/snag3243.exe
y no es la ultima versión que hay aunque no ha cambiado mucho en cuanto a la forma de
hallar la clave, creo que las mismas rutinas esta pero en distintos lugares en la versión
nueva, hice una anterior porque un amigazo me pidió que había tratado con esta versión y
que lo ayude y entonces me puse a hacer esta.
Ya saben que los Oodrives que había puesto para guardar los programas que se crackean
parece que van a comenzar a cobrar, hasta ahora están allí no se por cuanto tiempo mas ,
pero también están los kturns en los cuales cualquiera yendo a http://www.kturn.com/ y
sacándose un kturn propio que es gratuito, te da 125 megas y puede desde el suyo acceder a
los míos.
Entra al propio kturn va a donde dice OTHER USERS y allí pone cualquiera de estas tres
claves :
ricnar458
ricnar457
ricnar456
que son los tres diferentes kturns que hay del curso con los programas, herramientas, y todo
lo necesario.
Bueno sigamos adelante.
Lo primero que hay que hacer luego de instalarlo es localizar donde guarda en la memoria
la clave falsa que yo introduzco, para eso veamos primero como se hace en SOFTICE y
después como se podría hacer en TRW2000. Pongo la clave falsa 9898989898.
Una vez que para dentro del HMEMCPY hay que tracear hasta que lleguemos a una
sentencia Repz movsd en 015f:9f20, allí hago d es:di
que es donde va a guardar la clave falsa.,sigo con F10 hasta unas sentencias mas abajo
hasta repz movsb y al ejecutarlo se termina de copiar la clave falsa a la memoria si no se ve
hay que subir una línea en la ventana de datos allí veo en la parte del contenido
39 38 39 38 ....
que son los números hexa que corresponden a 989898... y a la derecha
989898...
Ahora tecleo PAGE mas la dirección de memoria donde esta la primera cifra de la clave,
esto puede variar en la mía es 1197:0000
por lo tanto hago
PAGE 1197:0000
y me sale como resultado
LINEAR
6ff450
que es la posición de memoria de 32 bits donde esta la clave
hago
d 0030:6ff450
y allí esta la clave falsa ya en la memoria.
Esto localiza donde guardo la clave en el SOFTICE ahora en el TRW2000 la
función PAGE existe pero no funciona igual, no da el mismo resultado y con
el método anterior lo único que logre es que la ventana de datos no muestre
mas nada y quede enganchada en modo 16 bits (PROT 16) y tenga que cerrar el
TRW2000 y volver a abrirlo para que muestre de vuelta en 32 bits (PROT 32)
Quizás la mejor manera en TRw2000 cuando caes en HMEMCOPY seria seguir
traceando con F10 hasta volver al ejecutable o sea que ya estamos en 32 bits
y allí hacer una búsqueda. (esto sirve también en el SOFTICE igual)
S 0 L FFFFFFFF '9898989898'
'Las comillas deben ser estas ' no estas " y después de la S va un cero.
Allí aparecerá donde esta la clave falsa, puedo teclear nuevamente S y enter para que
busque a continuación a ver si aparece en algún otro lado pero es poco probable
Bueno en el SOFTICE ahora habría que poner un breakpoint que abarque todas
las cifras de la clave falsa cosa de que cuando el programa lea o haga algo
con alguna cifra pare allí la sentencia para SOFTICE seria.
BPR INICIO FINAL rw
aquí seria
BPR 6ff450 6ff460 rw
(SOFTICE)
Ya que la clave abarca desde 6ff450 hasta 6ff460 entonces con este breakpoint
cada vez que lea o escriba allí parara.
Lamentablemente (Y MUCHO) en el TRW2000 no existen breakpoints de rango solo
existen BPMs individuales o sea poner un BPM 6ff450 rw haría que parara allí
cuando lea o escriba algo solo en la primera cifra de la clave.
Encima por la arquitectura del BPM diferente al BPR no para justo cuando lee
o escribe de 6ff450 sino parara justo la sentencia posterior así que cuando
pongamos un BPM y pare siempre hay que mirar la sentencia anterior a la que
paro. Primero borramos con BC* el BPX HMEMCPY.
Bueno que vamos a hacer paciencia si usamos TRW2000 paciencia pongamos un BPM
6ff450 rw BPM 6ff451 rw y
así sucesivamente en todas las cifras.
Luego de hacer eso hay que hacer X y ver cuando el programa trata de hacer
algo con la clave.
Aquí entonces habría que ir analizando cada vez que el programa trata de hacer algo con la
clave, y si la trata de copiar a otra dirección volver a poner BPRs en los lugares donde la va
copiando o guardando para que siempre el SOFTICE pare cuando trate de hacer algo con
las cifras de la clave.
Bueno aquí vamos a empezar a bailar de a poquito, yo me olvide pero tenemos
que cambiar la clave falsa por otra mas practica en vez de 989898... que es
la que a mi me gusta aquí vamos a usar otra 123456789ABCDE que nos da la ventaja
de saber fácilmente por el valor que cifra esta trabajando ya que en la otra
si trabaja con un nueve no sabemos si es el primero el tercero, el quinto o
cualquiera de los otros así que repitamos todo de nuevo con la clave
123456789ABCDE.
Bueno ya tenemos todo listo para empezar y traceamos un poco antes de empezar a darle a
X y en la comparación de 418850 vemos que si la clave que poníamos era menor que 14
cifras nos tiraba al tacho ya que ebp tiene el numero de cifras y 0E es 14 en decimal.
Como la que pusimos es de 14 cifras no salta y sigue dentro de la comparación.
:00418850 83FD0E
:00418853 0F8229010000
cmp ebp, 0000000E
jb 00418982
le damos a que siga con X y caemos en esta parte
:00449898 41
:00449899 8A06
:0044989B 0AC0
:0044989D 7407
:0044989F 46
:004498A0 0FA30424
:004498A4 72F2
inc ecx
mov al, byte ptr [esi]
or al, al
je 004498A6
inc esi
bt dword ptr [esp], eax
jb 00449898
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044989D(C)
|
:004498A6 8BC1
mov eax, ecx
Bueno parece no servir para mucho toma en 449899 la primera cifra le aplica
la función OR queda igual que antes luego incrementa el contador del bucle y
aplica BT que la verdad es la primera vez que veo BT, en 4498a0 pero no parece
hacer nada quizás sea una comprobación inútil ya que BT parece no cambiar
ningún registro ni el STACK, ni posición de memoria, por ahora lo dejamos ya
que no parece útil, cualquier cosa volveremos por aquí.
Llegamos una vez que termina con todas las cifras a 4498a6.
Bueno adelante seguimos y caemos en 41887a.
:0041887A 80382D
:0041887D 7503
:0041887F 40
:00418880 EBF8
cmp byte ptr [eax], 2D
jne 00418882
inc eax
jmp 0041887A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041887D(C)
|
:00418882 8A10
mov dl, byte ptr [eax]
:00418884 8811
mov byte ptr [ecx], dl
:00418886 41
inc ecx
:00418887 40
inc eax
:00418888 3BCD
cmp ecx, ebp
:0041888A 72EE
jb 0041887A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418878(C)
|
:0041888C 802100
and byte ptr [ecx], 00
Aquí en 41887a compara la primera cifra con 2d que es el guión - , si no es
guión salta el subsiguiente salto que llega a 4188d2, allí carga esa cifra a
DL y la copia en el contenido de ECX o sea en el mismo lugar que estaba.
Hace eso cifra por cifra, bueno si en 41887a encuentra un guión
directamente no lo va a guardar y pasa a la cifra siguiente con lo que
transforma una clave con guión en una completamente limpia sin guión.
Vaya a saber porque hace esto, bueno lo tendremos en cuenta.
Bueno adelante
Caemos en bff7117e REPNZ SCASB y que demonios es esto.
la experiencia del que crackeo mucho sabe que esta sentencia se encuentra
dentro de la función lsrtlen que es para sacar la cantidad de cifras
nuevamente.
Una vez que traceando con F10 llegamos al ejecutable en EAX quedo la
cantidad de cifras de la clave de la memoria.
Eax tiene 14 en hexa es 0e.
Estamos en 435cA3
:00435CA3 50
push eax
Y dado que va a hacer PUSH EAX justo que EAX tiene el valor de la cantidad
de cifras y lo va a guardar veamos como es el mecanismo y donde lo guarda
con la sentencia PUSH.
La sentencia PUSH guarda en el STACK que es como un archivo que no deja de
ser parte de la memoria.
El registro ESP que quiere decir STACK POINTER es el que apunta a donde esta
el stack y cual es el valor que dado que el stack es una pila de valores,
apunta al valor que esta encima de la pila.
al hacer PUSH EAX agregamos un valor al stack y si vemos con D ESP allí en
6feec0 esta como primer numerito el 0e que guardo luego de ejecutar la
sentencia PUSH EAX.
Bueno ya que esta allí guardado por algo (???) pongamos un BPR allí en el SOFTICE
o un BPM en el TRw2000 por si alguna vez lo busca de allí para realizar
alguna comparación.
BPR 6feec0 6feec0 rw (softice)
BPM 6feeco rw (trw2000)
Ahora para en 448a48 y trabaja con el valor 0e ese que estaba guardado en el stack
pero no se ve nada importante por aquí
Luego de terminar allí para en 435d72
donde hace un PUSH y borra el valor de la cantidad de cifras que había
guardado en 6feec0 por lo que ya puedo borrar ese BPR o BPM de allí.
Para ahora en 448b5c y empieza la joda.
:00448B5C 8B448EF4
:00448B60 89448FF4
:00448B64 8B448EF8
:00448B68 89448FF8
:00448B6C 8B448EFC
:00448B70 89448FFC
:00448B74 8D048D00000000
:00448B7B 03F0
:00448B7D 03F8
:00448B7F FF2495888B4400
mov eax, dword ptr [esi+4*ecx-0C]
mov dword ptr [edi+4*ecx-0C], eax
mov eax, dword ptr [esi+4*ecx-08]
mov dword ptr [edi+4*ecx-08], eax
mov eax, dword ptr [esi+4*ecx-04]
mov dword ptr [edi+4*ecx-04], eax
lea eax, dword ptr [4*ecx+00000000]
add esi, eax
add edi, eax
jmp dword ptr [4*edx+00448B88]
Aquí en la primera línea copia a EAX las cuatro primeras cifras al revés
34333231 o sea 4321 y en la siguiente las guarda en 6fef04, y va armando
allí la clave.
Luego toma las siguientes y las copia a continuación y las próximas también
o sea que en 6fef04 queda
123456789ABC
Copia hasta allí y llega al salto en 448b7f cada vez que la clave es copiada
a otro lugar hay que poner un BPR o BPMs que abarquen el nuevo lugar donde
esta la clave sin borrar los bPRs o BPMs anteriores.
Entonces pongo
bpr 6fef04 6fef13 rw (softice)
Bpm 6fef04 rw ...... hasta
bpm 6fef13 rw
(trw2000)
y sigo con X
Ahora para en 448bac para terminar de copiar toda la clave al nuevo lugar
:00448BAC 8A06
:00448BAE 8807
:00448BB0 8A4601
:00448BB3 884701
:00448BB6 8B4508
:00448BB9 5E
:00448BBA 5F
:00448BBB C9
:00448BBC C3
mov al, byte ptr [esi]
mov byte ptr [edi], al
mov al, byte ptr [esi+01]
mov byte ptr [edi+01], al
mov eax, dword ptr [ebp+08]
pop esi
pop edi
leave
ret
Mueve la primera cifra a AL y lego la copia a [EDI] que es a continuación de
donde esta guardando la clave
, sigue con la ultima cifra y llega al RET con la clave toda copiada en
6fef04.
No olvidar poner los BPR o BPMs allí seguimos.
para en
:0042BD8A 8A0408
:0042BD8D 50
mov al, byte ptr [eax+ecx]
push eax
All toma el valor de la letra D o sea 44 y lo mueve a AL luego lo hace PUSH
y lo manda al STACK así que luego de ejecutar el PUSH hago
D ESP para ver donde lo guardo
Esp es 6fee14 , y allí guardo el 44
Pongo BPM 6fee14 rw o BPR 6fee14 6fee14 rw (se entiende SOFTICE o TRW2000
ya no lo voy a repetir mas).
Este proceso va a ser repetitivo para cada cifra.
Para en 42bdd6
:0042BDD6 8A442404
:0042BDDA 3C61
:0042BDDC 720B
:0042BDDE 3C7A
:0042BDE0 7707
:0042BDE2 0FB6C0
:0042BDE5 83E820
:0042BDE8 C3
mov al, byte ptr [esp+04]
cmp al, 61
jb 0042BDE9
cmp al, 7A
ja 0042BDE9
movzx eax, al
sub eax, 00000020
ret
Este bucle es para pasar si hay minúsculas a mayúsculas brevemente compara
con 61 (letra a minúscula) y si es mayor por ejemplo 64 que es d minúscula le
resta 20 para hacerlo 44 que es D mayúscula, eso es todo.
Luego viene una parte importante
:0042BD97 663D3000
:0042BD9B 59
:0042BD9C 720D
:0042BD9E 663D3900
:0042BDA2 7707
:0042BDA4 05D0FF0000
:0042BDA9 EB11
cmp ax, 0030
pop ecx
jb 0042BDAB
cmp ax, 0039
ja 0042BDAB
add eax, 0000FFD0
jmp 0042BDBC
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042BD9C(C), :0042BDA2(C)
|
:0042BDAB 663D4100
cmp ax, 0041
:0042BDAF 7220
jb 0042BDD1
:0042BDB1 663D4600
cmp ax, 0046
:0042BDB5 771A
ja 0042BDD1
:0042BDB7 05C9FF0000
add eax, 0000FFC9
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042BDA9(U)
|
:0042BDBC 0FB7C0
movzx eax, ax
:0042BDBF C1E704
shl edi, 04
:0042BDC2 0BF8
or edi, eax
:0042BDC4 46
inc esi
:0042BDC5 663B742410
cmp si, word ptr [esp+10]
:0042BDCA 72B7
jb 0042BD83
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042BD81(C)
|
:0042BDCC 8BC7
mov eax, edi
El que quiera saltear esta partecita sepa que esta hecha solo para despistar.
Bueno aquí compara el valor si esta entre 0 y 9 primero si esta entre 0 y 9
esta bien sino pasa a la parte de letras y compara si esta entre A (41)y F
(46) esta bien sino parece que te tira al tacho.
O sea que solo acepta letras pero que signifiquen números en HEXA porque?
Veamos
Luego veo que en eax me quedo la misma letra o sea EAX=D y luego de hacer
todo el mismo proceso con la letra E en 42bdcc eax es DE o sea en letras las
dos ultimas cifras de la clave.
EAX=DE
Entonces por eso no acepta letras mayores que F ya que va a operar
directamente con las letras y no puede hacer eso si la letra es G ya que no
es un valor hexadecimal que pueda almacenar en algun lado.
Luego en 42be30
:0042BE30 8945FC
mov dword ptr [ebp-04], eax
Mueve a [Ebp-04] el valor DE que estaba en EAX.
Ebp-04 alli es 6feeb0 asi que pongamos un BPM o BPR alli
Bpr 6feeb0 6feec0 rw o BPM 6feec0 rw hasta 6feec5 por lo menos.
Para ahora en
:00448BAC 8A06
:00448BAE 8807
:00448BB0 8A4601
:00448BB3 884701
:00448BB6 8B4508
mov al, byte ptr [esi]
mov byte ptr [edi], al
mov al, byte ptr [esi+01]
mov byte ptr [edi+01], al
mov eax, dword ptr [ebp+08]
Donde toma el DE y lo mueve a AL y luego lo copia a [EDI], o sea que ahora
DE también está en 6feed6
BPR o BPM allí
Ufff sigamos
Ahora repite el proceso con todas las cifras pero lo voy a obviar porque la verdad no sirve
para nada, esta solo para despistar.
UN MEDICO PARA EL CRACKER POR FAVOR jua jua
pongo resaltado lo que sigue ya que es la rutina de comparación:
Uff la verdad es que es una rutinita resimple la que compara las cifras de
la clave del SNAGIT pero da tantas vueltas y desorienta tanto que a veces uno
se pierde. si vieran la cantidad de hojas que llene para llegar al final a
una simple comparación jua jua.
Lo que pasa es que con esto de perseguir claves yo cometí un error, hay que
hacer una mirada hasta el final de todos los lugares donde va parando tipo
superficial y luego si, si uno no encuentra alguna parte como esta que vamos
a ver se pone a fondo a buscar la clave.
La rutina de comparación es esta:
:0042BE99 8A0438
:0042BE9C 50
:0042BE9D E834FFFFFF
:0042BEA2 59
:0042BEA3 8A4C35DC
:0042BEA7 83E10F
:0042BEAA 38440DEC
:0042BEAE 7510
mov al, byte ptr [eax+edi]
push eax
call 0042BDD6
pop ecx
mov cl, byte ptr [ebp+esi-24]
and ecx, 0000000F
cmp byte ptr [ebp+ecx-14], al
jne 0042BEC0
En 42be99 para ya que allí había un BPR porque en EAX+EDI esta la clave
falsa.
Pasa a AL la primera cifra.
en 42beaa la compara con la primera cifra verdadera, en el SOFTICE aparece
arriba a la derecha en el TRW2000 hay que hacer
d ebp+ecx-14 , en mi caso en el primer
lugar esta el 34 que corresponde al 4, al no ser igual ya que mi primera
cifra de la clave falsa es uno ya me va a tirar fuera por lo que borro todos los BPs con BC*
y
pongo un BPX allí en la comparación bpx 42beaa y salgo hasta el cartelito de
mala clave.
Cambio la primera cifra por la que encontré verdadera y la primera vez no me tira
afuera (ya que la cambie, jua jua) , la segunda vez que para vuelvo a hacer d ebp+ecx-14 y
me fijo la
segunda cifra, la anoto que en mi caso es 31 o sea 1 y salgo de vuelta la
cambio y vuelvo a entrar así hasta que descubro que mi clave es 415387b4
esas son las cifras que testea a partir de allí las siguientes son de
relleno hasta tener las 14 cifras por ejemplo.
415387b4ffffffff
Esa seria mi clave o podría cambiar las f por otra cosa igual me registra ya
que solo testea las 8 primeras.
Ahí ven mi nombre de usuario Chancho y mi clave 415387B4............ LAS SIGUIENTES
CIFRAS SOLO ESTAN PARA RELLENAR HASTA EL NUMERO 14 LA CANTIDAD
DE CIFRAS.
Ah me olvidaba de decir que para que se habilite la opción de ingresar la clave que esta
desactivada primero hay que ir a donde se ingresan los datos de nombre de usuario y
compañía y recién allí se habilita el botón ENTER KEY para ingresar la clave.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
RELOJ NO MARQUES LAS HORASSSSSS
(LECCION CUARENTA Y NUEVE)
Este título se refiere a que hay programas que funcionan full durante el periodo de prueba y
que uno cuando mira un poquito ve que buscar registrarlos es complicado entonces busca
otra alternativa que funciona para mi, y como yo soy cracker pero a veces un poquito
perezoso, siempre trato de buscar la mas fácil que haga que el programa funcione.
El programa en cuestión es el Microangelo 5 es para editar iconos y todas esas cosas, aquí
dice lo que hace.
What do you want to do?
Improve my computer's icon display How?
Browse, view, and search for icons. How?
Change icons and cursors on my computer. How?
Organize icons in libraries. How?
Edit icons and cursors. How?
Bueno eso hace es un editor de iconos, y mucho mas.
La versión que estoy crackeando es la 5.02 y se baja de
http://www.impactsoft.com/
Pero me parece que ya salió allí la versión 5.5 bueno en el Kturn subiré esta la 5.02 aunque
no debe haber mucha diferencia en la forma de crackearlo.
En principio cuando realizamos algún cambio en cualquier archivo nos sale un cartelito que
dice que hay un problema con el muapp.dll y que debemos instalar de nuevo el programa.
En esta protección que es un cartelito tipo messageboxa , no podemos poner un Bpx
messageboxa y una vez que para, fijarnos nada pues esta hecho para que una vez que sale
el messageboxa no vuelve nunca mas al programa y lo cierra, por lo que no podemos volver
al ejecutable.
Para ir de a poco dejemos todo como esta original y cambiemos algún valor que no haga
que deje de funcionar obviamente en ese muapp.dll, puede ser las características de las
secciones o cualquier valor que no importe mucho solo es para probar.
Reemplazamos el muapp.dll por el modificado, corremos el programa y zas, otra vez ese
cartel maléfico.
Bueno, habrá que tracear hasta ver cuando aparece, antes de ejecutar el programa de nuevo
uso un BPX getversion y ejecuto, cuando para vuelvo con F12 al ejecutable y comienzo a
tracear y tracear y tracear.
La protección para cuando realizamos cambios solo en el muapp.dll esta aquí.
:6400137E FF1578800064
:64001384 A140A00064
:64001389 8B542414
:6400138D 3BD0
:6400138F 740F
:64001391 5F
:64001392 5E
:64001393 5D
:64001394 33C0
:64001396 5B
:64001397 81C4B8020000
:6400139D C20C00
Call dword ptr [64008078]
mov eax, dword ptr [6400A040]
mov edx, dword ptr [esp+14]
cmp edx, eax
je 640013A0
pop edi
pop esi
pop ebp
xor eax, eax
pop ebx
add esp, 000002B8
ret 000C
Yo compare además con el muapp.dll sin modificar cuando no aparece el cartelito y allí el
programa llega a 6400138d y salta, en cambio el modificado, llega a ese salto y no salta
sigue hasta el RET donde una vez que llega allí va a funciones de windows sale el cartelito
y se cierra el programa y nunca mas vuelve.
Por lo tanto lo que hay que hacer primero es cambiar ese salto condicional a JMP.
6400138f 74 0f hay que cambiar el 74 por EB y listo ya arranca igual aunque tenga
cambios el dll.
La siguiente parte de la protección es cuando realizamos un cambio en alguna de las
aplicaciones como Librarian o Muapanel, nos aparece un cartelito similar al que
parcheamos recién pero en otro lugar mas adelante.
Aquí hay dos RET y dos saltos.
:640015A7 7523
jne 640015CC
* Possible Reference to String Resource ID=00001: "I &Agree"
|
:640015A9 B801000000
mov eax, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:64001569(C), :64001580(U), :64001597(U)
|
:640015AE 8B542414
mov edx, dword ptr [esp+14]
:640015B2 8B0C8530A00064 mov ecx, dword ptr [4*eax+6400A030]
:640015B9 3BD1
cmp edx, ecx
:640015BB 743D
je 640015FA
:640015BD 5F
pop edi
:640015BE 5E
pop esi
:640015BF 5D
pop ebp
:640015C0 33C0
:640015C2 5B
:640015C3 81C4B8020000
:640015C9 C20C00
xor eax, eax
pop ebx
add esp, 000002B8
ret 000C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:640015A7(C)
|
:640015CC 8D442430
lea eax, dword ptr [esp+30]
* Possible StringData Ref from Data Obj ->"engineer.exe"
|
:640015D0 6814A10064
push 6400A114
:640015D5 50
push eax
:640015D6 FFD6
call esi
:640015D8 F7D8
neg eax
:640015DA 5F
pop edi
:640015DB 5E
pop esi
:640015DC 1BC0
sbb eax, eax
:640015DE 5D
pop ebp
:640015DF 40
inc eax
:640015E0 5B
pop ebx
:640015E1 81C4B8020000
add esp, 000002B8
:640015E7 C20C00
ret 000C
Bueno aquí es igual en cualquiera de los dos RET que cae aparece el cartelito, así que
entonces en el primer salto no debe saltar o sea hay que nopearlo entonces cae en el
segundo que si salta esquiva los dos RET.
Entonces nopeamos el primero y hacemos JMP el segundo y adiós protección podemos
modificar lo que querramos que funciona igual.
640015a7 75 23 cambiar por 90 90 y
640015bb 74 3d cambiar por eb 3d .
Ahora como ya dijimos vamos al funcionamiento, miremos un poco el LIBRARIAN que es
una de las utilidades que trae.
Sabemos que las funciones para que el programa se entere de la fecha son
GETLOCALTIME o GETSYSTEMTIME.
Si cargamos el Librarian en el Wdasm y vamos a IMP FN el botón que muestra las
funciones importadas, vemos que GETLOCALTIME y GETSYSTEMTIME solo una vez
dentro del programa son llamadas en.
* Reference To: KERNEL32.GetLocalTime, Ord:012Fh
|
:004157AA FF15ACB14100
:004157B0 8D45E0
:004157B3 50
Call dword ptr [0041B1AC]
lea eax, dword ptr [ebp-20]
push eax
* Reference To: KERNEL32.GetSystemTime, Ord:0174h
O sea que si recorremos un poco poniendo un BPX allí y entramos dentro de la función
GETLOCALTIME veremos que guarda la fecha en este caso en 65f960 y
GETSYSTEMTIME justo arriba en 65f950.
Por ejemplo veremos algo así luego de pasar las dos funciones:
65f950 D1 07 0A 00 04 00 .. .. ..
65f960 D1 07 0A 00 04 00 .. .. ..
D107 es al reves 07d1 el año 2001
000A es el mes 10
0004 es el dia 4
La fecha puede variar según en que día estemos jua jua.
Puedo probar que pasa si allí mismo edito la fecha para cambiarla haciendo
E 65f950
y cambiando los valores
, si hago pruebas veo que la que varia los días de evaluación es la que halla BPX
GETLOCALTIME o sea la de abajo la de 65f960.
Si cambio d1 por d2 o sea al año 2002 me dice que expiro y que va como un año de
evaluación lo mismo con los días y el mes.
Pongamos un bpr allí a ver cuando el programa lee esa fecha que esta en la memoria pero
aun no la leyó.
Bpr 65f960 65f966 r
Hago X y ENTER
Para en
00415857 0FB745F6
:0041585B 50
:0041585C 0FB745F2
:00415860 50
:00415861 0FB745F0
:00415865 50
movzx eax, word ptr [ebp-0A]
push eax
movzx eax, word ptr [ebp-0E]
push eax
movzx eax, word ptr [ebp-10]
push eax
aquí es donde el programa guarda la fecha actual o sea en la primera sentencia pasa el día
actual a eax en la segunda el mes y en la tercera el año.
Si uno cambia aquí que a EAX pase una fecha con el cual el programa funciona en forma
fija siempre va a quedar en ese día para siempre.
Quedo así para mi
:00415857 B00E
:00415859 90
:0041585A 90
:0041585B 50
:0041585C B00A
:0041585E 90
:0041585F 90
:00415860 50
:00415861 B0D1
:00415863 B407
:00415865 50
mov al, 0E
nop
nop
push eax
mov al, 0A
nop
nop
push eax
mov al, D1
mov ah, 07
push eax
En la primera muevo a AL el valor 0e o sea el día 14
nopeo dos veces ya que la sentencia es mas corta en 41585c muevo a AL el valor 0a del
mes 10 y en la tercera tengo que hacerlo en dos partes muevo a AL D1 y a AH 07 como
resultado en EAX queda 07d1 que es el Año 2001 o sea que con esto congelo la fecha en el
primer día de evaluación mío 14/10/2001. Lo mismo existe en las otras aplicaciones.
Ahora en Muapanel es similar
Bpx getlocaltime es la que maneja todo en muapanel también
Getlocaltime esta en 40a082
y guarda la fecha en 5bfaec.
Al salir si ponemos un BPR 5bfaec 5bfaef r
para en 40a12f que la parte similar a la que parcheamos en librarian
Aquí ya esta modificada
:0040A12F B00E
:0040A131 90
:0040A132 90
:0040A133 50
:0040A134 B00A
:0040A136 90
:0040A137 90
:0040A138 50
:0040A139 B0D1
:0040A13B B407
:0040A13D 50
mov al, 0E
nop
nop
push eax
mov al, 0A
nop
nop
push eax
mov al, D1
mov ah, 07
push eax
Recuerden de poner una fecha para la cual el programa para ustedes funcione, no copien la
misma que la mía ya que así no funcionara, fíjense la fecha en que lo instalan y pongan esa
fecha y siempre el programa estará en el primer día de evaluación.
Las otras aplicaciones que tiene son similares y se las dejo para que practiquen.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com
CRACKEANDO CIEGO
(LECCION CINCUENTA)
El programa que vamos a crackear hoy es el Xguest Inviter Bot 1.72 , la versión no es la
ultima creo que va por la 1.82 o 83 no se, pero sirve para practicar y es un programa para
conectarse a IRC .
Aquí la novedad es que a pesar de conseguir el serial valido que nos registra, cuando nos
conectamos a INTERNET para usar el programa, verifica que no es un usuario que pago el
REGISTRO y sale un cartel diciendo que infringiste la licencia y te cierra el programa.
Les diré que tiene sus bemoles crackear este programa ya que esta muy protegido inclusive
amigos que han instalado versiones posteriores a esta y después han querido usar esta mas
vieja, no te deja, dice que tenés que usar la ultima versión o algo así, como a mi eso no me
ocurrió ya que no instale la ultima solo esta, no puedo saber como saltear eso, pero no debe
ser difícil ya que son simples messageboxa.
Ya saben que el programa va a estar en el Kturn y OOdrive para bajarse, para crackear y
practicar.
Otro tema son las consultas que generalmente me hacen a mi mail
ricnar22@millic.com.ar, como yo me voy a mudar ese mail no se si va a seguir
funcionando ya que no se que servicio de internet tendré en el otro departamento, así que
hasta que me mude, pueden escribirme a ricnar456@data54.com que es WEBMAIL y va
a seguir funcionando vaya a donde vaya, disculpen si demoro en las respuestas estos días,
pues estaré de mudanza y sin internet, aunque en mi trabajo si tengo y leeré allí mis mails.
Sigamos con este tema.
El ejecutable del Xguest esta compactado con PECOMPACT me dice el Unpack y dice que
lo puede descomprimir, lo hago y tengo el ejecutable descomprimido, que oh sorpresa salen
las Funciones Importadas pero no las STRINGS REFERENCES así que crackearemos
ciegos.
Además esta hecho en DELPHI, como información, aunque el DEDE tampoco dice mucho.
Como primer paso hay que hallar una clave para registrarnos valida, utilizando el método,
de HMEMCPY y poner BPRs en donde aparece la clave falsa siguiendo los lugares donde
el programa lee la clave, veo que después de un SCASB que para el SOFTICE, como esa
sentencia es generalmente parte de lsrtlen que mide el largo de mi clave falsa 98989898
cuando vuelve al ejecutable sale siendo EAX=8 o la cantidad de cifras que tiene la que
ustedes colocaron.
Siguiendo ese EAX=8 , si lo guarda con PUSH EAX viendo con D ESP donde lo guardo
siguiendo con los BPRs vemos que para en
:00404057 8B46FC
:0040405A 8B57FC
:0040405D 29D0
:0040405F 7702
mov eax, dword ptr [esi-04]
mov edx, dword ptr [edi-04]
sub eax, edx
ja 00404063
Allí carga en EAX y en EDX la cantidad de cifras de la clave falsa y de la verdadera, y
encima esos valores están delante de ambas claves así que si cuando estamos en 404057
hacemos D ESI-04 y D EDI-04 veremos la clave falsa y la verdadera fácilmente.
En mi caso la clave para registrase fue:
User: narvaja
Password: 4B899FE
Así con minúsculas el nombre y la clave toda en mayúsculas, allí cualquiera puede obtener
su propia clave, o usar la mía si quieren.
Bueno pongo esa clave y user y me registra, ahora cuando intento usar el programa y se
conecta a INTERNET me aparece un messageboxa bastante feo que dice que rompí la
licencia.
Pongo un BPX messageboxa allí para que pare el Softice cuando aparece el cartel ese
maléfico, cuando vuelvo al ejecutable veo que ese messageboxa es llamado desde:
:0044CFFD 50
push eax
* Reference To: user32.MessageBoxA, Ord:0000h
|
:0044CFFE E8DDA7FBFF
Call 004077E0
En el Wdasm puedo mirar hacia arriba para ver si hay algunos saltos que esquiven este
messageboxa.
Los saltos que están un poco mas arriba no sirven ya que no esquivan el messageboxa, sigo
hacia arriba hasta que llego al REFERENCE este.
* Referenced by a CALL at Addresses:
|:0044D10D , :0048F77F , :0049BC63 , :004C9886 , :004CA09B
|:004CA7AE , :004CADAB , :004CDEE4 , :004CE1F6 , :004D09C4
Esos son los lugares desde donde entra al CALL donde sale el messageboxa fastidioso,
poniendo BPX en todos estos lugares para ir viendo de donde es llamado, vemos que la
primera vez para en 4CADAB, y un poco mas arriba esta el salto para parchear en
:004CAD45 757A
jne 004CADC1
Este es el primer salto a parchear, cambiándolo por JMP 4CADC1
Con eso ya no nos sale el cartel maldito apenas nos conectamos, pero aparece en otros
lugares que yo constate, que son otros lugares que están en ese REFERENCE de mas
arriba.
004CDEE4 , :004CE1F6
En estos lugares paro en SOFTICE pues había puesto BPXs en todos esos valores, cada
uno tiene un salto un poco mas arriba que hay que cambiar por JMP.
Cuando para en 4cdee4 un poco mas arriba en 4cde8d también hay un salto para parchear.
:004CDE8D 757C
jne 004CDF0B
aquí también hay que cambiar por jmp 4CDF0B
cuando para en 4CE1F6 HAY UN SALTO MAS ARRIBA EN
:004CE19F 747F
je 004CE220
también hay que cambiar aquí por JMP para que no vaya al CALL del cartel maldito.
Con parchear estos saltos ya me pude conectar sin problemas y ingresar al IRC
perfectamente y recibir y enviar bien, de cualquier manera viendo que todavía quedan los
otros CALLs aunque a mi no me paro allí, el método si llega a caer dentro es el mismo
poner un BPX allí y parchear el salto que esquiva ese CALL, o también preventivamente se
puede mirar en el WDASM y parchear el salto que se encuentre antes de todos esos CALLS
y que eviten que caiga en ellos.
Ricardo Narvaja
DESCARGADO GRATUITAMENTE DE
http://visualinformatica.blogspot.com