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
Usa cheat engine para sacar las direcciones de memoria y los pointers que apuntan a ellas. Luego sigues esos punteros y magia
Pero los punteros no cambian ?
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?
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
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:
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
La dirección en memoria dentro del programa no cambia.
En general, solo cambia si es memoria dinámica.
La dirección que encuentro con cheat-engine cambia cada vez que cierro y abro el programa.
Intente con este codigo:
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.
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
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?
No creo, pero haz una prueba:
Mira qué punteros apuntan a la dirección de la variable que encuentras.
Mira qué modifica la variable.
Cita de: patilanz en 2 Octubre 2014, 20:45 PM
La dirección que encuentro con cheat-engine cambia cada vez que cierro y abro el programa.
Intente con este codigo:
(...)
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.
Podés probar lo siguiente:
Buscar la dirección de memoria y comprobar si está dentro del espacio de memoria de un módulo. En caso de que dicho módulo tenga información de reubicación buscar la imagebase y el tamaño del módulo cargado en memoria y analizar donde está y hacer lo que quieras con la dirección de memoria a buscar. En caso de que no esté en un módulo (posiblemente esté en el heap) tendrás que buscar referencias a la dirección de memoria que quieras buscar, una vez que la encuentres buscar a qué módulo hace referencia, verificar si dicho módulo contiene información de reubicación, en caso de que lo tenga tu programa debe buscar la imagebase y el tamaño del módulo cargado en memoria, analizar el puntero y
verificar que lleve a una dirección válida y listo, en caso de que no tenga información de reubicación verificas su imagebase y le sumás el offset (
analizado en memoria el offset) para conseguir la dirección de tu puntero
verificando también que en tiempo de ejecución el puntero lleve a una dirección válida.B#
Cero que me faltan conocimientos para poder hacer lo que me decís.
No se lo que es la imagebase...
Estibe buscando por google y esta muy relacionado con los rootkits pero encontré esto:
http://ns2.elhacker.net/timofonica/manus/Formato_de_ficheros%20ejecutables%20_Formato%20PE_.pdf
No se si me servirá y ademas es solo para windows pero quiero aprender mas sobre la memoria y los módulos. Supongo que necesitare aprender ensamblador ?
Me podéis recomendar algún pdf o algo para aprender y luego intentar de nuevo hacer mi trainer :D
Un saludo
Cita de: patilanz en 3 Octubre 2014, 21:33 PM
Cero que me faltan conocimientos para poder hacer lo que me decís.
No se lo que es la imagebase...
Cita de: msdnImageBase
The preferred address of the first byte of the image when it is loaded in memory. This value is a multiple of 64K bytes. The default value for DLLs is 0x10000000. The default value for applications is 0x00400000, except on Windows CE where it is 0x00010000.
Cita de: patilanz en 3 Octubre 2014, 21:33 PMEstibe buscando por google y esta muy relacionado con los rootkits pero encontré esto:
http://ns2.elhacker.net/timofonica/manus/Formato_de_ficheros%20ejecutables%20_Formato%20PE_.pdf
Si querés hacer un rootkit es más fácil inyectar una dll y modificar la memoria dentro del mismo espacio de memoria del proceso que hacerlo externamente como vos estabas haciendo en tu código :P
Cita de: patilanz en 3 Octubre 2014, 21:33 PMSupongo que necesitare aprender ensamblador ?
No necesariamente aunque serviría mejor para buscar punteros y direcciones de memorias e incluso ver como funciona internamente el programa que querés modificar...
Cita de: patilanz en 3 Octubre 2014, 21:33 PMMe podéis recomendar algún pdf o algo para aprender y luego intentar de nuevo hacer mi trainer :D
¿Probaste mirando la sección de ingeniería inversa del foro? Creo que ahí había algo de info acerca de cheat-engine (búsqueda de memoria,punteros,etc...)...
B#
Hola me mire el tutorial http://foro.elhacker.net/ingenieria_inversa/tutorialcreacion_de_trainers_con_ollydbg_y_cheat_engine-t342664.0.html y lo intente de nuevo.
Tengo el trainer bien hecho con cheat engine y olly conseguí la memoria que me agrega 1 a la variable en el código pero luego cambio el valor con mi programa y no funciona
(http://fotos.subefotos.com/af07d2e7bb2e34282f9a2cd275ad3481o.png)
En la imagen se ven las direcciones. Donde fallo?
Saludos