Autor
|
Tema: Modificar exe mediante trainer (Leído 12,005 veces)
|
msrone
Desconectado
Mensajes: 11
|
Wenas, soy demasiado novato para expresarm correctamente pero voy a intentar explicar mi problema: La cuestion es que quiero crear un trainer, es decir, quiero crear un programa para que cambie en un determinado momento la memoria del exe del juego y se puedan añadir mas recursos, vidas y tal. He estado leyendo, y utilizo el tsearch para ver la direccion que me interesa, y ahora no se como puedo escribir el codigo para poder modificar el value de esa direccion cuando a mi me de la gana. He probado a utilizar el trainer maker kit, xro al no tener suficientes conocimientos me kedo blokeado. Muchas gracias por la ayuda
|
|
|
En línea
|
|
|
|
x4uth
Desconectado
Mensajes: 88
|
Lo tipico es hacer el trainer el C++ usando las apis WriteProcessMemory y ReadProcessMemory para leer y escribir, para esto debes tener un handle del proceso que se optiene con OpenProcess para OpenProcess necesita la pid (id del proceso q se puede optener con GetWindowThreadProcessId si tenemos el handle de la ventana ahi te pongo un ejemplo por si no entendiste bien :/ /* Esto es un trainer sencillo que congela el tiempo del buscaminas (by x4uth) */ #include <windows.h> #include <stdio.h> #define OFFSET_TIEMPO 0x100579C
int main () { HWND hWnd; DWORD dwProcessId; DWORD dwOldProtect; HANDLE hProcess; int tiempo;
hWnd = FindWindowA(0, "Buscaminas"); // Conseguimos el handle de la ventana del buscaminas if(hWnd == NULL) { printf("No se encontro la ventana\n");return FALSE;}
GetWindowThreadProcessId(hWnd, &dwProcessId); // Obtenemos el id del proceso con el handle if(dwProcessId == NULL) { printf("No se pudo obtener la id del processo\n");return FALSE;}
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); // Abrimos el proceso if(hProcess == INVALID_HANDLE_VALUE) { printf("No se pudo abrir el proceso\n");return FALSE;}
ReadProcessMemory(hProcess,(LPVOID)OFFSET_TIEMPO, &tiempo, 4, NULL); //leemos el tiempo actual (para congelarlo en el numero aunque podemos hacerlo en el numero q queramos) printf("Se congelara el tiempo en %d\n",tiempo); for (;;Sleep(1000)) { //entramos en un loop infinito q se ejecuta cada 1 segundo WriteProcessMemory(hProcess,(LPVOID)OFFSET_TIEMPO, &tiempo, 4, NULL); //ponemos el tiempo a nuestro numero }
return 0; }
|
|
|
En línea
|
|
|
|
msrone
Desconectado
Mensajes: 11
|
Muchisimas gracias por contestar, me resulta un poco dificil todo esto, ya que de C++ no se aun casi nada. Y si quiero coger un tipo de recurso del juego y subirlo al numero que yo desee como se podria poner? p.D... si me puedes recomendar algun sitio para ir aprendiendo C++ te estare muy agradecido . Muchas gracias
|
|
|
En línea
|
|
|
|
x4uth
Desconectado
Mensajes: 88
|
no entiendo a que te refieres con recurso, ese ejemplo que te puse modifica la memoria de otro programa (q en este caso es el tiempo q es de 4 bytes), pero siguiendo ese esquema puedes modicar todo lo que este en la memoria del programa ya sea codigo del programa o variables.
para aprender c++ pos no se :/ en esta misma web hay una subforo de c++ , pasate por ahi y pregunta
|
|
|
En línea
|
|
|
|
msrone
Desconectado
Mensajes: 11
|
Vale perfecto, pues lo unico que tendria que tener en cuenta seria el offset de lo q quiero cambiar del programa. Entonces, si yo quisiera agregar una cantidad sobre alguna otra que este ya en el programa, como por ejemplo añadir 1000 de oro, comida, etc... esto se podria hacer siguiendo tu eskema?
P.D... me puedes decir que programa usas para C++...
Disculpa por tanta pregunta, si te parecen ridiculas, pero siempre e kerido aprender esto y nunca e podido.gracias.
|
|
|
En línea
|
|
|
|
x4uth
Desconectado
Mensajes: 88
|
claro es lo mismo, para el oro por ejemplo, lo primero es poner el offset correcto #define OFFSET_TIEMPO 0x100579C <--- ahi pones el del oro luego todo igual hasta que lees el oro con ReadProcessMemory(hProcess,(LPVOID)OFFSET_TIEMPO, &tiempo, 4, NULL); ahi tenemos el oro actual en "tiempo" asi que le sumamos la cantidad que quieres ahi solo te falta escribir ese numero en la memoria WriteProcessMemory(hProcess,(LPVOID)OFFSET_TIEMPO, &tiempo, 4, NULL); y el bucle for no haria falta pues en este caso queremos aumentar el oro en una cantidad no dejarlo fijo... pd. si te fijas ni cambie el nombre de tiempo por oro, pues da lo mismo lo q sea, el nombre de la variable es solo el nombre...
|
|
|
En línea
|
|
|
|
msrone
Desconectado
Mensajes: 11
|
Vale perfecto, te e entendido bastante bien.
Mis dudas ahroa es si para determinar un offset por ejemplo del oro, debo de realizar una buskeda en la memoria, con el tsearch por ejemplo viendo donde esta la direccion del oro, y despues como lo paso al offset?
Y la segunda, todo esto puede ponerse dentro de un boton que al pulsar de el resultado de añadir esos 10000 de oro?
estoy utilizando el wxdev-C++ pero no puedo compilar tu codigo xq me da error en el NULL...
gracias
|
|
|
En línea
|
|
|
|
x4uth
Desconectado
Mensajes: 88
|
Vale perfecto, te e entendido bastante bien.
Mis dudas ahroa es si para determinar un offset por ejemplo del oro, debo de realizar una buskeda en la memoria, con el tsearch por ejemplo viendo donde esta la direccion del oro, y despues como lo paso al offset?
la direccion q te da el tsearch es el offset Y la segunda, todo esto puede ponerse dentro de un boton que al pulsar de el resultado de añadir esos 10000 de oro?
claro... estoy utilizando el wxdev-C++ pero no puedo compilar tu codigo xq me da error en el NULL...
gracias
no deberia pues el NULL es una constante basica pero bueno pon esto al principio del todo (despues de los includes)
|
|
|
En línea
|
|
|
|
msrone
Desconectado
Mensajes: 11
|
El problema es que el tsearch me da una direccion, pero esta varia. Como se podria arreglar esto?
No e podido compilar tu codigo me da error, explicame por favor como puedo compilarlo.
gracias
|
|
|
En línea
|
|
|
|
x4uth
Desconectado
Mensajes: 88
|
El problema es que el tsearch me da una direccion, pero esta varia. Como se podria arreglar esto?
eso tiene un cierto nivel de complejidad arreglarlo, el tema es que el programa tenga controlada una variable dinamica tiene q tenerla referenciada por un puntero obligatoriamente, este puntero puedes encontrarlo debugando el codigo que modifica dicha direccion y con un poco de suerte ese puntero tendra una direccion fija, la otra opcion es modificar el codigo del programa , por ejemplo el caso del tiempo del buscaminas q se va incrementando cada segundo, para evitar q se incremente bastaria buscar el lugar donde se incrementa , suponiendo que llegue a esta linea INC EAX , tenemos en la direccion de memoria un 0x40 q corresponde a esa operacion, si la cambias por un 0x90 tienes un NOP con lo cual no se incrementaria el tiempo. una tercera forma seria buscar una referencia constante en el bloque de memoria pues muchas veces nuestra variable pertence a una clase o otro tipo de estructura que pueden tener partes constantes, en este caso tendrias q contar los bytes de diferencia, y bastaria con buscar la constante y sumar o restar los bytes de diferencias a la direccion obtenida para obtener la direccion q queremos No e podido compilar tu codigo me da error, explicame por favor como puedo compilarlo.
con Visual C++ 2005 compila perfectament, = si me dices el error te puedo ayudar
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
que es y para que sirve un trainer
Juegos y Consolas
|
chipbios
|
2
|
5,998
|
16 Mayo 2005, 19:29 pm
por chipbios
|
|
|
Ayuda a krear un trainer
Ingeniería Inversa
|
dualitydark
|
1
|
2,106
|
4 Febrero 2008, 00:59 am
por tena
|
|
|
Modificar Propiedades de conexion internet mediante c#[SOLUCIONADO]
.NET (C#, VB.NET, ASP)
|
Pablo Videla
|
1
|
7,483
|
22 Enero 2010, 05:44 am
por Pablo Videla
|
|
|
Un trainer es un Troyano?¿?¿?¿
« 1 2 3 »
Análisis y Diseño de Malware
|
beholdthe
|
27
|
17,725
|
11 Septiembre 2011, 05:46 am
por Milo_EscorpioNN
|
|
|
soccer trainer 3.0
Ingeniería Inversa
|
quinipilar
|
6
|
8,636
|
18 Agosto 2011, 05:45 am
por .:UND3R:.
|
|