Comment procéder pour lire la mémoire d'un processus? Est-ce différent par OS?

11

En tant que développeur web expérimenté, mais programmeur débutant "bas niveau", ce truc est toujours une sorte de vaudou pour moi.

Je suis curieux de savoir comment on pourrait même commencer à chercher un bloc de mémoire, puis à le lire (par exemple, lire le chronomètre dans un jeu de mines)? Est-ce différent selon la version OS / OS?

Eva
la source

Réponses:

14

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é WriteProcessMemorypeut ê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. ;)

zxcdw
la source
L'emplacement de la variable sera-t-il le même à chaque exécution du processus?
brunoqc
1
@brunoqc Non, certainement pas.
Dan
2

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

pjc50
la source
quel OS ne le permettrait pas? Il semble que vous pouvez le faire sous Linux et Windows, au moins
Eva
@Evan Chaque système d'exploitation doit permettre (restreint, pour des raisons de sécurité) la modification à distance de la mémoire du processus à des fins de débogage. Cependant, notez que, par exemple, les inadéquations de privilèges pour des raisons de sécurité peuvent faire en sorte que l'on ne puisse pas lire / écrire la mémoire de processus d'un processus privilégié supérieur. Un bon exemple serait de ne pas laisser un processus avec des privilèges d'utilisateur invité lire / écrire la mémoire d'un processus avec des droits d'administrateur, car cela pourrait potentiellement compromettre l'ensemble du système et être un moyen direct pour un utilisateur invité d'obtenir des privilèges d'administrateur sur le système.
zxcdw
1

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:

  • L'article de Wikipedia sur la mémoire de l'ordinateur vous donnera un bon aperçu des choses.
  • Consultez ensuite l'article Wikipedia sur les E / S mappées en mémoire pour mieux comprendre les machinations qui se poursuivent.
  • Enfin, consultez l'article sur la mémoire virtuelle pour obtenir une meilleure réponse sur la façon dont chaque système d'exploitation gérera le mappage de la mémoire un peu différemment des autres.

la source
excellente réponse, bien que oui, dans ce cas, je suis plus concerné par la lecture de la mémoire d'une application que je n'ai pas écrite moi-même. Je voterai dès que j'aurai 15 représentants;)
Eva
@Evan - alors lisez l'article sur la mémoire virtuelle. Cela vous donnera une meilleure compréhension de la cartographie en cours. Vous devez comprendre la cartographie afin de sélectionner une application. La plupart des débogueurs vous permettront de vous attacher à un processus en cours qui vous permettra de voir les instructions et la mémoire de l'application.