Cambiar el valor de una variable en un puntero

Iniciado por boy-ka, 7 Abril 2015, 08:31 AM

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

boy-ka

Holaaa!, bueno, pues eso quisiera saber si es posible cambiar el valor de una variable en un puntero.

Ejemplo

var x ="hola";
x está en la posición: 00x3a; de la memoria << solo por decir una posición...

Pero yo quiero cambiar la variable, no cambiando el valor de x. Si no cambiando el valor del puntero, osea quisiera saber si puedo modificar el valor que tiene un puntero sin conocer el nombre de la variable..

No se si me expliqué bien, básicamente es lo que se puede hacer Cheat Engine, modificar el valor de un puntero, pero querría saber si se puede hacer desde C++, y si es así cómo?

Gracias por leer.

eferion

si "p" es un puntero, con "p" accedes a la dirección de memoria apuntada y con "*p" accedes al contenido de la memoria apuntada. Un ejemplo:

Código (cpp) [Seleccionar]
int variable1 = 5;
int variable2 = 10;

int* puntero; // ahora mismo no apunta a nada válido
puntero = &variable1; // puntero apunta a "variable1"
printf( "0x%x -> %d\n", puntero, *puntero );

// Cambiamos el valor "apuntado"
*puntero = 23;
printf( "0x%x -> %d\n", puntero, *puntero );

puntero = &variable2; // puntero apunta a "variable2"

printf( "0x%x -> %d\n", puntero, *puntero );

// Cambiamos el valor "apuntado"
*puntero = 71;
printf( "0x%x -> %d\n", puntero, *puntero );

printf( "variable1: %d\n", variable1 );
printf( "variable2: %d\n", variable2 );


boy-ka

Cita de: eferion en  7 Abril 2015, 09:01 AM
si "p" es un puntero, con "p" accedes a la dirección de memoria apuntada y con "*p" accedes al contenido de la memoria apuntada. Un ejemplo:

Código (cpp) [Seleccionar]
int variable1 = 5;
int variable2 = 10;

int* puntero; // ahora mismo no apunta a nada válido
puntero = &variable1; // puntero apunta a "variable1"
printf( "0x%x -> %d\n", puntero, *puntero );

// Cambiamos el valor "apuntado"
*puntero = 23;
printf( "0x%x -> %d\n", puntero, *puntero );

puntero = &variable2; // puntero apunta a "variable2"

printf( "0x%x -> %d\n", puntero, *puntero );

// Cambiamos el valor "apuntado"
*puntero = 71;
printf( "0x%x -> %d\n", puntero, *puntero );

printf( "variable1: %d\n", variable1 );
printf( "variable2: %d\n", variable2 );



Ya, pero quiero decir si puedo recuperar el valor de cualquier puntero aunque no esté siendo utilizado por ese mismo programa, un ejemplo:

puntero = 00x144a;

Quisiera saber si eso es posible, gracias por la respuesta man.

ivancea96

Para cambiar un valor de memoria fuera de tu proceso, tendrás que utilizar funciones del sistema operativo. En caso de Windows, WriteProcessMemory(), al que le tienes que pasar un HANDLE al proceso en cuestión, que puedes obtener con OpenProcess(), al que le has de pasar el ProcessID del proceso.

Para encontrar procesos por su nombre, puedes usar CreateToolhelp32Snapshot(), Process32First() y Process32Next(), que te llenarán una estructura PROCESSENTRY32, cuyo campo th32ProcessID es el PID de cada proceso, y szExeFile el nombre del ejecutable del proceso.

La información de las funciones la puedes encontrar en MSDN, basta Googlear los nombres.

boy-ka

#4
Cita de: ivancea96 en  7 Abril 2015, 10:17 AM
Para cambiar un valor de memoria fuera de tu proceso, tendrás que utilizar funciones del sistema operativo. En caso de Windows, WriteProcessMemory(), al que le tienes que pasar un HANDLE al proceso en cuestión, que puedes obtener con OpenProcess(), al que le has de pasar el ProcessID del proceso.

Para encontrar procesos por su nombre, puedes usar CreateToolhelp32Snapshot(), Process32First() y Process32Next(), que te llenarán una estructura PROCESSENTRY32, cuyo campo th32ProcessID es el PID de cada proceso, y szExeFile el nombre del ejecutable del proceso.

La información de las funciones la puedes encontrar en MSDN, basta Googlear los nombres.

Excelente, muchisimas gracias, aunque esto se puede utilizar para fines maliciosos xD.
De todos modos eso está ahí por algo, Electro magnético voy a investigar sobre ello.

PD {ESCRIBÍ ELECTRO MAGNÉTICO, PORQUE PENSÉ QUE ERAS ELEKTRO XD}

eferion

Cita de: boy-ka en  7 Abril 2015, 10:09 AM
Ya, pero quiero decir si puedo recuperar el valor de cualquier puntero aunque no esté siendo utilizado por ese mismo programa, un ejemplo:

puntero = 00x144a;

Quisiera saber si eso es posible, gracias por la respuesta man.

Si yo veo que una posición de memoria tiene el valor 0x144a no tengo forma de saber si ese valor se corresponde con una dirección de memoria apuntada o con un valor.

En cualquier caso, ivancea96 te ha comentado una forma en la que puedes modificar la memoria de programas externos.

Un saludo