El Cheat Engine no tiene ningún editor hexadecimal, lo que si tiene es un visor de memoria, donde, cómodamente visualizas los bytes de X bloque de memoria. Que puedas editarlos a parte, no le da el papel de editor hexadecimal, eso déjaselo a Hex Edit, etc...
A ver, antes de ponerte a buscar offset's y demás, deberías fijarte si tu dirección es estática o dinámica... Intenta guardar la dirección de memoria donde apunta a tal IP, cierra y abre el juego, y revisa si la dirección de memoria aún guarda la dirección donde se mantiene el IP.
Si es así, pues tenéis medio trabajo hecho, tu address es estático (a simple vista) y nada más tendrías que liarte con modificarle, cosa no muy dificil si de C/C++ hablamos.
Un básico ejemplo sería el siguiente (no es muy complejo, pues no soy programador de C/C++, pero es una base y es bastante entendible a mi juicio):
#include <windows.h>
#include <iostream>
using namespace std;
void EnableDebugPriv(); //Nos aumentamos los privilegios, para evitar problemas con permisos... (Ring 3)
void main() {
BYTE newvalue[] = {0x31, 0x00, 0x32, 0x00, 0x37, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //Este es el valor en hexadecimal, de la cadena: 1 2 7 . 0 . 0 . 1 (rellenamos con 0 los numeros del IP antiguo sobrantes)
HWND hwnd = FindWindow(0, "Solitario"); //Buscamos la ventana de nuestro juego/proceso (Yo hice la prueba con Solitario)
DWORD pid;//Declaramos la variable PID para almacenar el ID de nuestro juego/proceso
if(!hwnd) //Si no encontramos la ventana (el handle es nulo)
{
cout << "Error: No se pudo encontrar la ventana!" << endl;
system("pause");
exit(0);
}
else
{
GetWindowThreadProcessId(hwnd, &pid); //Obtenemos el Id del proceso (PID) en base al handle que nos devuelve FindWindow
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); //Abrimos el proceso con acceso total (lectura, escritura)
if(!hProcess) //Si no encontramos el juego/proceso (...)
{
cout << "Error: No se pudo abrir el handle" << endl;
system("pause");
exit(0);
}
else //En caso contrario
{
if (WriteProcessMemory(hProcess, //Juego/Proceso a modificar
(LPVOID)0x0100700C, //Direccion de memoria a modificar (Que en tu caso, si no es dinamica deberia ser: 0x0028B244)
&newvalue, //Nuevos bytes a cambiar (en tu caso el nuevo IP)
sizeof(newvalue), //Tamano de los bytes a modificar
NULL)) //Este parametro lo podemos dejar nulo
cout << "Memoria editada con exito!" << endl; //Exito!
else
cout << "Fallo al editar la memoria!" << endl; //Memoria no existente o protegida
}
CloseHandle(hProcess); //Cerramos el handle abierto anteriormente
}
system("pause");
}
void EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, sizeof tkp, NULL, NULL);
CloseHandle(hToken);
}
Con eso ya tienes tu IP cambiada, espero os funcione.
Y... en caso que sea dinámica la dirección que apunta al IP, avisadme y te doy algunos tips de cómo encontrar su puntero.
Edito: Tío, no respondo MP's que puedan ser resueltos en el mismo tema, pues mira con un bucle, durarías horas enteras buscando perdiendo tiempo, por tal... Es mejor que puntees tal dirección.
Y ahora dirás ¿Eh que cojones? xD... Pues vale, te toca conseguir la dirección de memoria que apunta al IP, esto puede parecer un tanto dificil, pero, créeme una vez lo aprendes no lo es.
Así que, para no extenderme, te dejaré un video donde explican como puntear direcciones de memoria, el video está en inglés, pero no es muy dificil de entender (y de hecho, enseñan como puntear direcciones usando el mismo Cheat Engine ya que es la manera más fiable de hacerlo).
Si se te hace dificil, decidme y te hago un manual a parte.
Aquí el video:
http://www.youtube.com/watch?v=Eo_thbmfFIUEspero me respondas en el foro, ¿Para eso es el mismo no? xD...