mi problema es que el valor del juego tiene que estar frezeado cuando se modifica osea tiene que estar cambiandose todo el tiempo ejemplo:
Balas: 30 <--- valor real de las balas
Balas: 250 <---- valor modificado de las balas esto tiene que estar modificandose a cada rato que para eso esta el while.
Mi problema mas que nada consiste en que si el address que busca el programa no existe osea su valor es null o ???? como seria en cheat engine porque no estas en partida que no modifique su valor o por ejemplo si estoy en partida y active el cheat y por x motivo lo deje activado y quiero salir de la partida que no lo siga modificando.
no entiendo por que mi codigo hace que crashee el juego a veces y me gustaria saber si
hay alguna forma de ver el valor de los address+pointers con mi codigo o quizas ustedes tengan un metodo mas sofisticado para hacerlo.
Muchas gracias y saludos!
Código
#include <Windows.h> #include <iostream> bool killshot = false; bool comprobador = false; void hack() { DWORD comienzo = (DWORD)GetModuleHandle(NULL); //me devuelve el valor de "xxxx.exe" while (true) { try { /* Addres: "xxxx.exe"+02394B24 offset1: 0x414 offset2: 0x78C esto es igual a la suma de cada uno: "xxxx.exe"+02394B24+0x414+0x78C = ("aqui se encuentra el valor a modificar"); */ DWORD puntero = *(DWORD*)(comienzo + 0x02394B24); //trata de acceder al addres ej: "xxxx.exe"+02394B24 if ((puntero != 0) && (killshot == true)) //me dice si el contenido de puntero es distinto a 0 y killshot es verdadero entonces... { DWORD puntero = *(DWORD*)(comienzo + 0x02394B24); //trata de acceder al addres ej: "xxxx.exe"+02394B24 DWORD puntero1 = *(DWORD*)(puntero + 0x414); //suma el valor obtenido en puntero y le suma otro offset *(DWORD*)(puntero1 + 0x78C) = 30; //obtiene los address + offsets y le asigna el valor de [30] comprobador = true; //una vez que modificamos el valor hacemos que comprobador sea verdadero para saber que el cheat esta activado. } if ((comprobador == true) && (killshot == false)) //me dice si el contenido de puntero es distinto a 0 y killshot es falso entonces... { DWORD puntero = *(DWORD*)(comienzo + 0x02394B24); //trata de acceder al addres ej: "xxxx.exe"+02394B24 DWORD puntero1 = *(DWORD*)(puntero + 0x414); //suma el valor obtenido en puntero y le suma otro offset *(DWORD*)(puntero1 + 0x78C) = 1; //obtiene los address + offsets y le asigna el valor de [1] comprobador = false; //una vez que modificamos el valor hacemos que comprobador sea verdadero para saber que el cheat esta desactivado. } } catch (const std::exception&) { //no me parecio necesario colocar algo en caso de que genere un error } } Sleep(5); //Espera 5 milisegundos } void comprobar() { while (true) { if (GetAsyncKeyState(VK_NUMPAD1) & 0x80000) //si se aprieta numpad_1... { killshot = !killshot; //me devuelve el valor contrario de killshot, si es true lo da en false (desactiva y activa el cheat) } } Sleep(5); //Espera 5 milisegundos } BOOL WINAPI DllMain(HINSTANCE modulo, DWORD razón, LPVOID reserva) { if (razón == DLL_PROCESS_ATTACH) { //Estamos dentro del juego //Thread //hack(); //comprobar(); CreateThread(0, 0, (LPTHREAD_START_ROUTINE)comprobar, 0, 0, 0); CreateThread(0, 0, (LPTHREAD_START_ROUTINE)hack, 0, 0, 0); } else if (razón == DLL_PROCESS_DETACH) { //Salimos del juego } //Devolvemos al juego return TRUE; }