3 Crackmes by Bocvk

Iniciado por _Bocvk_, 14 Agosto 2008, 23:32 PM

0 Miembros y 1 Visitante están viendo este tema.

_Bocvk_

Tres crackmes sencillos hechos en RadAsm espero poder mejorar aver si me dan algunos consejos :

Crackme 1 :
http://rapidshare.com/files/137362955/Crackme__1.rar

Crackme 2 :
http://rapidshare.com/files/137363059/Crackme__2.rar

Crackme 3 :
http://rapidshare.com/files/137363126/Crackme__3.rar


Cualquier duda , critica y/o sugerencia me dicen
Salu2

apuromafo CLS

#1
Solucion al crackme 1 y 2 y mi solucion para mi nombre 3

solucion 1
"dwfdlrjt"
solucion 2
"qd|~sddwd"
solucion 3
nombre
serial

apuromafo
]ny|oa]xo


CRACKME 1
pues colocamos un valor cualquiera para ver si rompe en el dialogo, pero no aparece nada
revisamos y hay unalinea llamada cmp eax, 8
Citar0040108F  |.  E8 0A010000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
00401094  |.  83F8 08       cmp     eax, 8

Citar00401097  |.  0F85 A4000000 jnz     00401141


ahi dice que compara con 8 valores sean letras o numeros

Citar004010B6  |.  68 9C314000   push    0040319C                         ; /String2 =
004010BB  |.  68 4C314000   push    0040314C                         ; |String1 =
004010C0  |.  E8 C7000000   call    <jmp.&kernel32.lstrcmpiA>        ; \lstrcmpiA

coloco como pass 11111111 y aparece la comparacion entre

Citar004010B6  |.  68 9C314000   push    0040319C                         ; /String2 = "fudfnphv"
004010BB  |.  68 4C314000   push    0040314C                         ; |String1 = "33333333"

por lo tanto lo sube en 3 numeros o letras

ahora bien donde ocurrio todo esto
Citar
0040109F  |.  68 74314000   push    00403174                         ; |Buffer = Crackme_.00403174
004010A4  |.  68 EE030000   push    3EE                              ; |ControlID = 3EE (1006.)
004010A9  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004010AC  |.  E8 ED000000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
004010B1  |.  E8 94000000   call    0040114A

pues hay un call

Citar00403174=00403174 (ASCII "crackmes")
el push dice crackmes


bueno pero lo importante es que sigue el codigo

Citar
0040114A  /$  33D2          xor     edx, edx
0040114C  |.  33C9          xor     ecx, ecx
0040114E  |>  8B91 24314000 /mov     edx, dword ptr [ecx+403124]
00401154  |.  83F2 02       |xor     edx, 2
00401157  |.  8991 4C314000 |mov     dword ptr [ecx+40314C], edx
0040115D  |.  41            |inc     ecx
0040115E  |.  3BC8          |cmp     ecx, eax
00401160  |.  74 02         |je      short 00401164
00401162  |.^ EB EA         \jmp     short 0040114E

ese es el primer loop

y en el segundo encuentro el causante de crear el 111 en 333

asi que lo aprovecharemos para encontrar el serial
Citar0040116E      83C2 03       add     edx, 3

lo cambio a
Citar0040116E      83EA 03       sub     edx, 3

y ejecutamos
Citar

00401164  |>  33D2          xor     edx, edx
00401166  |.  33C9          xor     ecx, ecx
00401168  |>  8B91 74314000 /mov     edx, dword ptr [ecx+403174]
0040116E      83EA 03       sub     edx, 3
00401171  |.  8991 9C314000 |mov     dword ptr [ecx+40319C], edx
00401177  |.  41            |inc     ecx
00401178  |.  3BC8          |cmp     ecx, eax
0040117A  |.  74 02         |je      short 0040117E
0040117C  |.^ EB EA         \jmp     short 00401168
0040117E  \>  C3            retn
y como sabemos que  el correcto era
0040319C=0040319C (ASCII "fudfnphv")
pues colocamos en practica si quieren primero 33333333 y aparecera 11111111 asi que lo usamos ahora para saber el correcto

y aparece lo siguiente
Citar0040314C=0040314C (ASCII "dwfdlrjt")

copio el valor y restauro el algoritmo a como estaba, o mejor dicho cierro el olly e ingreso el valor "dwfdlrjt"


---------------------------
Bien
---------------------------
Lo lograste, espero que este crackme haya sido de tu agrado
---------------------------
Aceptar   
---------------------------

sep fue de mi agrado
---------------------------
Información
---------------------------
   <> Crackme #1 by Bocvk <>

           Encuentra el serial

          bocvk@hotmail.com

    Dedicado a CracksLatinos

               Perú - 2008
---------------------------
Aceptar   
---------------------------


CRACKME 2

ahora el 2do

pues comenzamos con lo mismo
Citar
00401094  |.  83F8 09       cmp     eax, 9
00401097  |.  0F85 A4000000 jnz     00401141
0040109D  |.  6A 0A         push    0A                               ; /Count = A (10.)
0040109F  |.  68 80314000   push    00403180                         ; |Buffer = Crackme_.00403180
004010A4  |.  68 EE030000   push    3EE                              ; |ControlID = 3EE (1006.)
004010A9  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004010AC  |.  E8 13010000   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
004010B1  |.  E8 94000000   call    0040114A
004010B6      68 A8314000   push    004031A8
004010BB  |.  68 58314000   push    00403158
004010C0  |.  E8 BB000000   call    00401180
004010C5  |.  0BC0          or      eax, eax
004010C7  |.  74 16         je      short 004010DF
004010C9  |.  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004010CB  |.  68 FE304000   push    004030FE                         ; |Title = "Bien"
004010D0  |.  68 00304000   push    00403000                         ; |Text = "Lo lograste, espero que este crackme haya sido de tu agrado"
004010D5  |.  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
004010D8  |.  E8 F3000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA


tenemos ahora 9 letras a comparar
y como tengo experiencia en el tema , cuando son numeros pequeños como la solucion de arriba se puede, pero aca ya lo considero un poco mas grande, asi que bueno vamos a el


analizemos de otra forma
si antes la palabra crackmes lo convertia a un valor y ese valor era comparado con el xor y proximamente con el add  pues debemos entender algo

todo xor puede ser reversible
por lo tanto tenemos que a xor b= c
c xor b = a
y a xor c= b

pues en ese sentido mas o menos seria lo de ahora


ahora bien son 3 algoritmos a entender o 3 trozos de codigo a entender
1)
Citar
0040114E  |> /8B91 30314000 /mov     edx, dword ptr [ecx+403130]
00401154  |. |83F2 08       |xor     edx, 8
00401157  |. |8991 58314000 |mov     dword ptr [ecx+403158], edx
0040115D  |. |41            |inc     ecx
0040115E  |. |3BC8          |cmp     ecx, eax
00401160  |. |74 02         |je      short 00401164
00401162  |.^\EB EA         \jmp     short 0040114E

2)
Citar
00401168  |> /8B91 80314000 /mov     edx, dword ptr [ecx+403180]
0040116E     |83C2 07       add     edx, 7
00401171  |. |8991 A8314000 |mov     dword ptr [ecx+4031A8], edx
00401177  |. |41            |inc     ecx
00401178  |. |3BC8          |cmp     ecx, eax
0040117A  |. |74 02         |je      short 0040117E
0040117C  |.^\EB EA         \jmp     short 00401168

3)
Citar
00401180  /$  55            push    ebp
00401181  |.  8BEC          mov     ebp, esp
00401183  |.  56            push    esi
00401184  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
00401187  |.  8B55 0C       mov     edx, dword ptr [ebp+C]
0040118A  |.  33F6          xor     esi, esi
0040118C  |>  8A040E        /mov     al, byte ptr [esi+ecx]
0040118F  |.  3A0416        |cmp     al, byte ptr [esi+edx]
00401192  |.  75 10         |jnz     short 004011A4
00401194  |.  83C6 01       |add     esi, 1
00401197  |.  84C0          |test    al, al
00401199  |.^ 75 F1         \jnz     short 0040118C
ahora bien un sitio estrategico para entender el final de todo esto es en  40118f
pues ahi comparara valor por valor

ahora bien comenzemos con un valor que no corresponde

ejemplo 1111111111

son 9 unos

cuando lleguemos en una ejecucion con un bp en
004010B1  |.  E8 94000000   call    0040114A

pues se vera un valor
Citar00403180=00403180 (ASCII "remoteexe")

a partir de este valor sera convertido  y verificado nuestro serial, pero obviamente no sera tan facil, o sera medianamente facil si se tiene paciencia

vamos
a convertirlo en otro ejemplo 1111
el resultado proximo seria un 888888888

pero eso es para referencia
osea solo ese valor se formaria
pero para las letras pues recomiendo este segundo metodo para resolverlo y veran que se entetendran


detenidos en el
Citar0040118F  |.  3A0416        |cmp     al, byte ptr [esi+edx]

ds:[004031A8]=79 ('y')
al=39 ('9')
aparece la famosa comparacion
aparece una y y yo tengo un 9, ese 9 proviene del 1er uno

asi que a modo de juego si cambio la y por el 1 que teniamos tendremos el valor real

es facil verlo, pero explicarlo no lo es tanto, pues solo lo comento para que salga mas facil resolverlo

sigamos
ahora cambio mi clave 111111111 a y11111111

y veo en mi lugar estrategico
Citards:[004031A8]=79 ('y')
al=71 ('q')

una q, bien, si ahora a esa q , la coloco en el lugar, puede que de y, pues seria el xor inverso

y xor desconocido= valor de ahora

y entre el mismo xor, pues es divertido ver esto

sigamos, no quiero que se enreden, vean que aparece una q
ahora cambiamos la palabra a
q11111111

y nuestro lugar ahora dice
Citards:[004031A8]=79 ('y')
al=79 ('y')
impresionante o no es una forma de resolver los famosos estilos de xor tuvimos el valor valido :)


ahora sigamos


si juntara todo pues seria algo asi
Citar004031A8  79 6C 74 76 7B 6C 6C 7F 6C                       yltv{lll
esos signos son raros, asi que debo ir lento

solo debo hacer es mirar el nuevo valor, copiarlo
y ver el valor nuevo que debo ingresar

pues me aprovecho que ya se donde esta el valor bueno y pego todos esos valores y me muestra lo siguiente
Citards:[004031A8]=79 ('y')
al=71 ('q')

ahora el truco esta en anotar el valor de al y falsear el nuevo valor

anoto el q y edito ese q para que sea 79
(modify register)

dejandolo asi

Citards:[004031A8]=79 ('y')
al=79 ('y')

ahora bien como ya tenemos un notepad amigo, pues pegamos los valores y los dejamos a mano

primera letra

Citards:[004031A8]=79 ('y')
al=71 ('q')


para el segundo
Citards:[004031A9]=6C ('l')
al=64 ('d')

para la tercera letra
Citards:[004031AA]=74 ('t')
al=7C ('|')

para la cuarta
Citards:[004031AB]=76 ('v')
al=7E ('~')

para la quinta
Citards:[004031AC]=7B ('{')
al=73 ('s')

para la sexta
Citards:[004031AD]=6C ('l')
al=64 ('d')

para la septima
Citards:[004031AE]=6C ('l')
al=64 ('d')
para la octava
Citards:[004031AF]=7F
al=77 ('w')

para la novena
Citards:[004031B0]=6C ('l')
al=64 ('d')
y despues saldra esto
Citards:[004031B1]=00
al=00
ahora bien juntamos todo

para cuando llegue a
Citar004010C5  |.  0BC0          or      eax, eax
eax valdra eax=00000009

y seria solucionado


ahora bien miramos el resultado
Citar00403158=00403158 (ASCII "qd|~sddwd")

interesante :)

---------------------------
Bien
---------------------------
Lo lograste, espero que este crackme haya sido de tu agrado
---------------------------
Aceptar   
---------------------------


ahora bien demosle a pegar ese serial "qd|~sddwd"

y esta resuelto :) y sin tener que modificar a un comando que puede que desconozcan

saludos

---------------------------
Información
---------------------------
   <> Crackme #2 by Bocvk <>



           Encuentra el serial

          bocvk@hotmail.com

    Dedicado a CracksLatinos

               Perú - 2008
---------------------------
Aceptar   
---------------------------


TERCER CRACKME


pues plantea nuestro amigo un reto novedoso

hacer que 2 loops sean iguales desde matematicas diferentes
encontre 1 entre un mini analisis
suma
xoreo
resta


y la segunda

suma
xoreo
resta

ahora bien los valores son diferentes


el truco es el siguiente
encontrar la logica de 1 letra es suficiente para encontrar las posibles letras




para nombre  con la letra j (sobre 6 veces la misma)
jjjjjj
pues el serial es la letra d
dddddd


y la comparacion sera asi
Citar004010BA  |.  68 2C324000   push    0040322C                         ; /String2 = "iiiiii"
004010BF  |.  68 F0314000   push    004031F0                         ; |String1 = "iiiiii"
004010C4  |.  E8 FF000000   call    <jmp.&kernel32.lstrcmpiA>        ; \lstrcmpiA

la letra i de comparacion igual

ahora bien existe una igual para cada letra, siempre y cuando se este dispuesto a encontrar para su letra, minimo requiere un buen tiempo que no tengo

pero si se puede hacer algo impresionante
es juntar un codigo ascii de 255 y lograr recopilar cada letra, por el tiempo solo busque para mi nombre



pero colocare para mi nombre apuromafo
Citara->]
p->n
u->y
r-| (alt 124)
o->o
m->a
a->] (alt+93)
f->x
o->o


apuromafo->"dspqvhdmv"
//
a->]
p->n
u->y
r-| (alt 124)
o->o
m->a
a->]
f->x
o->o






apuromafo
]ny|oa]xo


con esto dice
---------------------------
Bien
---------------------------
Lo lograste, espero que este crackme haya sido de tu agrado
---------------------------
Aceptar   
---------------------------


ahora bien



letra nombre->letra serial



Citarj->d
k->c
l->b
m->a

p->n
q->m

Citar0(48)->.(46) 
1(49)->-(45) 
2 50 ->< 60)   
3 51 ->;(59)
4(52)->0 (48)  ???
5(53)->/ (47)   ??

a ->]
` ->^
^ ->`
?->?
>->@


como bien tengo poco tiempo

Citar00401097  |.  83F8 06       cmp     eax, 6
comparacion con 6 de nombre

comparacion con 6 de serial
Citar004010B0  |.  83F8 06       cmp     eax, 6
004010B3  |.  72 47         jb      short 004010FC
004010B5  |.  E8 C1000000   call    0040117B
004010BA  |.  68 2C324000   push    0040322C                         ; /String2 = ""
004010BF  |.  68 F0314000   push    004031F0                         ; |String1 = ""
004010C4  |.  E8 FF000000   call    <jmp.&kernel32.lstrcmpiA>        ; \lstrcmpiA


las rutinas
Citar0040117B  /$  33C9          xor     ecx, ecx
0040117D  |.  33D2          xor     edx, edx
0040117F  |>  8B91 78314000 /mov     edx, dword ptr [ecx+403178]
00401185  |.  83C2 02       |add     edx, 2                          ;  1
00401188  |.  83F2 06       |xor     edx, 6
0040118B  |.  83EA 01       |sub     edx, 1
0040118E  |.  8991 F0314000 |mov     dword ptr [ecx+4031F0], edx
00401194  |.  41            |inc     ecx
00401195  |.  3BC8          |cmp     ecx, eax
00401197  |.  74 02         |je      short 0040119B
00401199  |.^ EB E4         \jmp     short 0040117F
0040119B  |>  33C9          xor     ecx, ecx
0040119D  |.  33DB          xor     ebx, ebx
0040119F  |>  8B99 B4314000 /mov     ebx, dword ptr [ecx+4031B4]
004011A5  |.  83C3 03       |add     ebx, 3
004011A8  |.  83F3 09       |xor     ebx, 9
004011AB  |.  83EB 05       |sub     ebx, 5
004011AE  |.  8999 2C324000 |mov     dword ptr [ecx+40322C], ebx
004011B4  |.  41            |inc     ecx
004011B5  |.  3BC8          |cmp     ecx, eax
004011B7  |.  74 02         |je      short 004011BB
004011B9  |.^ EB E4         \jmp     short 0040119F
004011BB  \>  C3            retn


donde se ve que  el primero valor
Citar0040117F  |> /8B91 78314000 /mov     edx, dword ptr [ecx+403178]
00401185  |. |83C2 02       |add     edx, 2                          ;  xxx
00401188  |. |83F2 06       |xor     edx, 6
0040118B  |. |83EA 01       |sub     edx, 1
0040118E  |. |8991 F0314000 |mov     dword ptr [ecx+4031F0], edx
00401194  |. |41            |inc     ecx
00401195  |. |3BC8          |cmp     ecx, eax
00401197  |. |74 02         |je      short 0040119B
00401199  |.^\EB E4         \jmp     short 0040117F
y el segundo valor
Citar0040119F  |> /8B99 B4314000 /mov     ebx, dword ptr [ecx+4031B4]
004011A5  |. |83C3 03       |add     ebx, 3
004011A8  |. |83F3 09       |xor     ebx, 9
004011AB  |. |83EB 05       |sub     ebx, 5
004011AE  |. |8999 2C324000 |mov     dword ptr [ecx+40322C], ebx
004011B4  |. |41            |inc     ecx
004011B5  |. |3BC8          |cmp     ecx, eax
004011B7  |. |74 02         |je      short 004011BB
004011B9  |.^\EB E4         \jmp     short 0040119F



pasa que e add, xor y sub debe ser igual entre las 2 de modo que
las dos sean identicas
como conozco mas o menos el alfabeto, dar una colicion con los centros es la primera opcion y vemos que sale de lujo


Citarh->f
i->e
j->d
k->c
l->b
m->a

ahora bien

apuromafo tiene varias letras y consonantes, y justo sobre 6 , asi que le hago el empeño y comparo en


pero como no necesariamente sigue la logicapues
Citar
004010BA  |.  68 2C324000   push    0040322C                         ; /String2 = "^^^^^^12"
004010BF  |.  68 F0314000   push    004031F0                         ; |String1 = "12_______"
004010C4  |.  E8 FF000000   call    <jmp.&kernel32.lstrcmpiA>        ; \lstrcmpiA

cada vez que coloco un valor  similar , pues copio el valor y la dejo en la tabla

esto es conocido como colision, porque por chocar un valor con otro, pues en un momento dado es encontrado

no siempre se vera el valor tan claramente, por algo deben probar para su nombre


la web con codigo ascii que sugiero es la siguiente
http://www.ascii.cl/es/codigos-html.htm


por lo demas, espero les vaya bien en el 3ro
y ojala me de el tiempo de hacer algun keygen mas presentable :)

saludos

se cuidan y si alguien resuelve mucho mejor o necesita alguna explicacion mayor, pues cuando tenga tiempo la complemento :) o aprendo de lo que comenten

por mi parte creo que estaria medianamente resuelto :)

_Bocvk_

Estuvo bien las soluciones jeje ya me espera k los resolvieran rapido :P ...
Aver si voy aumentando de nivel en los crackmes para k la distraccion sea un poco mas...
Salu2

karmany

Impresionante apuromafo, no has dejado ni respirar.
Yo acabo de ver el post ahora.

Gracias Bocvk por tus crackmes
Un saludo

apuromafo CLS

jej igual para la 3ra igual falta complementar
no he hecho ningun keygen de ninguno asi que si alguien quiere hacerlo
pues no esta mal :)

Gevaudan

apuromafo gracias por un tutorial claro y diciendo cada cosa lo que es, de todos modos le voy a echar un vistazo que asi vaya practicando y si tengo alguna duda ya veo donde mirar jajajaja, un saludo
Cuantas veces con el semblante de la devocion y la apariencia de acciones piadosas engañamos al diablo mismo.