Tema destacado: Suscripción al boletín mensual de elhacker.net
Autor
|
Tema: Ubicación de variable en un proceso[Help] (Leído 1,475 veces)
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
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?  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!
|
|
|
|
|
En línea
|
|
|
|
_Enko
Desconectado
Mensajes: 301
|
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.
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
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++): Int Variable; Espero su ayuda! Saludos y gracias!
|
|
|
|
|
En línea
|
|
|
|
_Enko
Desconectado
Mensajes: 301
|
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.
|
|
|
|
« Última modificación: 25 Octubre 2011, 00:58 por _Enko »
|
En línea
|
|
|
|
.:UND3R:.
Desconectado
Mensajes: 1.960
Ingeniería inversa
|
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
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
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!
|
|
|
|
|
En línea
|
|
|
|
tena
Desconectado
Mensajes: 668
|
¿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
|
|
|
|
|
En línea
|
|
|
|
|
|
.:UND3R:.
Desconectado
Mensajes: 1.960
Ingeniería inversa
|
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.htmlSi tienes dudas con el tutorial (si es que solventa la pregunta que tienes jeje) te las respondo inmediatamente, saludos
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
@UnderAl poner el BP en la posición de memoria de la variable que necesito me aparece lo siguiente: MOV EAX, [Local.73] Eso no me sirve, ya que sigue siendo relativa la ubicación que busco. Saludos y gracias!
|
|
|
|
|
En línea
|
|
|
|
.:UND3R:.
Desconectado
Mensajes: 1.960
Ingeniería inversa
|
@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
|
|
|
|
|
En línea
|
|
|
|
tena
Desconectado
Mensajes: 668
|
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
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
Mmmm, pues sigo intentando, las posiciones varían segun la maquina, lo de "hacer el injerto" no me sirve...  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!
|
|
|
|
« Última modificación: 28 Octubre 2011, 04:44 por ignorantev1.1 »
|
En línea
|
|
|
|
.:UND3R:.
Desconectado
Mensajes: 1.960
Ingeniería inversa
|
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.htmlSi 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 OllyScriptluego 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
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
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!
|
|
|
|
|
En línea
|
|
|
|
|
| Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como imprimir el valor de una variable definida en una variable...
Scripting
|
nhaalclkiemr
|
5
|
1,529
|
3 Mayo 2007, 17:58
por sirdarckcat
|
|
|
La variable de tipo Object o la variable de bloque With no está establecida
Programación Visual Basic
|
rubeng
|
5
|
5,974
|
17 Septiembre 2007, 00:04
por rubeng
|
|
|
Error 91: Variable de tipo object o la variable de bloque with no esta estableci
Programación Visual Basic
|
brus_k10
|
2
|
2,849
|
16 Junio 2009, 16:20
por cassiani
|
|
|
Como puedo Comunicar un proceso padre con un proceso hijo
Programación C/C++
|
_alexis_
|
2
|
2,060
|
24 Septiembre 2009, 03:23
por aguml
|
|
|
my.resources.source.replace(variable, variable) Ayuda codedom
.NET
|
70N1
|
4
|
901
|
19 Octubre 2011, 12:57
por 70N1
|
|