Test Foro de elhacker.net SMF 2.1

Programación => Ingeniería Inversa => Mensaje iniciado por: ignorantev1.1 en 24 Octubre 2011, 22:01 PM

Título: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 24 Octubre 2011, 22:01 PM
Buenas, He estado toqueteando la memoria de cierto programa, me interesan algunos datos de ciertos offsets, el problema es que cada vez que inicia la aplicación la ubicación de esas variables cambian de offset, mi pregunta:

¿Hay alguna forma de ubicar estas variables atravez, por ejemplo, de una API que me diga en qué dirección se empiezan a alamacenar las variables?  :silbar:

Disculpen, si la pregunta o la idea no está bien redactada, o si el tema ya existe pero no sé como plantearlo en el  buscador, pero estoy en ceros en esto...  :-\

Muchas gracias y saludos!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: _Enko en 24 Octubre 2011, 22:15 PM
Hola, nunca tuve que hacer algo asi, pero se me ocurre esta solucion:


Si es Objeto (instancia de una clase) de una aplicacion programada con algun lenguaje orientado a objetos, ni idea que hacer.
(seria instancia de una clase creada con new si fuera cpp)

Si es un bloque creado con HeapAlloc, malloc podrias hacer esto:
1)Agregar un segmento extra a la ejecutable con el tamaño suficiente para que entre el bloque creado. (o bien buscar un espacio vacio grande dentro de la ejecutable)
2)En el lugar que se llama HeapAlloc/Malloc, simplemente reemplazas la instruccion por
mov eax, offset_segmento_nuevo

De esta manera, la ejecutable usaria como nuevo bloque de memoria el segmento extra que le agregaste que siempre estaria en la misma direccion.


Posible problema... cuando se llame a Free la ejecutable tirará un error. Si el bloque es contantemente realocado no va servir. Solo te serviria si llama a HeapAlloc/Malloc una sola vez.


Saludos.
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 25 Octubre 2011, 00:17 AM
No entiendo tu planteamiento(me parece muy técnico), como te digo: "Estoy en ceros"  :-\

No modificaré el programa, ni siquiera pienso hacerlo ya puesto en memoria.
Aunque no conozco de esto, me imagino que existe una posibilidad a mi idea, ya que el mismo programa usa esta, digamos "variable" constantemente, por lo que debe existir una referencia "intacta" al lugar de la variable. Ten por seguro que "ha de ser" una simple variable, corriente, que seguramente ha sido declarada de la forma más común del lenguaje en el que haya sido programada la aplicación(seguramente C++):

Código (cpp) [Seleccionar]
Int Variable;

Espero su ayuda!

Saludos y gracias!

Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: _Enko en 25 Octubre 2011, 00:49 AM
Habria que ver el programa en cuestion.
En el caso de "int Variable" si es cierto, es una direccion fija.

Pero que pasa si es esto:


class CClass{
public:
   int Variable
};

CClass *MiClase;


MiClase = new CClass;
MiClass->Variable = 5;


al llamar new CClass, la variable se almacena en algun lado de memoria que no es fijo. El offset del puntero de MiClass si es constante, pero a donde apunta si varia.

Hay que ver de que programa en cuestion se trata.
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 25 Octubre 2011, 02:18 AM
Hola te invito a que lo subas, para ver que tal y comenta detalladamente que parámetros quieres cambiar o que modificación quieres hacerle al programa.

Saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 25 Octubre 2011, 03:03 AM
No es un programa propio(claro está), no quiero hacerle ninguna modificación al programa, solo quiero leer datos en la memoria del programa, creo no me están entiendo.

Saludos!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 25 Octubre 2011, 04:26 AM
¿la direccion en donde se le asigna el valor a la variable no te sirve?

Ej.
401200 mov [variable] , valor

Si la direccion de la variable cambia, pues ponele un bpmw para ver donde le asigna un valor, y de esta forma tendrias por ej que en 401200 se le asigna el valor a dicha variable.

Luego te haces un loader debuguer, con el componente de Suei o lo que sea, un script etc. pones un bp en 401200, y cuando pare en el bo tomas el contenido de la variable.

o directamente desde ollydbg, le pones un bp conditional log, que cada vez que pase por 401200 te loguee el valor de [variable].

slds
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 25 Octubre 2011, 04:45 AM
o como explica en este tute
http://foro.elhacker.net/ingenieria_inversa/tutorial_hallar_pointers_offset_con_ce_mhs5-t342767.0.html
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 25 Octubre 2011, 16:09 PM
Cita de: ignorantev1.1 en 25 Octubre 2011, 03:03 AM
No es un programa propio(claro está), no quiero hacerle ninguna modificación al programa, solo quiero leer datos en la memoria del programa, creo no me están entiendo.

Saludos!

Creo que te estoy entendiendo quieres saber localizar el lugar(address) en donde el programa realiza una modificación de una variable.

ayer realicé un tutorial sobre eso explica como encontrar una variable de un juego y luego encontrar el address en donde modifica esa variable:

http://foro.elhacker.net/ingenieria_inversa/tutorialcreacion_de_trainers_con_ollydbg_y_cheat_engine-t342664.0.html (http://foro.elhacker.net/ingenieria_inversa/tutorialcreacion_de_trainers_con_ollydbg_y_cheat_engine-t342664.0.html)

Si tienes dudas con el tutorial (si es que solventa la pregunta que tienes jeje) te las respondo inmediatamente, saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 25 Octubre 2011, 19:06 PM
@Under

Al poner el BP en la posición de memoria de la variable que necesito me aparece lo siguiente:

CitarMOV EAX, [Local.73]

Eso no me sirve, ya que sigue siendo relativa la ubicación que busco.

Saludos y gracias!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 25 Octubre 2011, 19:55 PM
Cita de: ignorantev1.1 en 25 Octubre 2011, 19:06 PM
@Under

Al poner el BP en la posición de memoria de la variable que necesito me aparece lo siguiente:

Eso no me sirve, ya que sigue siendo relativa la ubicación que busco.

Saludos y gracias!

si pones un breakpoint on memory en Local.73?, el método del tutorial serviría para encontrar el address dentro del ejecutable, que es lo que buscas.
ya que encontraste MOV EAX, [Local.73] puedes hacer un injerto para operar con el contenido de Local.73 y de manera indirecta tendría siempre la variable.
también puede ser que la variable sea asignada por el sistema (VirtualAlloc) y desde el retorno de tal API podrías hacer un injerto que guardara en otro lugar el valor de EAX, que sería el VA en donde se localizó la nueva memoria virtual

Saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 26 Octubre 2011, 04:35 AM
Si solo queres loguear valores, Podes poner un bp conditional log en la direccion de dicha variable, y que te loguee el contenido de la [variable] cuando escribe ahi.

Saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 28 Octubre 2011, 04:36 AM
Mmmm, pues sigo intentando, las posiciones varían segun la maquina, lo de "hacer el injerto" no me sirve...

(http://i40.tinypic.com/2qsruxl.jpg)

Intentaré lo del bp condicional... a ver qué resulta...

También he leido algo y me topé con que "base address", no sé qué con eso...

A ver, a ver: ¿Cómo encuentro la dirección absoluta ese dato?, Sumandole qué con qué o restandole qué con qué... ¿Quién ayuda?
Saludos y gracias!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 28 Octubre 2011, 05:06 AM
Puedes utilizar un script que hice en donde colocas la address y te entrega el RAW (lo que comúnmente muestran los editores hexadecimales)


http://foro.elhacker.net/ingenieria_inversa/scriptscript_para_calcular_offset_de_un_ejectuable-t340094.0.html (http://foro.elhacker.net/ingenieria_inversa/scriptscript_para_calcular_offset_de_un_ejectuable-t340094.0.html)

Si eres de los que quiere entender de manera manual y no a través de script puedes ver el comentario del script ya que expliqué detalladamente como es la "fórmula"

de todas formas para ejecutar el script necesitas el plugins para olly OllyScript

luego vas a la pestaña plugins verás OllyScript te ubicas en el y presionas RUN y eliges el script que está en el post que previamente lo guardaste en txt y lo eliges con eso saldrá una ventana preguntando el address a calcular tan simple como eso

Saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 29 Octubre 2011, 19:20 PM
A ver, a ver si te entiendo:

¿Los datos se empiezan a almacenar en la sección ".data"?
Bueno, supongo que a esa sección corresponde "RAW" o "RVA" del que haces referencia, pero para que sea valido es necesario sumarle "imagebase"... ¿sí?

Ahora:

Estos datos se pueden obtener leyendo la info PE del programa, y el programa para cualquier maquina tiene la misma cabecera(ya lo comprobé), o sea que "RAW" + "imagebase" es igual para todas las maquinas, pero hay algo que cambia, y supongo "en tiempo de ejecución".

Disculpame si no entiendo, pero no tengo mucha experiencia en esto, así que si estoy mal, por favor, ¿a qué datos te refieres?...

Gracias y saludos!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: _Enko en 29 Octubre 2011, 21:50 PM
No vi el programa en cuestion, pero estoy seguro que en este momento el problema que estas teniendo es porque no entiendes el concepto de un puntero, y para el caso, hasta puede ser puntero a puntero a putnero etc...

suponte este codigo

int var_a = 5


Que significa eso?
"var_a"  es un entero igual a 5.

pero ese en un lenguaje de programacion. para el cpu no existe tal cosa como "var_a"

Para el cpu existe una direccion de momeria, digamos 40100. El contenido de esa direccion de memoria es 5.

Para que veas la diferencia en pseudo codigo de maquina:

var_a seria equivalente a 40100
[var_a] contenido var_a seria equivalente a 5
[40100] conenido de 40100 es equivalente a 5


Ahora que pasa si el contenido es una direccion de memoria?

[var_a] = 40200
contenido de var_a es equivalente a 40200 que es otra direccion de memoria

por ejemplo, se podria dar el caso de
var_b = 6
donde var_b seria equivalente a la direccion de memoria 40200

de esta manera, var_a apuntaria a donde se encuentra var_b


Entonces, para llegar a "6" a partir de var_a tendrias que:
Citar
tomar el contenido de var_a
ese contenido seria 40200
luego, tomar el contenido de 40200
y ahi llegarias a  [40200]  == 6
recuerda que puede ser puntero a puntero a puntero a puntero a "tu variable"


Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 29 Octubre 2011, 22:25 PM
@Enko_

:xD Claro que sé lo que es un puntero, ese no es el problema, en serio.

Mira:

(http://i40.tinypic.com/2qsruxl.jpg)

Supongamos que en otra maquina, abro el proceso y leo el offset 4146D2, me dá "0". Por que, supongo, el rango de valores no es el mismo, ¿por qué?, no sé, memoria disponible, OS, 86 o 64, ¿qué sé yo?, pero no es el mismo...

Saludos y gracias!




Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: _Enko en 30 Octubre 2011, 00:26 AM
si la variable realmente es "LOCAL" entonces esta metida en la pila, y no en el segmento .DATA

4146D2 es .CODE segment, es decir, no es la variable, es la direccion de ejecucion del programa, no tiene nada que ver con una variable.. la variable serial LOCAL.78 y no tenemos ni idea de lo que es... como ya te dije, si realmente es local, es una direccion de la pila.

Estas traceando algo mal... y con la screenshot no se ayuda mucho



Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 30 Octubre 2011, 16:32 PM
Cita de: ignorantev1.1 en 29 Octubre 2011, 22:25 PM
@Enko_

:xD Claro que sé lo que es un puntero, ese no es el problema, en serio.

Mira:

(http://i40.tinypic.com/2qsruxl.jpg)

Supongamos que en otra maquina, abro el proceso y leo el offset 4146D2, me dá "0". Por que, supongo, el rango de valores no es el mismo, ¿por qué?, no sé, memoria disponible, OS, 86 o 64, ¿qué sé yo?, pero no es el mismo...

Saludos y gracias!






Cito la info de mi script:
CitarFórmula:
     RVA: Valor relativo en memoria (Relative Value Address)                                 
     VA: Valor absoluto en memoria (Value Absolute)                                                               
     RAW: Dirección en el disco

     -OllyDBG Nos muestra por defecto direciones de tipo VA
     VA(Value Absolute)=ImageBase+RVA     

     Ejemplo: 40101D=400000(ImageBase)+101D(RVA)

     -Si queremos saber el raw de un address ubicado en la cabezera PE (PE header)
     se debe restar address-ImageBase=RVA=RAW     

     Ejemplo: 400056(VA)-400000(ImageBase)=56h(RAW)   

     -Si queremos saber el raw de un address ubicado en una sección     
     se debe hacer lo siguiente:

     Obtener el RVA del addres:
     Address-ImageBase=RVA

     luego a RVA restarle los siguientes valores:     
     RVA-(VirtualAddress-PointerToRawData)=RAW     

     *VirtualAddress y PointerToRawData varían en cada sección


No todas las cabeceras PE son iguales,el address que comentas es un VA que es lo muestra OllyDBG con el script colocas esa address y te dará el RAW teniendo el RAW que es la dirección del ejecutable en el disco duro abres un editor hexadecimal verás lo mismo, puedes corroborar nopeando el OP-Code del address (click derecho fill with nop's) eso hará que en el address se escriban 90 hexadecimal si con un editor hex pones el RAW deberías ver 90 obviamente si guardaste los cambios

Podrías enviarnos el ejecutable para que te saquemos de las dudas

Saludos
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 31 Octubre 2011, 18:57 PM
CitarNo todas las cabeceras PE son iguales

Claro, pero la cabecera del programa en cuestión es la misma para todas las maquinas.

CitarRVA: Valor relativo en memoria (Relative Value Address)                                 
     VA: Valor absoluto en memoria (Value Absolute)                                                               
     RAW: Dirección en el disco

¿Estos datos son de la info del PE?

No quería llegar a esto, pero si gustan el programa en custión aquí está, solo que deben registrarse para poderlo usar:

http://download.tibia.com/tibia931.exe

Saludos y gracias!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 1 Noviembre 2011, 02:39 AM
Pues que se supone que hace esa variable?


004146D2  |.   MOV EAX,DWORD PTR SS:[LOCAL.73]

Solo pasa una vez por ahi  cuado estas iniciando sesion, y su valor es cero.

slds
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 1 Noviembre 2011, 03:25 AM
@tena

Es el maná del personaje, no es muy importante, pero en base a la solución(qué espero encontrar) lograré apoyarme en otros datos.

¿iniciaste sesión o solo ejecutaste el programa?

Saludos!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 1 Noviembre 2011, 03:28 AM
Cae ahi cuando se Inicia la sesion del juego.

Ahora me fijo aver si se modifica cuando cambia el maná



Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: tena en 1 Noviembre 2011, 04:12 AM
No aguanto al juego ese  >:D
No se como hacer en el juego para que varie el mana.

Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: ignorantev1.1 en 1 Noviembre 2011, 04:17 AM
No podrás, tendrá qué pasar un tiempo(días) para poder hacerlo  ;-)

De la manera en que llego allí es por medio del cheat engine, busco el valor del maná y me ubico en el ollydbg...

Saludos!
Título: Re: Ubicación de variable en un proceso[Help]
Publicado por: .:UND3R:. en 1 Noviembre 2011, 17:20 PM
Estoy ocupado en este momento pero probaré con tibia y el mana jeje


Saludos