comment changer la valeur d'une adresse mémoire spécifique?

Nov 19 2020

Je suis nouveau dans la programmation c. Il y a un cas d'utilisation: j'ai besoin de changer la valeur d'une adresse mémoire spécifique.

int main(){

    int *p;
    p = 0x111;
    *p = 100;
    return 0; 
}

Cependant, je ne peux pas compiler le code ci-dessus. Il montre le problème suivant.

test.c:10:7: warning: incompatible integer to pointer conversion assigning to 'int *' from 'int' [-Wint-conversion]
    p = 0x111;
      ^ ~~~~~
1 warning generated.

J'ai essayé de lancer comme suit:

int main(){

    int *p;
    p = (int *) 0x111;
    *p = 100;
    return 0; 
}

Il peut compiler, cependant, lorsque je l'exécute, cela se voit segmentation fault.

Ma question:

  1. Existe-t-il un moyen de compiler et d'exécuter ce code de manière forcée? Je sais qu'il y a un problème de pointeur sauvage. Cependant, c'est un cas d'utilisation courant pour manipuler la mémoire. Par exemple, lorsque je joue à un jeu local. D'une manière ou d'une autre, je connais l'adresse mémoire spécifique du point de santé de mon joueur lorsque le jeu est en cours d'exécution, par exemple adresse = 0x123. Comment changer simplement la valeur dans 0x123?

  2. Si je ne peux pas utiliser le moyen ci-dessus pour manipuler la valeur dans une adresse mémoire spécifique, existe-t-il un autre moyen standard de réaliser mon cas d'utilisation?

PS: Au fait, j'ai trouvé l'exemple pour réaliser mon cas d'utilisation.

Vous pouvez vous référer au code source: https://github.com/haseeb-heaven/GTLibc/

Comment les entraîneurs de jeux changent-ils une adresse en mémoire qui est dynamique?

https://www.youtube.com/watch?v=cRCnN987gd8&ab_channel=HaseebMir

Réponses

2 eerorika Nov 19 2020 at 15:04

Étant donné un pointeur valide vers un objet dans une adresse mémoire, indirectement via le pointeur et attribuer une valeur:

int health_points = 1337;  // an object in some memory address
int* ptr = &a;             // pointer to the value in that memory address
*ptr = 0;                  // the value is modified

Existe-t-il un moyen de compiler et d'exécuter ce code de manière forcée?

Votre programme est mal formé. Il peut y avoir un moyen de laisser un compilateur le compiler avec succès si le compilateur fournit une extension de langage appropriée, mais c'est généralement une mauvaise idée de s'appuyer sur de telles extensions car cela vous empêcherait d'utiliser ce compilateur.

Au lieu d'essayer de forcer un compilateur à accepter un programme défectueux, je recommande de corriger le programme.

comment changer la valeur d'une adresse mémoire spécifique?

Premièrement, la mémoire de cette adresse doit être allouée. L'implémentation du langage prend en charge l'allocation de toute la mémoire et il n'existe aucun moyen standard de spécifier quelle adresse est allouée.

Cependant, certaines implémentations de langage peuvent spécifier certaines adresses comme accessibles. Ceci est typique des systèmes embarqués. Si tel est le cas, vous pouvez convertir une valeur entière en pointeur à l'aide d'un cast:

std::uintptr_t address = 0x111; // see documentation whether this is a valid address
int* ptr = reinterpret_cast<int*>(address);

Si votre implémentation de langage ne spécifie pas que l'adresse est accessible, alors il n'y a aucune garantie d'y accéder. Sur les systèmes d'exploitation modernes qui gèrent la mémoire virtuelle, le meilleur scénario est un segfault.

HaseeBMir Dec 06 2020 at 23:23

Permettez-moi de vous faire comprendre comment les applications lit l'adresse d'une autre application ou de soi.

  1. Adresse personnelle.

L'adresse que vous lisez doit être au-dessus de l'adresse de base qui est 0x0040000pour l' image exécutable , elle devrait donc ressembler à ceci 0x0040000+ 0x00400x0040est le décalage de l'adresse de base. Et si vous accédez à une région autre que .text (lecture seule), vous devez d'abord modifier l'autorisation de la région en utilisant la méthode VirtualProtect comme indiqué ici

  1. Adresse de l'application externe.

Si vous voulez lire l'adresse d'une application externe, disons votre jeu, vous devez d'abord obtenir le handle d' application qui est juste et l'identifiant de votre application, puis utiliser ReadProcessMemory comme indiqué ici de la même manière, vous pouvez également écrire en utilisant WriteProcessMemory comme indiqué ici

Assurez-vous simplement de ne pas accéder à une autre .textsection que sans changer sa région d'autorisation, sinon votre programme pourrait planter.