Anuncios Google

Acceder a memoria de otro programa

¿Como puedo acceder(desde C o ASM, me da iugal, si es en VB mucho mejor)a la memoria de otro programa(en este caso gta_sa.exe, tengo varias direcciones)y modificar estos valores?Estoy tratando de hacer unos mods para GTASA, pero necesito modificar varias cosas desde un programa para evitarme muchas lineas de codigo SCM, el cual es muy engorroso...



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de -Prince-

¡Ah, Almamu...!

¡... Tú y tus proyectos! xD++

Imagen de Almamu

No es realmente un proyecto,

No es realmente un proyecto, si no mas bien para aprender...

Imagen de pspgorrister

Buf, hace años que no hago

Buf, hace años que no hago eso, ¡qué tiempos aquellos diseñando viruses, y crujiendo exes! Sonrisa

No te voy a decir cómo exactamente, porque si te digo la verdad, no me acuerdo, lo que si tienes que buscar, son las funciones del API de Windows tales como

Con esas 4 ó 5 funciones, tienes todo lo que necesitas para hacerlo, la verdad es que no es muy complicado. Realmente es como abrir un fichero, posicionarte en un lugar del mismo y escribir en él.

Si te sale, péganos el código para que aprendamos.

Un saludo y suerte.

 

 

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de Almamu

Haber, he conseguido usar las

Haber, he conseguido usar las funciones, pero ahora no consigo que habra el proceso, en un ejemplo veo:

PROCESSENTRY32 pe32;
 
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );

El problema es que el proceso que busco se llama gta_sa.exe y no se como hacer para sacar esa estructura con ese proceso, para buscarlo uso esto:

    HWND handle = FindWindow(NULL, "GTA: San Andreas");
    LPDWORD id;
    DWORD id2 = GetWindowThreadProcessId(handle, id);
    HANDLE oHandle = OpenProcess(PROCESS_ALL_ACCESS, false, id);
    LPVOID lpBuffer;
    SIZE_T *lpNumberOfBytesRead;
    ReadProcessMemory(oHandle, (const void*)0xB7CE50, lpBuffer, sizeof(int), lpNumberOfBytesRead);
    HWND ventana;
    ventana=FindWindow(NULL,"x - Bloc de notas");
    SendMessage(ventana,WM_SETTEXT,0,(long) &lpBuffer);

No estoy seguro de como se pone la direccion de memoria, pero por el momento no me preocupa eso, si no la funcion OpenProcess, no consigo abrir el proceso correctamente y me esta empezando a liar y mucho... Alguna ayuda.

 

Las tres ultimas lineas lo que hacen es escribir en el bloc de notas lo que contiene la direccion que leo, por eso no os preocupeis.


Imagen de pspgorrister

Pues a simple vista, me

Pues a simple vista, me parece que lo de OpenProcess está bien, aunque hace tiempo que hago eso y puede estar mal. Prueba a poner la función GetLastError después de esa instrucción y consulta el error que te devuelve el API (te devuelve un DWORD con el código del último error).

Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de Almamu

He conseguido que busque el

He conseguido que busque el proceso y me devuelva el pId, osea, que ya he conseguido entrar al proceso. El codigo esta en C++, pero creo que se puede portar a C. Lo he compilado con Code Blocks 8.02:

#include <windows.h>
#include <iostream>
 
 int main()
 {
     DWORD pId; HWND hWnd; HANDLE hMine;
     do {
         hWnd = FindWindow(0, "GTA: San Andreas");
         Sleep(10);
     } while(hWnd == NULL);
 
     std::cout << "Se encontro el GTA: San Andreas." << std::endl;
     GetWindowThreadProcessId(hWnd, &pId);
     if(pId != 0) {
         hMine = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
         if(hMine != NULL) {
             std::cout << "Abierto el proceso. pId = " << pId << std::endl;
             CloseHandle(hMine);
         }
     } else {
         std::cout << "Fallo al buscar pID." << std::endl;
     }
 }

El problema llega al introducir esto:

                 int data;
                 DWORD *lpNumberOfBytesRead;
                 ReadProcessMemory(hMine, (LPVOID)MONEY, &data, sizeof(int), lpNumberOfBytesRead);
                 std::cout << data << std::endl;

Se para en ReadProcessMemory, MOENY es:

#define MONEY 0xBAA420

Tambien he probado a escribir en memoria:

                 bool result = WriteProcessMemory(hMine, MONEY, (LPVOID)0, sizeof(0), NULL);
                 std::cout << result << std::endl;

Estavez estaba usando esta direccion:

#define MONEY (LPVOID)0xB749D0

Pero devuelve 0(o sea, que no escribe en memoria...). Esta ultima direccion es la vida del personaje, de tipo float.

¿Alguna idea de porqué?


Imagen de pspgorrister

uhmm

Estás pasando un LPVOID, y debe de tomar el valor de algún sitio, A ver, el valor 0xBAA420, no puede ser un valor "fijo", ya que es una dirección de memoria relativa a donde esté el programa.

Si el Gta se ejecuta en la dirección 3000, Debes leer/escribir en la dirección 3000+MONEY. Nunca va a aparecer en la misma dirección de memoria al cargarse el GTA (puede que sí, pero eso es jugar a los datos), la siguiente vez puedes estar en la dirección 50332A, y deberías leer en 50332A+Money

Usa VirtualAllocEx, Ahí optendrás una variable LPVOID, que contiene la dirección de memoria donde empieza el proceso (en este caso el GTA), luego es poner direccion_inicio+MONEY. memoriaInicial = VirtualAllocEx(hMine, NULL, sizeof(data), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE). Luego seguramente, se quede así, creo que no hace falta hacer un typecast de LPVOID:

ReadProcessMemory(hMine, memoriaInicial+MONEY, &data, sizeof(int), lpNumberOfBytesRead);

Despues tienes que usar VirtualAllocFree para liberar y por último en CloseHandle.

PD: Igual estoy desvariando y he dicho alguna barbaridad. Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de Almamu

Haber, ahora mismo al

Haber, ahora mismo al compilar me tira:

error: invalid operands of types `void*' and `void*' to binary `operator+'

He puesto lo que has dicho, pero solo consigo ese error...


Imagen de pspgorrister

¿Has definido memoriaInicial

¿Has definido memoriaInicial como LPVOID?, o prueba a hacerle un cast LPVOID.

Imagen de Almamu

Si, esta en LPVOID, pero

Si, esta en LPVOID, pero nada. ¿A que te refieres con cast?

Haber, este es el codigo:

#include <windows.h>
#include <iostream>
#define MONEY (LPVOID)0xBAA420
 int main()
 {
     DWORD pId; HWND hWnd; HANDLE hMine;
     do {
         hWnd = FindWindow(0, "GTA: San Andreas");
         Sleep(10);
     } while(hWnd == NULL);
     std::cout << "Se encontro el GTA: San Andreas." << std::endl;
     GetWindowThreadProcessId(hWnd, &pId);
     if(pId != 0) {
         hMine = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
         if(hMine != NULL) {
             std::cout << "Abierto el proceso. pId = " << pId << std::endl;
             int data;
             LPVOID memoriaInicial = VirtualAllocEx(hMine, NULL, sizeof(data), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
             DWORD *lpNumberOfBytesRead;
             ReadProcessMemory(hMine, memoriaInicial+MONEY, &data, sizeof(int), lpNumberOfBytesRead);
             std::cout << data << std::endl;
             bool status = VirtualFreeEx(hMine, memoriaInicial+MONEY, sizeof(data), MEM_RELEASE);
             std::cout << "Status: " << status << std::endl;
             CloseHandle(hMine);
         }
     } else {
         std::cout << "Fallo al buscar pID." << std::endl;
     }
 }


Imagen de pspgorrister

Creo que me equivoqué y no

Creo que me equivoqué y no hace falta el VirtualAllocEX, es más diría que no hace falta el ReadProcessMemory, porque no quieres leer el valor, sólo escribirlo. La verdad es que ya no estoy seguro de nada xDDD.

const int MONEY = 0xBBAALOQUESEA;  //Prefiero usar constantes a defines
int ahorros = 9999999; //El dinero que sea
 
//(...)
 
hMine = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
WriteProcessMemory(hMine, (LPVOID)MONEY, (LPVOID)&ahorros, sizeof(ahorros), NULL); 
 
//(..)

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de Almamu

Ok, muchas gracias, ya

Ok, muchas gracias, ya funciona ^^

Imagen de Almamu

Entonces no me hace falta

Entonces no me hace falta saber la direccion base del .EXE para esto, no?

Porcierto, he buscado por google un poco mas a fondo y segun he visto y como has dicho no hace falta VirtualAllocEx. Cuando llegue a mi casa pruebo el nuevo código. Muchas gracias por la ayuda.^^


Imagen de Almamu

Ok, muchas gracias amigo,

Ok, muchas gracias amigo, cuando pueda me pongo a ello a ver que tal.

Imagen de P22

Con punteros

Es lo único que se me ocurre...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.