Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: msrone en 23 Octubre 2007, 10:06 am



Título: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 10:06 am
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 ;)


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 11:36 am
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 :/


Código:
/* 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;
}


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 13:34 pm
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


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 13:54 pm
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


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 14:07 pm
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.


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 14:17 pm
claro es lo mismo, para el oro por ejemplo, lo primero es poner el offset correcto
Código:
#define OFFSET_TIEMPO 0x100579C  <--- ahi pones el del oro

luego todo igual hasta que lees el oro con
Citar
ReadProcessMemory(hProcess,(LPVOID)OFFSET_TIEMPO, &tiempo, 4, NULL); 
   

ahi tenemos el oro actual en "tiempo"
asi que le sumamos la cantidad que quieres

Código:
tiempo+=10000;
ahi solo te falta escribir ese numero en la memoria


Código:
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...
   


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 14:26 pm
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


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 14:32 pm
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)
Código:
#define NULL 0


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 14:48 pm
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


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 19:42 pm
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



Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 21:01 pm
Bien amigo, gracias por contestar primeramente. Segundo, e podido llegar al offset en el cual puedo blokear tanto la subida como la bajada de oro.

549539 mov [edi+eax+0x4],edx

entonces al crear el trainer pongo en los respectivos botones:

Patched script:
Poke 549539 90 90 90 90


UnPatched script:
Poke 549539 89 54 07 04


Y consigo el bloquear tanto la subida como la bajada del recurso (oro).

Mi pregunta sigue en:

Teniendo ya este offset, como podria dar a un boton la funcion de subir la cantidad que kiera del oro? con el codigo q me has puesto antes, modificandolo?
Que codigo pondrias tu en kada boton, para q al accionarlo subiera dicha cantidad.

Muchas gracias crack.


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 23 Octubre 2007, 21:38 pm
  Rectifico, este offset, sera alguno q hará alguna funcion la cual si la blokeas impides que suba o baje la cantidad de oro que posees. Se podria saber el offset en el cual hace el recuento del oro total q keda a partir del mov [edi+eax+0x4],edx ?

 :-\


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 23 Octubre 2007, 22:20 pm
pues no se me ocurre ninguna manera sencilla de hacerlo :/ pero si lo que quieres es que vaya aumentando y
en [edi+eax+0x4] esta el dinero puedes cambiar el 89 por 01 que seria esto
Código:
WriteProcessMemory(hProcess,(LPVOID)0x549539, 1, 1, NULL); 
con lo cual tienes
add [edi+eax+0x4],edx
asi aumenta el dinero cada ves que se llame a la funcion (se podria decir q se duplica)


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 24 Octubre 2007, 19:42 pm
Al cambiar el 89 por el 01 me da error, y me saka del juego. Me dice que no se puede "written", aqui tengo el trainer maker kit, en el cual puedo darle la opcion de poner un script. Si pusiera add dword o add byte ?... O cambiar el 89 por algun otro numero para que haga la funcion deseada??

Gracias


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 24 Octubre 2007, 21:24 pm
pues no se xk te da ese fallo quiza de tanto duplicarse llegue a un numero imposible
lo otro q puedes hacer es cambiar
895438 04     MOV DWORD PTR DS:[EAX+EDI+4],EDX

por


896438 04     MOV DWORD PTR DS:[EAX+EDI+4],ESP

o sea el 54 por 64,
ESP es el puntero al stack que normalmente es 0012XXXX
con lo cual estas poniendo un numero 1179668++




Título: Re: Modificar exe mediante trainer
Publicado por: byebye en 24 Octubre 2007, 21:37 pm
mira a ver si con tsearch te deja ver el valor de los registros, con cheat engine se puede y personalmente me gusta mas.  entonces reg+reg+n = direccion donde estan los datos, escribe ahi directamente. aunque lo suyo es que anotes esa direccion pilles el depurador yverifiques ue esta pasando en esa direccion. volviendo al tema del cheat engine te viene con un programa tutorial donde te enseña lo mas basico hasta el problema de la DMA y como solucionarlo.

saludos.


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 25 Octubre 2007, 02:22 am
Gracias por contestarme crack; haber tengo esto exactamente:

   549535 - push edi
   549536 - mov edi, [esi + 18]
-- 549539 - mov [ edi + eax + 04] edx
    54953d - mov edx. [esi+18]
    549540 - add eax,edx

me dice:

the value of the pointer needed to find this addres is probably 092F2EF0

Eax 00000030
Ebx 00000030
Ecx 00000003

Edx 00000000
Esi 05087C80
Edi 092F2EF0

Esp 0012Fbcc
Ebp 0012FbF4
Eip 0054953d


Hago la buskeda con el 092F2EF0 y no logro encontrar el punto en el q se guarda la cantidad de oro/piedras/Madera del p*to juego (settlers6).

Alguna idea? Gracias ;)


Título: Re: Modificar exe mediante trainer
Publicado por: x4uth en 25 Octubre 2007, 11:06 am
segun eso q pusiste ahi el puntero a 092F2EF0 lo tienes en ESI+18
si ESI es constante entonces ya lo tienes resuelto

[0x5087C80+0x18] +0x00000030 +0x4 = direccion del oro


Título: Re: Modificar exe mediante trainer
Publicado por: msrone en 26 Octubre 2007, 15:35 pm
Nuevos avances en el tema:

He descubierto que en la funcion:

-- 549539 - mov [ edi + eax + 04] edx

El edx es la cantidad de oro que queda. Entonces, la pregunta es:

¿Bastaria con modificar ese edx para que se pudiera ver el incremento del oro en el juego? ¿como se podria hacer?? add?¿...

Espero respuestas, gracias ;)


Título: Re: Modificar exe mediante trainer
Publicado por: byebye en 27 Octubre 2007, 20:35 pm
si edx es el valor del oro ya aumentado o restado yo iria mas atras hasta encontrar donde se pone el valor a edx y ahi modificar la funcion que lo resta yue esta incremente, asi veras aumentar el oro.


Título: Modificar exe mediante trainer
Publicado por: sigfrick en 8 Enero 2014, 04:44 am
Se puede hacer para el Grand Chase Latino y como seria si es mucho pedir?
Gracias

Pd: Perdon por revivir un tema del 2007


Título: Re: Modificar exe mediante trainer
Publicado por: .:UND3R:. en 8 Enero 2014, 07:37 am
Actualmente existen nuevos thread en donde se explica todo esto:

http://foro.elhacker.net/ingenieria_inversa/tutorial_usar_cheat_engine_para_modificar_juegos_inyeccion_de_codigo-t382181.0.html (http://foro.elhacker.net/ingenieria_inversa/tutorial_usar_cheat_engine_para_modificar_juegos_inyeccion_de_codigo-t382181.0.html)

http://foro.elhacker.net/ingenieria_inversa/tutorial_wpe_pro_captura_modifica_y_envia_paquetes_tcp_cheats_juegos-t405121.0.html (http://foro.elhacker.net/ingenieria_inversa/tutorial_wpe_pro_captura_modifica_y_envia_paquetes_tcp_cheats_juegos-t405121.0.html)

http://foro.elhacker.net/ingenieria_inversa/videotutoriales_hacking_de_juegos_onlinelocal_cheat_engine_ollydbg-t406249.0.html (http://foro.elhacker.net/ingenieria_inversa/videotutoriales_hacking_de_juegos_onlinelocal_cheat_engine_ollydbg-t406249.0.html)

En ellos podrás preguntar libremente sin ser sancionado, cierro el post, saludos