Pregunta

He leído algunos datos de un proceso (dirección:0x58F03C) mediante el uso de la WINAPI función ReadProcessMemory:

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}

Desde la dirección cambia cada vez que reinicio el proceso me preguntaba si hay una manera para obtener siempre la misma dirección?Debe ser porque veo un montón de "Entrenador-Programas" que son capaces de hacer eso.¿Cómo obtener la dirección correcta de valor para leer / escribir?

Actualmente me obtenerlo mediante la detección de un valor con el CheatEngine y realizar un examen siguiente para cambiar el valor.

Gracias.

¿Fue útil?

Solución

Usted está encontrando la asignación dinámica de memoria.En el CheatEngine mundo, estos son los llamados 'punteros'.

Considerar algunos datos (por ejemplo un uint32_t/DWORD) en el interior de la memoria en la que se malloc'd.Si usted encuentra la dirección de los datos, no hay ninguna garantía de que la próxima vez que inicie el proceso, la dirección será la misma.Esto es debido a que la memoria devuelta por malloc podría estar basado en un punto diferente de la memoria.

El truco usado para derrotar a la asignación dinámica de memoria es encontrar un área estática de direcciones que puede conducir a la dirección de el valor que usted está interesado en.El CheatEngine tutorial te muestra cómo se hace.Lo mismo se aplica para multi-nivel de los punteros.En un nivel superior, esto corresponde a la asignación dinámica de memoria que contiene un puntero a alguna otra memoria asignada dinámicamente, y así sucesivamente.

El método utilizado en el CheatEngine para obtener punteros obras aproximadamente como este:

  • Establecer un acceso de hardware de punto de interrupción en la dirección del valor de los datos que usted está interesado en
  • Cuando el código accede a ella, el punto de interrupción de hardware le mostrará el aspecto del código

El código suele ser algo como esto:

mov eax, 0x1234ABCD 
dec dword ptr ds:[eax+0x85]

Esto podría corresponder a algún código que disminuye su HP cuando es golpeado por un enemigo.0x1234ABCD es el puntero en este caso y 0x85 el desplazamiento.En el código C, esto podría haber sucedido:

struct some_struct* blah = malloc(...);
...
blah->HP--;

0x1234ABCD sería la dirección de blah.El HP valor de la vida, en algún lugar dentro del bloque apuntado por blah.El desplazamiento en el bloque de memoria es 0x85.A continuación, si estuviera escribiendo un entrenador, que sería el DWORD (QWORD si es de 64 bits) en 0x1234ABCD y agregar 0x85 para el valor.Esto le puede dar la dirección de la HP valor.

Otros consejos

Esto funcionará si la dirección está en el archivo ejecutable de la porción de la sección de datos donde preasignados variables (no apto para la pila y pila)...

Echa un vistazo a la "La enumeración de Todos los Módulos De un Proceso de" ejemplo en la web de MSDN.

Se utiliza EnumProcessModules() para obtener los identificadores de módulo.Esos son imagen de direcciones de base.

Usted puede obtener la dirección de base de imagen para el ejecutable y ajustar su dirección por ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top