[C con Clase] los temibles punteros

Davidson, Steven srd4121 en njit.edu
Lun Mar 17 18:03:11 CET 2014


Hola Yolmer,

2014-03-16 23:40 GMT-04:00 Yolmer Rosales <yolmer.rosales en gmail.com>:

> Hola lista,
>
> Hace poco, utilicé un plugin del emulador de la playstation que te
> permite buscar y modificar valores cargados en memoria del juego en
> pleno funcionamiento, y pensé que tal vez se podía leer cualquier
> valor en memoria de la computadora usando punteros y c++.
>
> Entonces escribí algo como esto:
>
> int* pos_memoria = (int*) 0xFFFF;
> cout << "posición de memoria:    contenido" << endl  << pos_memoria <<
> " : " << *pos_memoria << endl;
>
> para mi sorpresa funcionó....
>

Esto es lo interesante de C/C++. Puedes acceder a cualquier dirección de
memoria que se te antoje; el lenguaje te lo permite. Sólo existen unos
cuantos lenguajes de programación de alto nivel que permiten el acceso
directo a memoria.

 pero cuando intenté hacer otras asignaciones arbitrarias de memoria
> se acabó la magia y ni hablar del intento de hacer un bucle con 100
> posiciones diferentes.
>
>  Ahora un par de preguntas y otra más
>
> por qué no puedo leer cualquier parte de la memoria que yo quiera? , y
> existe alguna manera de saber las direcciones de memoria que están
> siendo usadas por un programa en particular o el propio programa?
>
>
Existen varias razones:

1. Recuerda que tu programa no se ejecuta directamente, sino mediante el
Sistema Operativo. Nuestras aplicaciones siempre estarán a la merced del
S.O., quien gestiona los recursos, como la memoria y el tiempo de
procesamiento para las aplicaciones.

Hoy día, los SS.OO. no permiten un acceso directo a la memoria, por motivos
de seguridad, pero también por motivos de la gestión correcta de la
memoria, que es la 2ª razón que te voy a comentar.

2. Los SS.OO. actuales usan memoria virtual que se basa en usar direcciones
virtuales de memoria. Brevemente, el gestor de memoria virtual convierte
las direcciones virtuales a direcciones físicas en memoria. Por esta razón,
nuestras aplicaciones no pueden acceder directamente a una dirección de
memoria (física), ya que es posible que tal dirección tomada no corresponda
a la misma dirección física que indicamos.

Si queremos indicar una dirección de memoria física, tenemos que
comunicarnos con el S.O. para permitirnos tal acceso y que no haga la
conversión.

El plugin que comente al principio puede escribirse en c++? o tal vez
> es de nivel más bajo como ASM?
>
>
Sí; se puede hacer en C++ y por supuesto, se puede hacer en ensamblador. La
cuestión importante es si C++ nos es más útil que ensamblador para
solucionar nuestro problema.


Espero que esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140317/46683b9c/attachment.html>


Más información sobre la lista de distribución Cconclase