Question

J'ai lu quelques données d'un processus (adresse :0x58F03C) en utilisant la fonction WINAPI 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;
}

Étant donné que l'adresse change à chaque fois que je redémarre le processus, je me demandais s'il existait un moyen d'obtenir toujours la même adresse ?Il doit y en avoir un car je vois beaucoup de "Programmes-Formateurs" qui sont capables de faire cela.Comment obtiennent-ils la bonne valeur d’adresse à partir de laquelle lire/écrire ?

Actuellement, je l'obtiens en recherchant une valeur avec le CheatEngine et effectuez une prochaine analyse pour la valeur modifiée.

Merci.

Était-ce utile?

La solution

Vous rencontrez une allocation de mémoire dynamique.Dans le monde de CheatEngine, ceux-ci sont appelés « pointeurs ».

Considérons quelques données (par exemple un uint32_t/DWORD) dans la mémoire qui était malloc'd.Si vous trouvez l’adresse des données, rien ne garantit que la prochaine fois que vous lancerez le processus, l’adresse sera la même.C'est parce que la mémoire renvoyée par malloc pourrait être basé sur un point différent de la mémoire.

L'astuce utilisée pour vaincre l'allocation dynamique de mémoire consiste à trouver une adresse de tas statique qui peut vous conduire à l'adresse de la valeur qui vous intéresse.Le didacticiel CheatEngine vous montre comment procéder.La même chose s'applique aux pointeurs multi-niveaux.À un niveau supérieur, cela correspond à une mémoire allouée dynamiquement qui contient un pointeur vers une autre mémoire allouée dynamiquement, et ainsi de suite.

La méthode utilisée dans CheatEngine pour obtenir des pointeurs fonctionne à peu près comme ceci :

  • Définissez un point d'arrêt matériel d'accès à l'adresse de la valeur de données qui vous intéresse
  • Lorsque le code y accède, le point d'arrêt matériel vous montrera à quoi ressemble le code

Le code ressemblera généralement à ceci :

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

Cela pourrait correspondre à un code qui décrémente vos PV lorsque vous êtes touché par un ennemi.0x1234ABCD est le pointeur dans ce cas et 0x85 le décalage.En code C, cela aurait pu se produire :

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

0x1234ABCD serait l'adresse de blah.La valeur HP se trouve quelque part à l'intérieur du bloc pointé par blah.Le décalage dans le bloc mémoire est de 0x85.Ensuite, si vous écriviez à un formateur, vous liriez le DWORD (QWORD si 64 bits) à 0x1234ABCD et ajoutez 0x85 à la valeur.Cela vous donnerait l'adresse de la valeur HP.

Autres conseils

Cela fonctionnera si l'adresse se trouve dans la partie exécutable de la section de données où se trouvent les variables pré-allouées (ne convient pas au tas et à la pile)...

Jetez un oeil à Exemple « Énumération de tous les modules pour un processus » sur MSDN.

Il utilise EnumProcessModules() pour obtenir les handles du module.Ce sont des adresses de base d’images.

Vous pouvez obtenir l'adresse de base de l'image pour l'exécutable et ajuster votre adresse en fonction de celle-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top