GodSys

GodSys
El Poder de la Programación

miércoles, 28 de abril de 2010

Linux: Modificar valor en memoria!

Hola..qué tal? De nuevo por acá =D...

Ahora les traigo un código que vimos anteriormente pero que era para Window$... Les traigo el código en C de un programa que modifica un valor de una dirección de memoria de un proceso exterior a este...
*Recuerdan que en Window$ utilizamos OpenProcess() para abrir un proceso y WriteProcessMemory() para escribir un valor sobre una dirección de memoria de dicho proceso??..Bueno..ahora realizaremos lo mismo de una forma más sencilla sobre Linux...

Para realizar esto utilizaremos una de las funciones más "copadas" que nos provee Linux(está explicada vulgarmente con mis palabras para su mejor entendimiento):

- ptrace(Qué se hará con el proceso, PID del proceso, Dirección de memoria, Valor que se asigna en esa dirección);

Esta función permite tracear, debugear, tomar el control de un proceso para modificarlo, ver sus resultados y su funcionamiento, étc.
En este caso lo utilizamos para "tomar el control de un proceso" y luego escribir en una dirección de memoria un valor, o cambiar un valor de una dirección de memoria **(SI NO SE ENTIENDE ESTO VER LAS PUBLICACIONES ANTERIORES PARA UN MEJOR ENTENDIMIENTO)...

Acá está el código:

#include <>
#include <>>
#include <>
#include <>
#include <>

int main()
{
ptrace(PTRACE_ATTACH, 3895, NULL, NULL);
wait(NULL);

ptrace(PTRACE_POKEDATA, 3895, 0x8070bd4, 1111111111);

ptrace(PTRACE_DETACH, 3895, NULL, NULL);


return 0;
}

Pasamos a explicar:
·PTRACE_ATTACH: con esto nos "atachamos" al proceso, es decir, tomamos su control..cabe destacar que el proceso al que nos atachamos ya está en ejecución. Es como si abriera el proceso para modificarlo.
·3895: es el PID (Process ID), es decir, un identificador que identifica a cada proceso, es único y diferente para cada proceso. Para poder ver los PIDs de todos los procesos en ejecución ejecutamos "ps aux" (sin las comillas) en una terminal y nos saldrá una lista con todos los procesos que se están ejecutando en nuestro sistema y en la segunda columna llamada "PID" nos sale el PID de cada proceso..cabe destacar que los PIDs son números. Este PID es el que colocamos aquí.
·PTRACE_POKEDATA: esto nos permite introducir valores en la memoria del proceso al que nos atachamos anteriormente.
·0x8070bd4: esta es la dirección de memoria en donde modificaremos y almacenaremos el valor que especificaremos a continuación.
·1111111111: este es el nuevo valor que se introducirá en la dirección de memoria que especificamos anteriormente. Lo pueden cambiar por los nuevos valores que quiera...cabe destacar que es un valor long en este caso, así que intenten probando este número por si el valor que quieren cambiar no cambia...
·PTRACE_DETACH: dejamos seguir corriendo al proceso normalmente ya que hicimos las modificaciones que quisimos en el mismo.

Bueno..este código lo que hace es modificar al "Balance" en el Blackjack (juego que viene por defecto con Ubuntu). Acuerdensen que tienen que introducir el PID correcto del proceso para abrirlo y modificarlo, el PID una vez que finalizan y vuelven a abrir el proceso cambia, así que estén atentos.

Sigan investigando acerca del ptrace() que es muy interesante...
Y si quieren encontrar las direcciones de memoria de diferentes valores de diferentes procesos utilizen: scanmem (busquenlo en Google.com e informense sobre su uso).

Gracias...me voy a dormir :D
Hasta la próxima!
GodSys

No hay comentarios:

Publicar un comentario