Problema con trainer DLL

Iniciado por Axtrax, 13 Enero 2017, 18:24 PM

0 Miembros y 1 Visitante están viendo este tema.

Axtrax

Buenas gente, aprendiendo un poco lo que es c++ pero aun asi tengo pocos conocimientos, trate de comentarles todo el funcionamiento del cheat por si alguien en un futuro quiere crear algo parecido y le sirve.
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 (cpp) [Seleccionar]

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

}

ivancea96

Tienes varias opciones. La primera, comprobar si está en partida. Buscando con CE algún valor relevante o lo que quieras (avisándole tú con una tecla, quizás).

Sobre la forma de ver los valores pues, sofisticado según quien lo vea, pero puedes crear un archivo con ofstream por ejemplo en cualquier ruta.

Axtrax

Claro esa idea se me habia ocurrido el problema es que el valor de la partida necesito cambiarlo para que cuando este en partida figure como que no estoy en ella, asi no me pueden reportar, lo correcto seria hacer:

Código (cpp) [Seleccionar]

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 verificar = *(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 (verificar != 0) <--- o null
{
active
}
osea que me diga si logra encontrar todo el contenido y si le devuelve un valor distinto a 0... el problema es que no me funciona de esa manera y no entiendo el porque
el programa tendria que verificar todo el tiempo si es o no nulo osea ??? si llega a ser nulo entonces que no haga nada, eso tendria que hacer, quiero enocntrar un metodo que me devuelva el valor que aparece ahi dentro en pantalla asi veo que me devuelve y veo como lo hago, alguna idea en particular de que tipo de codigo tendria que estudiar?
*/


ivancea96

¿Pero seguro que ese valor es 0 cuando no está en pertida? Cuando CE pone los "???" no significa que sea "nulo". Significa que a esa memoria no puede acceder, sin más.

Si cuando no estás en partida eso aparece con los "???", tendrás que buscar otra forma de verificarlo.

Podrías probar con ReadProcessMemory para tratar de leer de la dirección de memoria y GetCurrentProcess para obtener el HANDLE para pasarlea la otra función.
Si ReadProcessMemory falla, retornará 0.

De todos modos, si encuentras otra forma de verificar si está en partida, mejor.