j'aimerais savoir si il est possible en C de lire la memoire d'un autre programme en cours d'execution, et si c'est possible alors peut on recuperer les valeurs des variables.
Version imprimable
j'aimerais savoir si il est possible en C de lire la memoire d'un autre programme en cours d'execution, et si c'est possible alors peut on recuperer les valeurs des variables.
Bonsoir,
Sous quel OS ?Citation:
Envoyé par gaut
Cordialement,
DS.
PS : en général, c'est (plus ou moins) possible. C'est le genre de services qu'offrent les débogueurs.
Non.Citation:
Envoyé par gaut
je suis sous win XP,
quels sont les moyens pour lire la memoire?
À part un debugger, tu peux utiliser des fonctions système comme ReadProcessMemory() pour lire dans un processus t'appartenant.
Mais tu n'auras aucun accès à un processus s'exécutant sous un autre compte utilisateur...
Mais si tu veux juste faire de la communicatin entre deux programmes développés par toi, tu peux toujours utiliser un segment de mémoire partagée...
Même avec ReadProcessMemory tu n'auras pas accès au variable du programme.
Bonjour,
Exact.Citation:
Envoyé par Médinoc
A ma connaissance : sauf en ayant les privilèges nécessaires (mais je chipote).Citation:
Envoyé par Médinoc
Ou d'autres moyens selon les besoins : voir "Interprocess Communications".Citation:
Envoyé par Médinoc
Ce n'est pas vraiment un problème d'accès : le plus difficile est de savoir où elles se trouvent.Citation:
Envoyé par hegros
Par contre, dans le cas de certaines variables locales dans un programme optimisé (par le compilateur), il est vrai que ReadProcessMemory() ne sera d'aucune aide : elles peuvent être dans un registre [1].
@gaut : tes questions sont-elles juste théoriques ou as-tu un problème concret à résoudre ? Si tu as un problème concret à résoudre, il serait temps de le décrire plus en détail. Autrement dit, avant de chercher comment résoudre un problème, il est conseillé de clairement et précisément définir son besoin (i.e. : savoir exactement "quoi" avant de chercher "comment").
Aussi, pour aller plus loin, il te faudra comprendre (si ce n'est pas déjà fait) qu'il n'y a pas forcément de correpondance exacte entre le code source d'un programme et sa représentation en mémoire (i.e. : "une variable dans le code source" ne veut pas forcément dire "un emplacement fixe en mémoire").
Enfin, il y a des outils, parfois proches des débogueurs, qui peuvent aider à repérer des variables en mémoire : les "trainers" (créés pour, par exemple, tricher dans certains jeux).
Cordialement,
DS.
[1] - Ou ne plus exister du tout...
PS (@Médinoc) : 8O je crois que c'est la première fois que je vois quelqu'un prendre la peine de saisir une majuscule accentuée (cf. "À part un debugger,")
Tu aurais un exemple précis? Pour moi, une variable correspond toujours à un emplacement précis en mémoire (tu parles de l'espace d'adressage d'un processus ou de la mémoire physique?), mais je suis en train de me former, alors je suis curieux.Citation:
Envoyé par David.Schris
Meilleures salutations
Thierry
Tout d'abord, j'ai écrit " emplacement fixe ", pas " emplacement précis ".Citation:
Envoyé par mujigka
Ce que je n'ai pas précisé, car cela me semblait (peut-être à tort ?) évident :
- par " fixe ", il faut comprendre " fixe dans le temps " (i.e. : qui ne bouge pas durant la vie du processus) ;
- " ne veut pas forcément dire "un emplacement fixe en mémoire" " a deux sens : " ne veut pas forcément dire "un emplacement en mémoire" " (cas de l'utilisation d'un registre) et " ne veut pas forcément dire "un emplacement fixe" " (cf. ci-dessus).
Pour l'exemple, je ne sais pas quel degré de précision tu souhaites (et puis j'ai un peu la flemme) donc je ne donnerai pas de code source, de capture d'écran de session de débogage, etc...
Donc :
- imagine une fonction avec une variable locale ;
- le compilateur produit un exécutable [1] de telle sorte que cette variable locale sera stockée sur la pile lors de chaque appel de la fonction ;
- rien ne garantit que la pile sera toujours dans le même état (et en particulier : même nombre et mêmes tailles d'éléments sur la pile) à chaque fois que la fonction sera appelée (exemple typique : une fonction récursive).
==> Selon le "moment", la variable (locale) ne sera pas toujours au même emplacement en mémoire. ==> L'emplacement n'est pas fixe.
Est-ce compréhensible ?
---- EDIT 1 - DEBUT ----
Petit exemple concret :La variable "variableLocale" n'est pas à un emplacement fixe en mémoire : "0xbfab32c4" puis "0xbfab3294".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 [d_schris@mojo.internal.doubleclick.net tmp]$ cat adresseVariableLocale.c #include <stdio.h> #include <stdlib.h> #define VALEUR_DEPART 9 void fonctionRecursive(int entier) { int variableLocale; variableLocale = entier / 3; printf("Dans fonctionRecursive() :\n\tentier = %d\n\tvariableLocale = %d\n\t&variableLocale = %p\n", entier, variableLocale, &variableLocale); if ( variableLocale > 1 ) { fonctionRecursive( variableLocale ); } } int main (void) { fonctionRecursive( VALEUR_DEPART ); exit(EXIT_SUCCESS); } [d_schris@mojo.internal.doubleclick.net tmp]$ gcc -std=c99 -Wall -Wextra -o adresseVariableLocale adresseVariableLocale.c [d_schris@mojo.internal.doubleclick.net tmp]$ ./adresseVariableLocale Dans fonctionRecursive() : entier = 9 variableLocale = 3 &variableLocale = 0xbfab32c4 Dans fonctionRecursive() : entier = 3 variableLocale = 1 &variableLocale = 0xbfab3294 [d_schris@mojo.internal.doubleclick.net tmp]$
---- EDIT 1 - FIN ----
[1] - Ne me dites pas que j'ai oublié l'éditeur de liens : je fais court. Merci.
Pour moi l'emplacement dans la mémoire physique d'une variable d'un programme est plutot relatif.
On accéde à la mémoire que lorsqu'on en a besoin ce qui veut dire aussi qu'une donnée peut être à l'instante t à l'offset x puis à l'instant t+1 à l'offset y.
Je ne connais rien qui permet de te garantir que la donnée soit toujours accessible au même emplacement physique.
Par contre l'adresse virtuelle ne devrait pas changer
EDIT : l'adresse virtuelle est celle que tu affiches avec le spécificateur de format %p dans printf
j'utilise dragon naturally speaking, version preferred pour ceux qui connaisse, et ce programme ne permet pas d'implanter ses propres commandes vocales pour controler une fenetre ou un programme, et donc pour en venir a ce que je souhaiterais faire : j'aimerais recuperer le phrase "compris" par le logiciel quand je lui parle via le microphone pour l'utiliser dans mon programme avec lequel je pourrais créer n'importe quel commande pour utiliser l'ordinateur.
Y'a pas les commandes vocales dans XP ?Citation:
Envoyé par gaut
cf. exemple ci-dessus. Les adresses affichées sont des adresses virtuelles.Citation:
Envoyé par hegros
Ah... Comme quoi, j'ai peut-être bien fait de poser la question...Citation:
Envoyé par gaut
Dans ce cas, il vaut peut-être mieux se tourner vers une solution plus simple.
Cela peut-être :
- une solution alternative (cf. message d'Emmanuel ou plus généralement utilisation d'une autre solution logicielle) ;
- une solution basée sur le logiciel (une option que tu n'aurais pas vue, une extension à acheter, etc) ;
- une "solution technique maison".
Dans le troisième cas, elle se basera plus probablement sur les actions du programme (appels de fonctions, envoi de messages Windows, etc) que sur son état (valeur de telle ou telle variable).
Par exemple, si DNS (que je ne connais pas) simule l'appui sur les touches "c", "o", "m", "p", "r", "i" et "s" lorsque le mot "compris" est prononcé, il peut être possible de détecter cette séquence de touches pour agir en conséquence.
Dans tous les cas, ce type de solution n'est envisageable que si :
- on a une bonne connaissance du fonctionnement des applications et du système ;
- on a une bonne connaissance du fonctionnement (interne) du logiciel en question.
Bref : rien d'évident et un "coût" (en temps, etc) probablement trop important comparé au gain.
la proposition qui me tente le plus, vu que je suis allé voir ce qu'est-ce qu'un trainer et comment il fonctionne, c'est celle sur la memoire virtuelle qui apparement ne change pas, et donc qui s'avere toujours precise.
le trainer fonctionnait de cette facon la :
il demande d'entrer une valeur par exemple "bonjour monsieur x", il va recherché dans la memoire utiliser par le programme toutes les adresses memoires correspondant a "bonjour monsieur x", a mon avis pour cet exemple il pourra trouvé qu'une seule adresse ou en tout cas tres peu d'adresse vu la precision de la demande. la ou les adresses récuperées sont des adresses virtuelles de variable.
dans quel sens ca fonctionne : d'abord trouver l'adresse virtuelle pour ensuite lire la valeur, ou : d'abord lire la valeur pour ensuite trouver l'adresse virtuelle.
Donc pour eclaircir ma question comment je dois m'y prendre pour lire la memoire d'un processus?
Avant d'aller bricoler un programme qui risque de ne pas fonctionner et de t'embrouiller dans des API difficilement gérables , est-ce que tu t'est renseigné de savoir sir Dragon Speaking offrait une interface de programmation afin que tu puisses toi-même paramêtrer tes propres fonctionnalités ???Citation:
Envoyé par gaut
Je suis sur qu'il doit y avoir un SDK pour Dragon Speaking...:roll: programmable dans n'importe que langage ( je parie à 100% dans ce cas-là que ce sera des objets COM )
en 2minutes chrono j'ai déjà trouvé cela :
http://support.nuance.com/
:roll:
suffit de s'enregistrer