Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: hanfix en 8 Mayo 2012, 09:03 am



Título: Escribir directamente en zona de memoria
Publicado por: hanfix en 8 Mayo 2012, 09:03 am
Hola.

Esto es una curiosidad, simplemente. Estoy empezando con C++. Me gustaría saber si es posible escribir en una zona de memoria determinada del ordenador, y que, después, leer de esta dirección de memoria este valor (como un debug del DOS, de antiguamente, vamos).

El tema viene porque lo he leído en otro foro. Cuando con Microsoft Visual C++ Express Edition haces

#include <iostream>
using namespace std;

int main{

int n;

cout << n ;
}

n vale 1; en mi ordenador, o incluso si lo ejecuto en una máquina virtual.

Si declaro otra variable, ya no, ya toma otros valores aleatorios.

Es una curiosidad, tal vez no sirva para nada. Por ahí comentan que tiene que ver con la memoria dinámica y tal, que si es valor basura. Estoy de acuerdo, pero; ¿cómo saber de dónde sale ese valor? ¿Se podría escribir un "2" por ejemplo y que cuando vuelva a ejecutar el anterior programa n valiese "2", sin haberla inicializado? ¿O es que el compilador tiene "algo" que la inicializa a "1"?

Es que estoy jubilado y tengo que perder el tiempo con algo...entendedme.

Saludos....


Título: Re: Escribir directamente en zona de memoria
Publicado por: Oblivi0n en 8 Mayo 2012, 09:46 am
Te respondo un poco por alto.

Cuando tu ejecutas un programa en windows, se hace de tal modo que no puedas escribir en cualquier zona de memoria, cada programa tiene una zona reservada, el modo de escribir en memoria sería con un puntero, a este le asignas una zona de memoria, y apartir de ahí puede escribir en esa zona de memoria o en otras si vas cambiando el puntero.

La respues es muy por alto para que te hagas una idea, y no funciona exactamente así.

Código
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int _tmain(int argc, char** argv[])
  6. {
  7. int ejemplo = 4; // variable de ejemplo
  8. int *punteroAejemplo = &ejemplo;
  9. printf(" Puntero a ejemplo %x   Valor que contiene : %d",punteroAejemplo,*punteroAejemplo);
  10. system("PAUSE");
  11. return 0;
  12.  
  13. }

puntero a ejemplo contiene la direccion de memoria de la variable ejemplo, y el operador & le asigna su direccion de memoria al puntero "punteroAejemplo". Despues en el printf * desreferncia (accede a) la direccion de memoria a la que apunta "punteroAejemplo". Sin este operador, debería de imprimirse la direccion  de memoria de la variable ejemplo


Título: Re: Escribir directamente en zona de memoria
Publicado por: hanfix en 8 Mayo 2012, 09:54 am
Gracias. Ya entiendo más o menos por dónde van los tiros.


Título: Re: Escribir directamente en zona de memoria
Publicado por: Eternal Idol en 8 Mayo 2012, 11:31 am
Hay que inicializar las variables antes de usarlas, las locales como n se alojan en la pila y su valor es aleatorio en estos casos (lo que sea que hubiera en la pila).


Título: Re: Escribir directamente en zona de memoria
Publicado por: hanfix en 9 Mayo 2012, 21:52 pm
No obstante, resulta extraño que, siendo valores aleatorios, en otro ordenador, ejecutando el programa, el valor de n siga valiendo 1 si no la inicializas. Es como si el propio compilador la inicializara a 1 por algún motivo...
Lo que me demuestra que debe ser el compilador es que si ahora declaro 2 variables tipo int; por ejemplo "p" y "n", sin inicializar, me dan dos valores "aleatorios"
n=4294156 y p=4248043. Resulta que si ejecuto el mismo programa en otro PC, ¡me dan los mismos valores!
Da igual cómo llame a las variables. Esto quiere decir que el compilador "da" unos valores a las variables; o algo así... En fin, no sé si darle más vueltas a estas chorradillas.

Saludos...no perdáis el tiempo por mi.


Título: Re: Escribir directamente en zona de memoria
Publicado por: Lambda en 9 Mayo 2012, 23:34 pm
No obstante, resulta extraño que, siendo valores aleatorios, en otro ordenador, ejecutando el programa, el valor de n siga valiendo 1 si no la inicializas. Es como si el propio compilador la inicializara a 1 por algún motivo...
Lo que me demuestra que debe ser el compilador es que si ahora declaro 2 variables tipo int; por ejemplo "p" y "n", sin inicializar, me dan dos valores "aleatorios"
n=4294156 y p=4248043. Resulta que si ejecuto el mismo programa en otro PC, ¡me dan los mismos valores!
Da igual cómo llame a las variables. Esto quiere decir que el compilador "da" unos valores a las variables; o algo así... En fin, no sé si darle más vueltas a estas chorradillas.

Saludos...no perdáis el tiempo por mi.

En este caso la palabra aleatorio deberia de ser reemplazada por "valor no garantizado" puede ser 1, 129308129038 o cualquier otro numero, puede ser el mismo en varios PC (por la manera que el windows inicializa el stack) pero el tema es que nada te garantiza el valor inicial.