Creacion de un trainer en c++

Iniciado por patilanz, 1 Octubre 2014, 21:09 PM

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

patilanz

Hola desde hace tiempo tengo muchas de editar la memoria de una aplicación. Quiero hacer un programa que cambie por ejemplo la cantidad de algo en un juego o en otro programa.
Como cheat-engine pero automático como los trainers de los juegos.

Se como leer la memoria y escribir pero no se como encontrar la variable que tiene guardado este valor.

Lo hago en windows.

Un saludo

BlackM4ster

Usa cheat engine para sacar las direcciones de memoria y los pointers que apuntan a ellas. Luego sigues esos punteros y magia
- Pásate por mi web -
https://codeisc.com

patilanz


ivancea96

Siempre habrá una variable fija en la memoria (el puntero), que apuntará a las variables dinámicas.
Si esta variable no fuera fija, ¿cómo se podría acceder a ella?

BlackM4ster

Cita de: ivancea96 en  2 Octubre 2014, 11:39 AM
Siempre habrá una variable fija en la memoria (el puntero), que apuntará a las variables dinámicas.
Si esta variable no fuera fija, ¿cómo se podría acceder a ella?
+1
- Pásate por mi web -
https://codeisc.com

patilanz

No os entiendo. De que puntero habláis ?? Yo por puntero entiendo algo que apunta a una dirección de memoria pero esta dirección es diferente cada vez que inicias el programa.

Hice una prueba con cheat-engine este código:

Código (cpp) [Seleccionar]
int a = 2;
while(1){
printf("%i",a++);
fflush(stdin);
getchar();
}

Encuentro la variable a y consigo cambiar la con cheat-engine. También veo la dirección de memoria pero esta es cada vez deferente al cerrar el programa por lo que no puedo utilizarlo.

Como se llama este puntero fijo para poder buscar info sobre el ?
Me lo podéis explicar ?

Gracias

ivancea96

La dirección en memoria dentro del programa no cambia.
En general, solo cambia si es memoria dinámica.

patilanz

La dirección que encuentro con cheat-engine cambia cada vez que cierro y abro el programa.
Intente con este codigo:

Código (cpp) [Seleccionar]
DWORD processes[8000], total_size;
EnumProcesses(processes, sizeof(processes), &total_size);
for (int i = 0; i < sizeof(processes) / total_size; i++){
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, false, processes[i]);
if (process != NULL){
DWORD id = GetProcessId(process);
if (id == 5076){//Lo veo con tasklist (luego lo hago mejor)
int data = 200;
if (!WriteProcessMemory(process, (LPVOID)0X0113FE78, &data, 4, 0)){
cout << GetLastError();
}
else{
cout << "good";
}
}
}
}


Si encuentro la memoria con cheat engine y sin cerrar el programa cambio el valor de 0X0113FE78 funciona bien pero si cierro y vuelvo a abrir el programa ya la dirección no es la misma y me tira el error de 487 ERROR_INVALID_ADDRESS.

BlackM4ster

Pero eso no tiene sentido, estás seguro de que esa variable que dices encontrar es la correcta? Igual no estás encontrando la variable en sí, sino la copia que hace de ella para el printf
- Pásate por mi web -
https://codeisc.com

patilanz

También probé con cout pero no debe de ser esto ya que encuentro solo una dirección. Utilizo visual studio 2013 puede ser una defensa o algo así que te lo ponga que todos los programas para memoria dinámica?