2010-07-11 5 views
1

Avec mes connaissances de base de C++, j'ai réussi à assembler un programme simple qui lit des données d'un programme (en utilisant ReadProcessMemory) et l'envoie à mon serveur Web toutes les cinq minutes, donc je peux voir le statut de ce programme pendant que je ne suis pas à la maison.Adresse mémoire permanente

J'ai trouvé les adresses de mémoire à lire à l'aide d'un programme conçu pour pirater des jeux appelés "Memory Hacking Software". Le problème est, les adresses changent chaque fois que je déplace le programme sur une autre machine.

Ma question est la suivante: existe-t-il un moyen de trouver une adresse «permanente» identique sur n'importe quelle machine? Ou est-ce simplement impossible. Excusez-moi si c'est une question stupide, mais je ne sais pas beaucoup sur le sujet. Ou peut-être un autre moyen d'accéder à l'information d'un programme en cours d'exécution.

Merci pour toute aide!

+1

Pourquoi cela a-t-il été réduit? Je ne vois rien de mal à la question. –

+1

@San Jacinto: parce que si vous essayez de faire cela, quelque chose ne va pas en premier lieu. –

+1

Question d'upvoting. OP a indiqué dans un commentaire pourquoi cela est nécessaire et cela semble assez raisonnable. Le fait qu'il n'y ait pas d'autre moyen de faire quelque chose m'a souvent conduit à faire le «mauvais» truc plusieurs fois dans ma carrière :-) Mon travail consiste à fournir des solutions réalisables, propres et pures de cœur quand c'est possible, mais rapidement sale si nécessaire. Ma suggestion au downvoter serait de fournir la "bonne" façon de le faire dans une réponse plutôt que de dire aveuglément à quelqu'un qu'ils le font mal. – paxdiablo

Répondre

4

Il existe des moyens de le faire, comme la possibilité de reconnaître les modèles de mémoire autour de la chose que vous recherchez. Les crackers peuvent l'utiliser pour trouver des emplacements de mémoire à corriger, même avec un logiciel qui «bouge», pour ainsi dire (comme avec les systèmes d'exploitation qui fournissent la randomisation des espaces d'adressage). Par exemple, si vous savez qu'il existe toujours des chaînes de caractères fixes X octets au-delà de la zone d'intérêt, vous pouvez analyser tout l'espace d'adressage pour les trouver, puis calculer la zone d'intérêt à partir de cela.

Cependant, ce n'est pas toujours aussi fiable qu'on pourrait le croire. Je voudrais plutôt penser à un autre moyen d'atteindre vos objectifs, qui ne consiste pas à lutter contre les fonctionnalités qui protègent un tel logiciel contre les comportements malveillants.

penser à des questions telles que:

Pourquoi faites-vous exactement besoin accès à l'espace d'adressage du tout? Le programme lui-même fournit-il des informations d'état d'une manière plus pratique?

Si le programme vous appartient, pouvez-vous le modifier pour fournir cette information?

Si vous avez seulement besoin de savoir si le programme fait son travail, pouvez-vous simplement "pinguer" le programme (par exemple, pour une page web, envoyer une requête HTML et vous assurer une réponse valide)? En dernier recours, pouvez-vous convaincre l'OS de charger votre programme sans randomisation de l'espace d'adressage, puis continuer à utiliser votre méthode (quelque peu douteuse)?


Compte tenu de votre commentaire que:

J'utilise le programme sur quatre machines et je dois « re-trouver » les adresses (8 d'entre eux) sur tous à chaque fois qu'ils sont mis à jour le programme.J'aurais simplement opté pour l'automatisation de ce processus.

C'est ce que fait un logiciel de craquage. Il analyse les fichiers ou le code en mémoire et les données à la recherche de marqueurs qu'il peut utiliser pour localiser une zone d'intérêt.

Si vous pouvez le faire manuellement, vous devriez être capable d'écrire un programme qui peut le faire. Avoir ce programme localiser les zones d'intérêt (en lisant l'espace d'adressage du processus) et, une fois qu'ils sont trouvés, il suffit de lire vos informations requises à partir de là. Si les méthodes pour les trouver changent avec chaque version (au lieu de seulement les emplacements réels), vous devrez probablement mettre à jour vos routines de localisation avec chaque version de leur logiciel mais, malheureusement, c'est le prix que vous payez pour la méthode choisie.

Il est peu probable que le programme que vous essayez de lire soit aussi sûr que certains - j'ai vu certains déplacer leurs centres d'intérêt comme le programme est exécutant, pour essayer de confondre les craquelins.

+0

Le programme n'est pas le mien, et il n'a aucune API ou autre moyen d'interface avec. L'entreprise est chinoise, donc je n'ai aucune idée de comment entrer en contact avec eux et demander une telle interface non plus. Je suis en train de représenter graphiquement les données en utilisant PHP quand il est envoyé au serveur, donc il ne suffit pas de savoir si le programme est en cours d'exécution.Peu importe, je cherchais simplement un moyen de simplifier le processus. J'utilise le programme sur quatre machines et je dois "re-trouver" les adresses (8 d'entre eux) sur chacun d'entre eux chaque fois qu'ils mettent à jour le programme. - Merci – Blake

+3

Eh bien, si vous "re-trouver" les adresses sur chaque machine, tout ce que vous devez faire est d'automatiser ce processus. Si vous pouvez trouver de manière fiable les zones d'intérêt en utilisant des méthodes manuelles, vous devriez être capable d'écrire un programme pour le faire aussi bien. – paxdiablo

0

Ce que vous demandez est impossible à concevoir. ASLR est conçu spécifiquement pour empêcher ce genre d'espionnage.

Quel type d'information obtenez-vous du processus à distance?

+0

N'est pas. Il est conçu pour protéger contre les cas où la randomisation ne peut pas être déterminée, par ex. dans le cadre d'une attaque par injection de code. Voir 'http: // pax.grsecurity.net/docs/vmmirror.txt', où les exemples ASLR donnés montrent ouvertement une telle surveillance, comme un moyen d'expliquer comment Pax fait ASLR. – MSalters

+0

@MSalters: Étant complètement en dehors du processus cible, il est un peu difficile de déterminer l'emplacement de la mémoire que vous voulez. Bien sûr, si vous avez les bases de randomisation (c'est-à-dire que vous «possédez» le processus actuel), alors ASLR n'est pas conçu pour vous empêcher de voir votre propre mémoire! –

0

Désolé, ce n'est pas possible. La disposition de la mémoire des processus ne sera pas fiable de manière cohérente.

Vous pouvez atteindre votre objectif dans un certain nombre de façons: « Quel est votre statut »

  • Ajouter un protocole client/serveur que vous pouvez connecter et demander (Cela se prête également bien à demander plus d'informations). Si le processus touche périodiquement un fichier, le «moniteur» peut vérifier l'heure de modification de ce fichier pour voir si le processus est mort.
+0

Il gère déjà le processus de lecture de ReadProcessMemory, qui est un moyen fiable à 110% de savoir si le processus a planté. Le suivi par ID de processus est inutile. –

+0

@Billy: Bon à savoir, je ne suis pas familier avec cette fonction - ne pas développer sur Windows. Je suppose que, étant donné que vous avez ce contrôle, il suffit de vérifier que «c'est vivant» n'est pas suffisant pour ce que le PO veut. – Stephen

Questions connexes