Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - 4rS3NI(

#51
Buenas, el language es un programa bastante viejo y cuando no detecta el packer te larga VC++ si mal no recuerdo  :P, proba con peid, o con otros. Respecto a los strings puede que se generen a medida que corre el programa o que se encuentren en otra sección del ejecutable, proba usando el IDA para desensamblarlo

Saludos
#52
Buenas, podrias decirme de donde sacaste el stripper_v211rc2? ya me baje el programa que decis, pero no tengo ganas de cargarme al asprotect a mano  :P

Saludos
#53
Ingeniería Inversa / Re: Reto vB
16 Marzo 2005, 09:41 AM
Buenas, perdón por no responder antes, pero decidí estudiar...
Respecto a los retos, aquí pongo la solución para el key31.exe, la del key ya la posteé anteriormente y la del key7, pues todavía no lo trato XD.

Introducción

Como dije anteriormente, esto es solo una guía por si alguien quiere tratar de resolverlo por si solo. Agarramos el crackme, lo pasamos por el peid y dice upx, como en el léeme dice que el objetivo es sacar el serial, no vamos a ser muy extensos en el tema de descompresión. Si abrimos el crackme, vemos que es EXACTAMENTE IGUAL AL ANTERIOR: una ventana feísima y un botón salir (si no lo cambias para la próxima no lo resuelvo :P)

Desempacando

Cargamos el Cme en el olly y vemos que para en una instrucción pushad, usamos la función buscar comando en el código desensamblado y ponemos popad, le damos buscar y vemos que llegamos a un popad y justo debajo hay un salto que nos lleva bien lejos anotamos a donde nos lleva ese salto que es el entrypoint, el resto es igual que con todos los otros packers, dumpeamos, buscamos inicio y fin de la IAT, reconstruimos y listo, crackme desempacado (la otra es usar un programa que se cargue el packer, pero estaba aburrido así que le entré a mano)

Análisis (si se puede decir)

Vamos a usar el olly, el smartcheck, y un editor hexa. Lo abrimos con el smartcheck ponemos serial cualquiera (1234567890) clic en salir, se genera el evento en el Sc y cerramos el Cme.
Si miramos en el evento clic vemos que en un comienzo se toma nuestro serial y también vemos un string constante: 197.
Tanto los valores de esa constante como los de mi serial se pasan a los valores hexa que los representan en ASCII.
Después, de eso vemos una función que le hace algo a nuestro serial, pero no sabemos que; entonces procedemos igual que como lo hicimos con el crackme anterior (key), vemos la dirección de la instrucción en SC y nos vamos al olly. Una vez allí, hacemos un goto>expression y ponemos la dirección, traceamos un poco sin entrar en las calls, y vemos un poco después de una llamada a __vbaFreeVarList, que se suma a cada valor ASCII de nuestro serial uno de los valores ASCII correspondientes al 197, justamente de esto se encargaba esa función que no conocíamos en SC: alterna entre uno de esos caracteres que forma el 197 y lo usa como sumando junto con nuestro caracter. Queda así:

197=>Constante

1º caracter en ASCII + 31
2º caracter en ASCII + 39
3º caracter en ASCII + 31
4º caracter en ASCII + 39
5º caracter en ASCII + 31
6º caracter en ASCII + 39
7º caracter en ASCII + 31
8º caracter en ASCII + 39
9º caracter en ASCII + 31
10º caracter en ASCII + 39

Aquí vamos a obtener una combinación de letras.
Voy a ahorrarles trabajo diciéndoles, que lo que se obtiene aquí es lo que se va a comparar con una constante al final de todo, es decir que esta es la rutina que tenemos que invertir para sacar el serial que funciona partiendo de iiajjqepfljnb que es lo que tiene que dar nuestro serial después de pasar por la rutina anterior

Posible dificultad...

Los números se comparan por medio de la función __VbaVarTstEq, y no se muestra la variable con la que se comparan las constantes, esto lo solucionamos como lo veníamos haciendo, tomamos la dirección con el SC, y en la función __VbaVarTstEq traceamos hasta llegar a la instrucción

REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:[ESI]

Esta está dentro del módulo Oleaut32, así que van a tener que tracear entrando en las calls :-S
Si ponemos un BP ahí y vamos tocando F9 vamos a ver que se compara, esto sirve para ver todas las comparaciones porque todas se hacen con __VbaVarTstEq

Calculando Serial
No vamos a encontrar la constante completa, sino que es una combinación de otras dos:

iiajj y qepfljnb, formando iiajjqepfljnb, entonces

(usando un editor hexa escribimos las letras para conocer los correspondientes valores en hexa)

i=69
i=69
a=61
j=6a
j=6a
q=71
e=65
p=70
f=66
l=6c
j=6a
n=6e
b=62

69-31=38=8
69-39=30=0
61-31=30=0
6a-39=31=1
6a-31=39=9
71-39=38=8
65-31=34=4
70-39=37=7
66-31=35=5
6c-39=33=3
6a-31=39=9
6e-39=35=5
62-31=31=1

8001984753951=> Serial!!

Para que mi pérdida de tiempo no sea en vano, voy a poner cuales son las rutinas de generación de otros números, que supongo que son para despistar.
Hay una generación de un segundo número a partir del que obtenemos luego de la rutina anterior. Se usa un numero constante 127 y se hace lo mismo que en la rutina anterior pero al revés.

127=>Constante

1º caracter en ASCII de N1 - 31
2º caracter en ASCII de N1 - 32
3º caracter en ASCII de N1 - 31
4º caracter en ASCII de N1 - 32
5º caracter en ASCII de N1 - 31
6º caracter en ASCII de N1 - 32
7º caracter en ASCII de N1 - 31
8º caracter en ASCII de N1 - 32
9º caracter en ASCII de N1 - 31
10º caracter en ASCII de N1 - 32

Este número aparentemente no se usa para nada... :-S

Después de esto, hay una constante que se compara con un número que se genera a partir de otro numero constante dentro del crackme, y no son iguales, por ende, NUNCA VAN A SER IGUALES (sospecho que este crackme es una modificación del primero...)

658245853514=>Constante

[(658245853514*5)+(658245853514/3)]*9=31595800968672

33 xor 4f = 7c= |
31 xor 4f = 7e= ~
35 xor 4f = 7a= z
39 xor 4f = 76= v
35 xor 4f = 7a= z
38 xor 4f = 77= w
30 xor 4f = 7f= .
30 xor 4f = 7f= .
39 xor 4f = 76= v
36 xor 4f = 79= y
38 xor 4f = 77= w
36 xor 4f = 79= y
37 xor 4f = 78= x
32 xor 4f = 7d= }

Por último Tenemos una comparación de nuestro serial (1234567890) con una cadena de caracteres raros que supongo que es la que hace que largue el cuadro de texto con el mensaje "casi pero no", pero no la probé porque la verdad que no se como escribir esos "cuadraditos"

Bueno, como últimas palabras, voy a pedir encarecidamente que para los próximos que no pongas comparaciones con esas cadenas tan raras :-P. podes hacer más difíciles las cosas pero usa números y letras que conozcamos y no esos caracteres raros

Al parecer el otro crackme esta comprimido con neolite, nunca lo vi, así que supongo que va a ser entretenido

Cualquier duda, error o acotación, posteen

Saludos
#54
Buenas, www.crackslatinos.hispadominio.net, mirá las teorias. sobre los encabezados... busca por google los tutoriales de nuMIT_or  ;)

saludos!
#55
Buenas, echale una mirada al curso en flash en move.to/jbduc ahi tienes un poco de listado muerto. De todos modos, sabiendo ensamblador la tecnica del listado muerto viene sola

Saludos!
#56
Buenas, si te fijás en el winapi vas a ver que lo que hace la función es lo siguiente

UINT SetTimer(

    HWND hWnd,                       // handle de la ventana donde se enviaran los mensajes del temporizador
    UINT nIDEvent,                      // Identificador del temporizador
    UINT uElapse,                      // tiempo de espera en milisegundos
    TIMERPROC lpTimerFunc     // dirección del proceso que el temporizador ejecutará al alcanzar el tiempo de espera
);

como los datos se pasan a la pila al revés, ese push eax será el identificador del temporizador, de lo cual deducirás que la instrucción anterior son los 30 minutos en milisegundos. Lo que tenes que hacer, es convertir tus 30 minutos en milisegundos, comprobar para asegurarte de que el temporizador sea el correcto, y si lo es, nopear (poco elegante pero bueno  :P) el call a settimer y los 4 pushes anteriores para que no se te casque el programa por la pila. También podrías buscar algun salto mágico que te evite el timer, o meterlo vos justo antes de la funcion, en fin, a tu gusto

Saludos!

#57
Ingeniería Inversa / Re: Reto vB
2 Marzo 2005, 12:57 PM
Buenas, supongo que sigue la cuestion de postear la solucion.
Ahora si que no apruebo los finales de la uni...

pues a ver que tenemos...

Saludos!

(si no vuelvo a postear es porque decidi estudiar, o porque estoy vomitando de tanto ver codigo en VB   :P)
#58
Ingeniería Inversa / Re: aspackdie
27 Febrero 2005, 03:02 AM
buenas, no pones que version buscas pero aca tenes varios http://protools.reverse-engineering.net/ en la sección de unpackers

Igual, la respuesta suele ser casi siempre la misma...

GOOGLE

saludos
#59
Ingeniería Inversa / Re: Crack me en vB facilon
26 Febrero 2005, 18:47 PM
Buenas, debo decir que tu crackme, me ha dado dolores de cabeza no por la dificultad, sino por el hecho de estar programado en visual basic.

Aclaracion

No voy a poner un tutorial paso a paso de como resolverlo, sino que voy a escribir en forma general como crackearlo; asi, otros que quieran intentarlo, puedan guiarse con este post pero en fin; resolverlo por su cuenta

Aproximacion

Analizando el programita con peid, vemos que no esta empacado (ya estaba aclarado por el autor pero hay que ser desconfiados XD) y esta hecho en vb6. Abrimos el crackme y vemos que solo tiene un lugar para poner el serial, lo que me hace casi asegurar que tiene un serial unico (no creo que tome numero de disco rigido ni nada :S), no introducimos nada, clic en salir y arrrjjj, error en no se que :(. ponemos un numero cualquiera (1234567890 en mi caso) y al apretar el boton no pasa nada. Si lo abrimos con el olly, vamos a ver que tenemos antidebugger (isdebuggerpresent), pero al olly lo vamos a usar para otra cosa. El papel principal de la pelicula lo va a tener el smartcheck de numega.
Despolvamos cds, lo instalamos, lo configuramos y cargamos el crackme. Ponemos un numero de serie, damos en salir y vemos como se genera un evento click en SC (smartcheck). Cerramos el crackme y manos a la obra.

Analisis

Activamos la opcion de show all events para tener un poco mas de informacion sobre las acciones dentro del evento click y mirando por encima vemos que el programa hace lo siguiente

1º carga un string misterioso
2º toma nuestro numero
3º le hace algunas cosas y lo convierte en otro numero
4º a ese numero le hace mas cosas aun (:-S) y va obteniendo una cadena de caracteres raros y aparentemente sin sentido (odio las comparaciones de este tipo)
5º compara que la cadena generada sea igual a la cargada en 1º mediante  __vbavartsteq

Sacando el serial

Antes que nada, aclarar que siempre hablamos de valores decimales, a no ser que se especifique lo contrario.
Partimos desde el punto 3º: lo que hace a nuestro serial es lo siguiente:

-lo multiplica por 5 (al numero completo) generando numero A
-lo divide en 3 (al numero completo) generando numero B
-suma A+B
-multiplica el resultado por 9

Hecho esto obtenemos un numero C al que se le realiza un xor con 4f. En este punto nos paramos.Como hice notar (y recalco) odio visual basic XD, lo cual hace que no tenga DEMASIADOS conocimientos sobre él.Voy a decir que al menos una hora estuve varado pensando en como cuernos generaba la cadena del 4º. Si bien podemos ver como cada uno de los numeros que integran al numero C se van convirtiendo en la "cadena misteriosa" no sabemos que operacion realiza para lograr la conversion. Todo este embrolle se puede ver en un evento llamado "Asc" hacemos click en el y solo vemos el primer caracter del numero C, pero mas arriba dice KEY!XXXXXXXX ese es el offset en el que se encuentra esa instruccion, sin mas cargamos el olly (activamos plugin isdebuggerpresent) ponemos goto>expression en el desensamblado y ponemos el offset + la imagebase que casi siempre es 400000 le damos enter y caemos en una llamada, traceamos un poco y vemos que lo que hace es el bendito xor 4f.
Listo! si observamos, se hace lo mismo con todos los caracteres del numero C para formar una cadena que deberia concordar con la que se carga en 1º

Recapitulando

ahora planteamos la ecuacion de como hace el programa para generar una cadena a partir de nuestro serial

[(serial*5)+(serial/3)]*9= Numero C ;
Caracter de Numero C (CONVERTIDO A SU VALOR CORRESPONDIENTE ASCII) XOR 4f= caracter de cadena ( en hexa)

Pero como hacemos para conocer el serial que deberiamos entrar para que se haga el numero C correcto y por ende la cadena correcta? ingenieria inversa...

El final!

Partimos desde la cadena "correcta", para ello nos vamos a el evento click y vemos que a continuacion estan las instrucciones que cargan la cadena que queremos, damos clic y a la derecha vemos que se nos da la RVA en la que se encuentra la cadena (en unicode) que buscamos. Nos vamos al olly ponemos goto>epresionje en el dump y ponemos la RVA, vemos que nos aparecen los caracteres ASCII y sus correspondientes valores HEXADECIMALES. Copiamos los valores hexa y ya tenemos todo. A continuacion les pongo como quedaria la generacion en si:


7C797E77 |.y.~.w.
76797779 v.y.w.y.===========>CADENA CORRECTA
7B7F767A {..v.z.
7D7C7D   }.|.}

Lo que haremos ahora es ir para atras, si lo ultimo que se hace es un xor entre el numero C y 4f para obtener la cadena, haremos la opuesta de XOR (o sea XOR :-P) entre los caracteres de la cadena y 4f para obtener el numero C. despues los pasamos a decimal


7d xor 4f= 32= 2
7C xor 4f= 33= 3
7d xor 4f= 32= 2
7a xor 4f= 35= 5
76 xor 4f= 39= 9
7f xor 4f= 30= 0
7b xor 4f= 34= 4
79 xor 4f= 36= 6
77 xor 4f= 38= 8
79 xor 4f= 36= 6
76 xor 4f= 39= 9
77 xor 4f= 38= 8
7e xor 4f= 31= 1
79 xor 4f= 36= 6
7c xor 4f= 33= 3

Ahora que sabemos que el numero C es 361896864095232 aplicamos matematica basica :-P

[(serial*5)+(serial/3)]*9= 361896864095232 ;

(FACTOR COMUN SERIAL)

[serial*(5+1/3)]*9=361896864095232 ;

[serial*(16/3)]*9=361896864095232 ;

((361896864095232/9)*3)/16=7539518001984=>SERIAL!


POST SCRIPTUM

Olvide poner como me di cuenta de que a mi serial lo dividia en 3, en el smartcheck nos vamos a view y tildamos la opcion arguments, ahi nos mostrara que el integer en la multiplicacion es 5 y en la division es 3


Cualquier error/duda me avisan

Saludos!
#60
Buenas, respecto a la instruccion:

006A7C31  |.  0FA305 3C7C6A>BT DWORD PTR DS:[6A7C3C],EAX

lo que hace es copiar el número de bit del primer operando que indique el segundo operando (entre 0 y 31) en el flag de acarreo, o sea que dentro de la direccion [6A7C3C] si eax vale 1 copiara el primero, si vale dos el segundo, y asi

respecto a la instruccion:

006A7C38  |>  0F92C0        SETB AL


lo que hace es poner a 1 el bit indicado (Al) si el flag de acarreo es 1

Entonces, lo que supongo es que para la direccion [6A7C3C], cuando eax vale 17 te pone el flag de acarreo con un valor distinto de cero, por eso es que la instruccion siguiente te pone un 1 en AL. Cuando vale 15 o 16 lo mas probable es que el bit que copie en el CF (carry flag) sea un 0

Espero haberte ayudado (y no haberme equivocado  :P)

Saludos