Pointers & Offsets

Iniciado por calk9, 11 Diciembre 2011, 22:42 PM

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

calk9

Hola a todos !  :D. Bueno, ya estoy dentro del tema memoria de los programas, dinamico o estático, pointers & offsets, etc. Estos conceptos ya los tengo claros, pero tengo algunas dudas. Primero quisiera saber si los offsets son SIEMPRE estáticos, o puede que cambien, y si estos son propios de cada programa o propios de cada porción de memoria (dinamica o estatica). El tema es el siguiente. Tengo un programa el cual cuenta con memoria totalmente dinamica, al volver a ejecutarlo cambian los adresses de memoria, como todos saben. Ahora, se que para no tener que obtener el adress de memoria de cada variable de mi programa cada vez que lo ejecuto, utilizo los pointers y offsets. Tengo claro que los adresses de memoria dinamica se almacenan en otros adresses que son estáticos (esto es lo que no puedo obtener) pero no se almacenan TALCUAL nosotros podemos verlos; si no que hay una especie de "cuenta" en los cuales intervienen los offsets y los pointers. Bueno, voy al grano, en este programa obtengo la direccion de memoria dinamica de una variable (con CE), de esta misma obtengo su offset y pointer (con MHS5). Pero no logro encontrar alguna funcion para obtener la memoria estatica en donde se almacena la memoria dinamica (por asi decirlo).

También cabe aclarar que cada vez que vuelvo a buscar los pointers y offsets que pertenecen a una direccion de memoria dinamica de una variable, estos mismos son diferentes a las busquedas anteriores, aunque la variable siempre sea la misma (pero no la direccion de memoria).

Bueno, si logran ayudarme, estaria muy agradecido :)

P.D: Creo que este es el foro correcto para crear este tema ^^. De no ser así por favor haganmelo saber :P

Unbr0ken

#1
Cita de: calk9 en 11 Diciembre 2011, 22:42 PM
Primero quisiera saber si los offsets son SIEMPRE estáticos, o puede que cambien, y si estos son propios de cada programa o propios de cada porción de memoria (dinamica o estatica).

Sí, siempre serán estáticos, ya que estos los establece el compilador.

Cita de: calk9 en 11 Diciembre 2011, 22:42 PM
El tema es el siguiente. Tengo un programa el cual cuenta con memoria totalmente dinamica, al volver a ejecutarlo cambian los adresses de memoria, como todos saben. Ahora, se que para no tener que obtener el adress de memoria de cada variable de mi programa cada vez que lo ejecuto, utilizo los pointers y offsets. Tengo claro que los adresses de memoria dinamica se almacenan en otros adresses que son estáticos (esto es lo que no puedo obtener) pero no se almacenan TALCUAL nosotros podemos verlos; si no que hay una especie de "cuenta" en los cuales intervienen los offsets y los pointers.

Tienes una base fuerte de lo que punteros significa, sin embargo se puede perfeccionar.

Cada compilador tiene su manera de asignar punteros, (entiéndase entonces que un puntero no es más que una dirección de memoria estática la cual apunta a una dirección de memoria dinámica, siendo ésta variante con un reinicio de sistema, cierre de proceso, bla bla bla...). Entonces, dependiendo del compilador, al momento de compilar, éste le asignará al programa los punteros que apuntarán (valga la redundancia) a tales direcciones dinámicas (direcciones que alojaran variables, elementos de estructuras, elementos de clases, etc...) permitiendo al programa en ejecución acceder a ellas, ya sea para lectura o escritura.

Pero, cabe destacar que un puntero hace referencia a una región/zona de memoria, no siempre directamente a una dirección dinámica la cual contiene exactamente el valor buscado, entonces... debido a esto, como el puntero hace referencia a una zona de memoria, supongase:

(Puntero) [0x00460000] -> (Hace referencia a una región de memoria dinámica) [0x07A00000]

El compilador tiene que establecer un desplazamiento desde esa zona de memoria que lleve exactamente donde se encuentra la dirección dinámica poseedora del valor que el programa necesita leer/editar. Este desplazamiento (también llamado OffSet) puede hacerse con una simple resta o suma (depende de como lo veas), suponiendo entonces que:

Mi puntero está haciendo referencia esta vez a la zona de memoria dinámica: [0x07A00000], pero el valor que el programa usará se encuentra unas quince direcciones más abajo, supongase [0x7A00015], entonces el compilador al haber establecido esto, deducirá que el desplazamiento será 0x15.

En base a esto, saca tus conclusiones, quizá sonaron algunas palabras un tanto repetitivas, pero... estoy escribiendo a vuelo de pájaro (tengo un juego de fútbol en unos minutos) me debo ir :xD.

Cita de: calk9 en 11 Diciembre 2011, 22:42 PM
Bueno, voy al grano, en este programa obtengo la direccion de memoria dinamica de una variable (con CE), de esta misma obtengo su offset y pointer (con MHS5). Pero no logro encontrar alguna funcion para obtener la memoria estatica en donde se almacena la memoria dinamica (por asi decirlo).

También cabe aclarar que cada vez que vuelvo a buscar los pointers y offsets que pertenecen a una direccion de memoria dinamica de una variable, estos mismos son diferentes a las busquedas anteriores, aunque la variable siempre sea la misma (pero no la direccion de memoria).

Me temo que lo debes estar haciendo mal, hace unos días hice un mini-tuto donde le enseñaba a un amigo a encontrar punteros con el CE, pero... también lo hice a vuelo de pájaro :xD, aquí te lo dejo, espero te sirva de algo... disculpa que te escriba a esta velocidad, no es por menospreciarte, es que no tengo mucho tiempo libre.

Salud ::).
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

calk9

#2
Pues no tienes que disculparte, al contrario, te lo agradezco muchisimo! :) Gracias por tu explicacion y los proximos minutos los dedicare a tu tutorial, edito y te comento!

Gracias!  :D

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

Hola nuevamente :) He revisado el tutorial, es excelente (aunque aun no lo termino) y te lo agradezo muchisimo. Tengo unas duditas :P . Al presionar "Find out what adresses..." sobre la memoria en la lista de direcciones se abre una nueva ventana y comienza a trabajar. Este trabajo será constante o terminará en algún momento?  Ya que los botones de la derecha se me visualizan deshabilitados y no puedo modificar el valor porque el programa esta casi paralizado :(.

Gracias nuevamente!

Unbr0ken

Si te refieres a ésta opción:



Estás haciéndolo de manera errónea, ya que obviamente al usar cualquier opción de las que las imagen muestra, estás estableciendo un breakpoint (o punto de quiebre) al acceso de tal dirección; lo que causará que justo en el momento que el proceso quiera acceder a tal dirección, este se detendrá para esperar que el usuario haga algo con él, ya sea depuración, o lo que se le venga en gana. El punto es que al hacer ello estableces un breakpoint, por eso es que se "cuelga" el proceso.

Ahora me pregunto el cómo llegaste ahí... la manera correcta de hacerlo era eligiendo tal opción PERO en la lista de direcciones que el CE nos ofrece, es decir:



Donde: [0x00701850] era una dirección dinámica la cual se va a puntear.

Partiendo de esto, puedes continuar con el mini-tutorial.

Salud.
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

.:UND3R:.


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Иōҳ

Cita de: Unbr0ken en 11 Diciembre 2011, 23:18 PM
Sí, siempre serán estáticos, ya que estos los establece el compilador.

No del todo, ejemplo.

[AddressBase]

$ + 04h [Instrucción1]
$ + 08h [Instrucción2]
$ + 0Ch [Instrucción3]

El desplazamiento para la [Instrucción3], es 0Ch apartir de la AddressBase es decir

AddressBase + 0Ch = Instrucción3

Pero que pasa si el programador se le ocurre hacer esto:

[AddressBase]

$ + 04h [Instrucción1]
$ + 08h [Instrucción2]
$ + 0Ch [Instrucción2.1]
$ + 010h [Instrucción3]

El desplazamiento para la [Instrucción3] cambió ahora es 010h es decir,

AddressBase + 010h = Instrucción3

En ambos casos, aunque el offset cambió obtengo lo mismo.

Si lo llevamos al mundo real, en un game que hacen constantes actualizaciones, puede que agregen o quiten código, eso quiere decir que el offset puede cambiar, respecto a la actualización dada.


También Podrías encontrarte con esto:

BasePointer ->Pointer ->Pointer ->Address Dinámica

Un Pointer de muchas bases, o multilevel pointer cómo lo llama el CE.

En fin...




Esto no va particularmente a nadie....

Estoy cansando de ver tutoriales con el CE de cómo encontrar punteros sin dar la más mínima base, siquiera hacer una pequeña referencia LittleEndian (ya que si trabajas jugando en memoria debes conocer el concepto), y el PORQUE funciona los settings de el CE de esa manera, que es lo que hace el SearchPointer del CE, y si NO tengo CE, en tengo un CE limitado que a las justas puedo hacer un Scanning (por la culpa de los anticheats), que hago? dejar de depender de todas las opciones del CE.

Que verán , para los juegos jodedos a las justan tendrán la opción Scanning del CE y eso es.....

Estoy cansando de ver tuts, que digan click aquí, click aquí... click en esta otra opción, bajalo al CT, has esto y esto, pero ningún porque, o almenos teoría de porque funciona esto así.

En games ONLINE lo primero que se bajan es el CE xD.

No quiero crear ningún flame ni trollear a nadie, pero yo vengo de un mundo "gamehackers" y la verdad apesta (almenos por dónde yo estuve), si señor, y dejenme decirles que nadie suelta nada, es un mundo cerrado, por la simple razón que muchos sólo saben ser lammers usando toolsitas sin saber porque funciona así, o la teoría de cómo hace tal o cual scan


Por ejemplo cuando veas algo así:
en esa settings del CE que te dice para encontrar el posible pointer (no recuerdo el nombre de la subventana)

mov eax,[ebx+esi*4+00001234]

Sería mucho pedir que dijeran esto?

EBX = AddressBase
ESI = Indice
*4 = Escala
1234h = Offset

Creo que toca hacer  un Tut sobre esto...

En fin...  :-\

Nox, sin animo de trollear.

Eres adicto a la Ing. Inversa? -> www.noxsoft.net

calk9

Cita de: Unbr0ken en 12 Diciembre 2011, 05:44 AM
Si te refieres a ésta opción:



Estás haciéndolo de manera errónea, ya que obviamente al usar cualquier opción de las que las imagen muestra, estás estableciendo un breakpoint (o punto de quiebre) al acceso de tal dirección; lo que causará que justo en el momento que el proceso quiera acceder a tal dirección, este se detendrá para esperar que el usuario haga algo con él, ya sea depuración, o lo que se le venga en gana. El punto es que al hacer ello estableces un breakpoint, por eso es que se "cuelga" el proceso.

Ahora me pregunto el cómo llegaste ahí... la manera correcta de hacerlo era eligiendo tal opción PERO en la lista de direcciones que el CE nos ofrece, es decir:



Donde: [0x00701850] era una dirección dinámica la cual se va a puntear.

Partiendo de esto, puedes continuar con el mini-tutorial.

Salud.

Es de la manera correcto como lo estoy haciendo... como lo indica la segunda imagen y me sucede lo comentado anteriormente :(

Unbr0ken

#7
Cita de: Иōҳ en 12 Diciembre 2011, 15:17 PM
También Podrías encontrarte con esto:

BasePointer ->Pointer ->Pointer ->Address Dinámica

Un Pointer de muchas bases, o multilevel pointer cómo lo llama el CE.

En fin...

Creo que eso quedó más que explicado en el mini-tuto que le he dado al tío.

Cita de: Иōҳ en 12 Diciembre 2011, 15:17 PM
(...)Esto no va particularmente a nadie....

...

Nox, sin animo de trollear. (...)

Te respondo esta última cita vía MP, ya que... está desviando el tema del tío y NO quiero eso.




Cita de: calk9 en 12 Diciembre 2011, 01:34 AMAl presionar "Find out what adresses..." sobre la memoria en la lista de direcciones se abre una nueva ventana y comienza a trabajar. Este trabajo será constante o terminará en algún momento?  Ya que los botones de la derecha se me visualizan deshabilitados y no puedo modificar el valor porque el programa esta casi paralizado :(.

Ya pues mira:

El trabajo será continuo hasta que lo detengas (obviamente se detiene haciendo click en Stop), ya que estará el CE analizando y esperando por el acceso a la dirección que estás punteando. Por ende, no terminará en ningún momento, a menos que el proceso sea cerrado, o el CE crashee, o que se yo... algo relacionado.

Los botones en la derecha estarán deshabilitados debido que debes seleccionar una de las instrucciones (que acceden a tu dirección dinámica) que aparecerán en un futuro luego de haber modificado el valor de tu dirección (luego de que algún opcode acceda a tu dirección dinámica). En pocas palabras, se habilitan al seleccionar un elemento de la lista, si está vacía, permanecerán deshabilitados.

Ahora, el programa se puede retrasar/bajar su velocidad de rendimiento increíblemente si el CE se encuentra maximizado, ya que "el trabajo" que mencionas, es "bastante pesado", por tal, minimiza el CE e intenta cambiar el valor, te recomiendo que el juego/programa no se encuentre en modo ventana, si no hay opción para jugarlo/usarlo en pantalla completa pues... suerte :xD.

Salud.
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

calk9

Cita de: Unbr0ken en 13 Diciembre 2011, 03:31 AM
Ya pues mira:

El trabajo será continuo hasta que lo detengas (obviamente se detiene haciendo click en Stop), ya que estará el CE analizando y esperando por el acceso a la dirección que estás punteando. Por ende, no terminará en ningún momento, a menos que el proceso sea cerrado, o el CE crashee, o que se yo... algo relacionado.

Los botones en la derecha estarán deshabilitados debido que debes seleccionar una de las instrucciones (que acceden a tu dirección dinámica) que aparecerán en un futuro luego de haber modificado el valor de tu dirección (luego de que algún opcode acceda a tu dirección dinámica). En pocas palabras, se habilitan al seleccionar un elemento de la lista, si está vacía, permanecerán deshabilitados.

Ahora, el programa se puede retrasar/bajar su velocidad de rendimiento increíblemente si el CE se encuentra maximizado, ya que "el trabajo" que mencionas, es "bastante pesado", por tal, minimiza el CE e intenta cambiar el valor, te recomiendo que el juego/programa no se encuentre en modo ventana, si no hay opción para jugarlo/usarlo en pantalla completa pues... suerte :xD.

Salud.

Gracias! Lo tendré en cuenta y luego edito :)