PDA

Ver la versión completa : pregunta asm rutina



zaratustra
03-06-2009, 02:52
hola me gustaria que me explicara sobre el siguiente trozo de codigo.
porque en realidad no consigo comprender exactamente lo que hace:

00446890 /$ 55 PUSH EBP
00446891 |. 8BEC MOV EBP,ESP
00446893 |. 53 PUSH EBX
00446894 |. 56 PUSH ESI
00446895 |. 57 PUSH EDI
00446896 |. 33C0 XOR EAX,EAX -->¿limpio el registro solamente?
00446898 |. E9 00000000 JMP INSTALL.0044689D
0044689D |> 5F POP EDI
0044689E |. 5E POP ESI
0044689F |. 5B POP EBX
004468A0 |. C9 LEAVE
004468A1 \. C3 RETN

estoy tratando de crackiar una aplicacion y me ha dado un monton de trabajo, pero = ya he avanzado bastante.
cualquier sugerencia bienvenida. luego les hare otras preguntas que me inquietan.

ahh el EAX apuntaba al serial que yo introduje.

hystd
03-06-2009, 04:28
PUSH EBP
MOV EBP, ESP

Es el preámbulo de la función llamada. El objetivo es preparar la pila para establecer el estado de la pila "antes" y el "despues" de la llamada. En otras palabras, existe la función que llama (la que ejecuta el CALL), y está la función llamada, que es la que nos estás mostrando el código. La función llamada debe poner el puntero EBP apuntando a ESP (el cual apunta a la cima, de forma que todo lo que esté por debajo pertenece a la función que llama, y todo lo que esté por encima pertenece a la función llamada. Es decir, [EBP+x] (está por encima de EBP) apunta a una variable de la función que llama, o bien a un parámetro que ha recibido (Nota que los parámetros que se pasan a una función se establecen antes de que la función sea llamada, es decir, antes del CALL se realizaron una serie de PUSH's). Y [EBP-x] apunta a una variable local que utiliza la función llamada, por ejemplo un contador auxiliar que pueda utilizar.

Dicho ésto, cuando se realiza un CALL, de forma estándar la función llamada siempre tendrá estas dos instrucciones.

Del mismo modo LEAVE equivale a MOV ESP,EBP, POP EBP, para restaurar el contexto, es decir, dejar la pila tal y como estaba antes de la llamada (CALL).

La serie de PUSH siguientes:


PUSH EBX
PUSH ESI
PUSH EDI

son para guardar el estado actual de esos registros (salvar el contexto). Usando los estándares tradicionales (cdecl, stdcall, syscall, etc...), lo normal es salvar el contexto antes de la llamada, con lo cual deduzco que por su posición en la pila sea para inicializar variables locales de la función llamada. Es decir, esta función que muestras utilizará unas variables locales que serán inicializadas con los valores de los registros EBX, ESI y EDI. Normalmente éstos dos últimos suelen utilizarse como punteros a vectores, como puede ser el caso de una cadena de texto.

XOR EAX, EAX

Simplemente pone a 0 el registro EAX. No tiene otra función. Ahora bien, tras su ejecución se modifican algunos flags (ZF, CF, AF son los principales), que tal vez más adelante sean testeados por alguna instrucción de salto. Ésto tendrás que verlo cuando realices la traza, y ver si posteriormente el estado de los flags varian o no tras la ejecución del XOR, y ver qué grado de implicación afecta a tus objetivos.

la serie de POP's:

POP EDI
POP ESI
POP EBX

Son simplemente para dejar la pila como estaba. Recuerda que una vez la función termine, se ha de volver al contexto justo antes de la llamada, y puesto que la función ha tocado la pila, metiendo 3 valores, ahora ha de quitarlos. Al quitarlos, los registros EDI, ESI y EBX tomarán los valores que contenga la pila. (Una función puede tocar la pila todo lo que quiera, pero cuando termine debe dejarlo todo como estaba). Justo después aparece una instrucción de salto incondicional (saltará si o si), y bueno, observo que la dirección de salto es justo a la siguiente instrucción (pop edi), con lo cual no tiene mucho misterio mas que consumir ciclos de reloj y unos 5 bytes de memoria.

Tal vez ésto te sea de interés para tu cometido, y es que una vez finalice esa función el resultado de ésta se almacena en EAX:EDX, si el valor devuelto es de 64 bits o en EAX si es de 32 bits o menos. Por lo que me dices y si es cierto eso de que EAX apunta al serial, puede parecer a priori que esa función ha sido llamada porque el serial introducido es inválido y la función devuelve 0 (o lo que se puede traducir como falso). Prueba a cambiar el registro EAX a 1 cuando finalice la ejecución de la función (después del RETN), y sigue traceando.

Con esas lineas de código tampoco se puede decir mucho más.

Un saludo.

zaratustra
04-06-2009, 18:51
te agradesco la ayuda, es que no comprendia esa funciom pues pense que no hacia nada util.
veras.. ya llevo como 2 semanas tratando de crackear un programa: factorylink 6.0, que me llego, este pide:
*numero serial
*secuencia de configuracion

ambas las tengo (reales)
luego genera un codigo de registracion.

en teori, por lo que se, toda esta info se debe mandar a la empresa, para que te devuelva un codigo de autorizacion (con el que se finaliza la instalacion).

ya encontre el area chico malo (donde sale el msgbox), pero este sale repetido en el codigo un monton de veces, como metodo de distraccion, pero poniendo un BP lo econtre

me puse a trazar el codigo desde bien atras en el codigo, y por lo que vi hay unos calls a funciones que van testeando el codigo de autorizacion falso.

primero hay uno que verifica el largo como ditinto de 0 ademas combierte a mayuscala los caracteres en minusculas, pero hay varias funciones que no comprendo... mas adelante vi que se genera un serial.... en fin me gustaria que me ayudaras a comprender mejor el codigo, siempre he leido mucho de todo , y ahora no es la excepcion he hecho varios crackmes pero como sabemos no es lo mismo.. mi comprencion de asm no es tan avanzado, conozco otros lenguajes, pero maquina nunca le dado duro, por ejemplo derepente aparecen lieneas que no entiendo muy bien..

quisiera enseñar te algo de codigo para que me orientes.
cualquier ayuda sera bienvenida. de antemano muchas gracias.

zaratustra
04-06-2009, 19:49
hola nuevamente.
sabes me di cuenta que captura el serial falso:
CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; \GetDlgItemTextA

pero ademas antes de eso lo va almacenando letra a letra con captura de pulsacion de teclado..

tu que tienes experiencia, esto sera para contrarestar un posible ataque por fuerza bruta, porque veo cierta logica en la informacion de registro y autorizacion que tengo de antes (instalaciones antiguas):

USDATA Serial Number: 74022NTI

USDATA Configuration Sequence: GRPZ S3SI VYKR NQHN DSTI 3VSF TJQH EBWY BD

--------------------------------------------------------------------

(1) Registration Number: CIVZ 5MM2 3AQF VKQT Z55S XGIE ND
(1) Authorization Number: EJYZ 7MST 2IQT 8IRT YBM2 PD4F SB
-----------------------
ahora te va otra (solo tengo 2)
-----------------------
(2) Registration Number: CI7Z R2VJ 52QE 7KQT Z55S XGIE ND
(2) Authorization Number: EJ5Z P2SJ 4QQA 9IRT YBM2 PD4F SB
------------------------------------------------------------------

si te fijas hay una relacion entre el num de reg. que se genera y el de autorizacion que uno ingresa, ademas hay trozos que se mantienen intactos para (1 y 2).
me di cuenta por ejemplo:
se mantiene
CI ... KQT Z55S XGIE ND en el de registro
EJ ... IRT YBM2 PD4F SB en el de autorizacion
ademas para lo que esta en "..." (el resto) ahy un vinculo de desplazamiento.
dentro del desensamblado encontre un conjunto de caracteres (abecedario), pero donde le faltan letras:

00471E40 41 42 43 44 45 46 47 48 49 4A 4B 4D 4E 50 51 52 ABCDEFGHIJKMNPQR
00471E50 53 54 55 56 57 58 59 5A 32 33 34 35 36 37 38 39 STUVWXYZ23456789

y dentro del codigo asm se aprecia que se accede a esta area para generar un serial..
si te interesa guiarme en esta tarea, me dice para hacerte mas preguntas.

gracias por tu tiempo.

zaratustra
04-06-2009, 19:56
ahhh, se me olvidaba..

ahora que lo instalo en mi maquina me genera lo siguiente:

Registration Number: CIVZ 5MM2 3AQF VKQT Z55S XGIE ND
------------------------------------------------
lo que puse aqui



(1) Registration Number: CIVZ 5MM2 3AQF VKQT Z55S XGIE ND
(1) Authorization Number: EJYZ 7MST 2IQT 8IRT YBM2 PD4F SB


esta mal, seria asi:



(1) Registration Number: CISZ 9MVT 38QX 6KQT Z55S XGIE ND
(1) Authorization Number: EJYZ 7MST 2IQT 8IRT YBM2 PD4F SB


eso seria, es que se me paso :)