OllyDBG Registros

Iniciado por teje, 20 Diciembre 2012, 19:01 PM

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

teje

Hola, estoy estudiando ingeniería inversa con OllyDBG y me hago una pregunta. ¿Como se diferencia en los registros una dirección de memoria de un valor?
Un saludo!

apuromafo CLS

no se que te estas leyendo, pero si fueras mas explicito seria mejor
pero si es para lo que creo, terminaras confirmando recien cuando entiendas la estructura de un exe o estructura cabezera MZ o PE header

te hare un alcance, depende del uso y del tamaño, y para que arquitectura buscas
http://es.scribd.com/doc/45774301/Arquitectura-x86-y-x64

http://es.wikipedia.org/wiki/Intel_8086_y_8088


segun esta mini idea que los registros pueden servir segun su arquitectura para
1) bandera, de acumuladores y otros

pero hare un ejemplo simple

mov eax,1  (mueve a eax, registro de 32 bytes,  RAX, se usa solo para acumular, mover contar etc)

cmp eax,1  (compara si el valor es 1, pero donde sabe el programa que es o no?), para esto usa temas de banderas, pero este comando no usara la bandera, sino el proximo
je lugar (comparando la bandera z, si es 0 o 1, este determinara si seguir o no al lugar)
cmp ah, 1  (lo mismo)
jne lugar

hay diferentes estructuras, digamos por ejemplo que hay 3 sistemas operativos principales
1) linux  (formato cabezera elf)
2) windows x86 (formato PE), windows x64 , archivos hechos en estructura .net
3)mac OSX o similares.

digamos que para esos casos el primer valor cambia segun la arquitectura, el tamaño permisos y otros, pero el principio es el mismo

sirven conforme puedan ser usados


digamos que tienes un programa que analiza de 2 formas(estatico y dinamico)

cuando abres un depurador tipo, lo mas probable es que comienza de forma estatica, pero, hay depuradores dinamicos que permiten dejar interrupciones o detenerce en cierto punto, a modo de obtener en ese lugar especifico (que colocamos el punto de interrepcion o breackpoint)  , todo dependera obviamente de que tema podemos estar hablando


un ejemplo cualquiera

abres ollydbg, estas en el entrypoint(donde estas ahora)..ahi comenzaste, ves los registros de eax, ebx, ecx y otros,   pero lo primero que puede estar pueden ser

1) saltos
2) push  lugar , que llevara a guardar registros en stack , o preparar el espacio para ejecutar las instrucciones


cuando los programas estan mal hechos o poseen bug, es muchas veces porque otorgan espacios reducidos o bien una instruccion pasa a llevar a otra , o bien los permisos de ciertas secciones estan mal dadas

principalmente ese es el uso basico de un depurador

ahora bien, te sugiero seguir leyendo, porque  digamos que  las diferencias(tu pregunta), las darà principalmente los comandos que vaas viendo


saludos Apuromafo

teje

Estoy leyendo la INTRODUCCIÓN AL CRACKING CON OLLYDBG DESDE CERO de Ricardo Narvaja.
Bien, aclarando de primeras un valor de un registro no se puede saber si corresponde a una dirección de memoria o si es un valor de una dirección de memoria. Hay que leer el desensamblado para verlo. ¿es así?
Un saludo y gracias.

apuromafo CLS

pues
digamos que ollydbg tiene una estructura
te sugiero leer con detalle esto y vuelvas a ver el mensaje

http://foro.elhacker.net/ingenieria_inversa/taller_de_cracking_desde_cero_actualizado_27julio2008-t180886.0.html


digamos que miras a tu derecha, estaran los registros,   si haces follow in dump, veras lo que esta en esa memoria..(bytes) direcciones

por ejemplo si dice
mov eax, 1,   no existe direccion 1, por ende es usado solo contador o algo

diferente es el caso que diga

mov eax, ebx,  movera a eax el valor de ebx,  digamos que vale 401000, si coloco follow in dump, en la parte inferior yo vere el valor que contiene 401000

ademas existen opciones de go to..y asi suma y sigue

saludos Apuromafo

x64core

No se puede diferenciar tal cosas así como puede ser una direccion de memoria tambíen puede ser un valor.
Si tenemos: 76480000h este valor puede ser tanto como la direccion de kernel32.dll como también parte de una clave de encriptacion, dos caracteres, etc. Obviamente hay que usar un poco de lógica en esos casos.


MCKSys Argentina

Cita de: teje en 20 Diciembre 2012, 19:32 PM
Estoy leyendo la INTRODUCCIÓN AL CRACKING CON OLLYDBG DESDE CERO de Ricardo Narvaja.
Bien, aclarando de primeras un valor de un registro no se puede saber si corresponde a una dirección de memoria o si es un valor de una dirección de memoria. Hay que leer el desensamblado para verlo. ¿es así?
Un saludo y gracias.

En realidad depende de si el codigo intenta acceder o escribir en la direccion dada.
Lo que puedes consultar es el Memory Map. Ahi veras las regiones de memoria mapeadas.

En el caso en que necesites saber si una direccion de memoria esta mapeada desde codigo, (osea, si "existe") puedes usar la funcion IsBadReadPtr. Esta funcion te indica si puedes LEER de esa direccion (por ende, esta mapeada).

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366713(v=vs.85).aspx

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


x64core

Cita de: MCKSys Argentina en 20 Diciembre 2012, 20:08 PM
En realidad depende de si el codigo intenta acceder o escribir en la direccion dada.
Lo que puedes consultar es el Memory Map. Ahi veras las regiones de memoria mapeadas.

En el caso en que necesites saber si una direccion de memoria esta mapeada desde codigo, (osea, si "existe") puedes usar la funcion IsBadReadPtr. Esta funcion te indica si puedes LEER de esa direccion (por ende, esta mapeada).

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366713(v=vs.85).aspx

Saludos!
No siempre es bueno usar IsBadReadPtr/IsBadWritePtr, Aquí del porque:
http://blogs.msdn.com/b/larryosterman/archive/2004/05/18/134471.aspx

Y después de asegurarte de ese problema entonces recomiendo usar SEH en lugar de esas funciones.


apuromafo CLS

esta iniciando, simplemente esta conociendo si lo que ve es un registro o algo mas

creo que es como se dice, hay varios registros, pero hay que saber interpretarlos con el tiempo

saludos Apuromafo