Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: patilanz en 1 Octubre 2014, 21:09 pm



Título: Creacion de un trainer en c++
Publicado por: patilanz en 1 Octubre 2014, 21:09 pm
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


Título: Re: Creacion de un trainer en c++
Publicado por: BlackM4ster en 2 Octubre 2014, 08:15 am
Usa cheat engine para sacar las direcciones de memoria y los pointers que apuntan a ellas. Luego sigues esos punteros y magia


Título: Re: Creacion de un trainer en c++
Publicado por: patilanz en 2 Octubre 2014, 11:15 am
Pero los punteros no cambian ?


Título: Re: Creacion de un trainer en c++
Publicado por: 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?


Título: Re: Creacion de un trainer en c++
Publicado por: BlackM4ster en 2 Octubre 2014, 13:36 pm
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


Título: Re: Creacion de un trainer en c++
Publicado por: patilanz en 2 Octubre 2014, 19:54 pm
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
  1. int a = 2;
  2. while(1){
  3. printf("%i",a++);
  4. fflush(stdin);
  5. getchar();
  6. }
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


Título: Re: Creacion de un trainer en c++
Publicado por: ivancea96 en 2 Octubre 2014, 20:01 pm
La dirección en memoria dentro del programa no cambia.
En general, solo cambia si es memoria dinámica.


Título: Re: Creacion de un trainer en c++
Publicado por: 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:

Código
  1. DWORD processes[8000], total_size;
  2. EnumProcesses(processes, sizeof(processes), &total_size);
  3. for (int i = 0; i < sizeof(processes) / total_size; i++){
  4. HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, false, processes[i]);
  5. if (process != NULL){
  6. DWORD id = GetProcessId(process);
  7. if (id == 5076){//Lo veo con tasklist (luego lo hago mejor)
  8. int data = 200;
  9. if (!WriteProcessMemory(process, (LPVOID)0X0113FE78, &data, 4, 0)){
  10. cout << GetLastError();
  11. }
  12. else{
  13. cout << "good";
  14. }
  15. }
  16. }
  17. }
  18.  

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.


Título: Re: Creacion de un trainer en c++
Publicado por: BlackM4ster en 3 Octubre 2014, 07:51 am
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


Título: Re: Creacion de un trainer en c++
Publicado por: patilanz en 3 Octubre 2014, 11:12 am
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?


Título: Re: Creacion de un trainer en c++
Publicado por: ivancea96 en 3 Octubre 2014, 11:23 am
No creo, pero haz una prueba:
Mira qué punteros apuntan a la dirección de la variable que encuentras.
Mira qué modifica la variable.


Título: Re: Creacion de un trainer en c++
Publicado por: BloodSharp en 3 Octubre 2014, 20:32 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#


Título: Re: Creacion de un trainer en c++
Publicado por: 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...
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


Título: Re: Creacion de un trainer en c++
Publicado por: BloodSharp en 3 Octubre 2014, 23:08 pm
Cero que me faltan conocimientos para poder hacer lo que me decís.
No se lo que es la imagebase...

Cita de: msdn
ImageBase

    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.

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

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

Supongo 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...

Me 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#


Título: Re: Creacion de un trainer en c++
Publicado por: patilanz en 25 Octubre 2014, 14:33 pm
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