C'est une question quelque peu délicate et même complexe, dans le sens où vous pouvez approfondir cela. Mais pour simplifier un peu les choses:
Considérant votre exemple de " lecture du chronomètre dans un jeu de mines ":
La première étape consiste à trouver l'adresse mémoire . Cela se fait généralement avec un outil appelé éditeur de mémoire (un débogueur ferait aussi, dans certains cas) qui peut utiliser différentes méthodes pour trouver l'emplacement d'une variable dans la mémoire de processus . La méthode courante consiste à rechercher une certaine valeur (par exemple, la valeur de la minuterie) dans l'espace mémoire du processus cible, puis à modifier la valeur cible (par exemple, faire avancer la minuterie) et à rechercher à nouveau les correspondances. Ce processus définit les candidats à chaque itération jusqu'à ce qu'il ne reste que la variable exacte. Prendre l'adresse de cette variable dans l'espace mémoire du processus est juste une question de clic de souris avec un éditeur de mémoire.
La deuxième étape consiste à modifier les données de cette adresse particulière . La procédure à suivre dépend du système d'exploitation. Avec Windows , un appel WinAPI nommé WriteProcessMemory
peut être utilisé pour écrire des données prédéfinies à une adresse donnée dans l'espace mémoire du processus cible. Dans notre exemple, vous utiliseriez cette fonction pour écraser la variable du minuteur dans le processus cible avec votre propre valeur souhaitée, ce qui changerait efficacement le minuteur dans le jeu.
En pratique, vous devez trouver l' ID de processus du processus cible , puis attacher votre processus malveillant au processus cible pour gagner la possibilité de modifier son espace mémoire. C'est une tâche assez banale, mais qui ne contribue pas à répondre à la question, je l'ai donc laissée de côté comme exercice pour le lecteur. ;)
C'est totalement différent par OS. Certains ne vous permettront pas du tout de le faire, et vous devez avoir un moyen de savoir où se trouvent les données que vous voulez dans l'espace mémoire de la cible.
Voici comment le faire sur Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux
la source
Une application reçoit une plage de mémoire de l'OS. Généralement, l'application doit demander la mémoire mais cette fonctionnalité peut être obscurcie par le programmeur en raison de la langue.
Des langages comme C autorisent les requêtes de bloc pour des tailles spécifiques, tandis que d'autres langages comme C ++, C # et Java autorisent les requêtes via l'utilisation de mots clés comme
new
. Chaque langue a un certain nombre de façons d'allouer de la mémoire, ce n'est donc qu'un bref aperçu. La libération de la mémoire sur le système d'exploitation peut être effectuée de manière explicite ou via un garbage collector.L'accès à la mémoire dans l'application dépend de la façon dont elle a été allouée. C et C ++ sont les plus connus pour utiliser le concept de pointeurs pour indiquer / suivre l'emplacement de la mémoire. Sinon, l'accès à la mémoire est géré via la classe ou la variable qui a été créée.
La plupart du temps, vous n'avez pas à vous soucier d'un accès mémoire spécifique dans votre programme. Les constructions de langage et le système d'exploitation masquent efficacement ce souci pour vous.
Votre exemple de minuteur dans un jeu est un excellent exemple de cas où vous n'auriez pas à vous soucier de l'allocation de mémoire sous-jacente. Vous aurez une variable représentant la minuterie et vous lirez simplement la variable.
Ma réponse est pertinente lorsque vous écrivez l'application, tandis que la réponse de zxcdw est pertinente pour accéder à la mémoire qui appartient à une autre application. Vos termes LMGTFY seraient «débogage» et «rétro-ingénierie» pour approfondir ce sujet.
Quelques lectures supplémentaires:
la source