Bonjour,
Je cherche désespéremment comment lire une section de ma mémoire en C++.
En fait là je chercherai à regarder ce qui se trouve à l'adresse 0x859e1820.
Je vois ma valeur avec LiveKD, mais j'aimerais construire un outils l'automatisant.
Merci
Bonjour,
Je cherche désespéremment comment lire une section de ma mémoire en C++.
En fait là je chercherai à regarder ce qui se trouve à l'adresse 0x859e1820.
Je vois ma valeur avec LiveKD, mais j'aimerais construire un outils l'automatisant.
Merci
Que veux-tu faire exactement ? Pourquoi cette adresse en particulier ? Quel outil veux-tu faire ? Je te demande cela car ton problème est peut-être avant et que cette adresse peut très bien changer demain.
Oui ma valeur change.
En fait, quand je demarre un Windows au chargement celui ci place en mémoire des informations que j'aimerais recuperer.
Ces informations sont précédé d'une suite d'octets:
2C00 0500 0100 0000 ....
je veux recuperer les 128 bits qui suivent cet entete.
Mais dans un premier temps, je voulais pouvoir me placer à un endroit particuilier, et commencer ma recherche.
Mais je suis d'accord que l'adresse de l'information change à chaque fois que je redemarre mon Windows.
Voilà
Est-ce que memcpy pourrait suffir à ton bonheur ? Mais je ne suis pas très convaincu. Auras-tu le droit d'aller y lire ?









est ce qui a le plus de chance de marcher. Evidemment non portable. Ne pas oublier non plus que la memoire est normalement pas partagee entre process et que certaines zones peuvent ne pas etre lisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 unsigned char const* ptr = (unsigned char const*)0x859e1820;
ok, ca semble passer, mais je n'arrive pas à accéder au contenu pointé.
Lorsque j'execute ca, j'ai une sorte de segfault.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 unsigned char const* ptr = (unsigned char const*)0x859e1820; PCHAR pAdresse = (PCHAR)*ptr; if (*(PUSHORT)(pAdresse)==0x2c00) { ....
Relis le message de Jean-Marc.Bourguet.
Tu ne peux pas lire n'importe quelle adresse de ta mémoire. Il va falloir que tu débrouilles autrement mais ce n'est plus vraiment une question de C++. Windows doit bien te fournir un moyen de lire ce fameux entête.Ne pas oublier non plus que la memoire est normalement pas partagee entre process et que certaines zones peuvent ne pas etre lisible.
et en assembleur, il n'y a pas moyen non plus?
j'ai ecris ceci, ca ne fonctionne pas non plus, mais si ca donnes des idées à qqun
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 char b=0; __asm{ xor ebx, ebx mov eax, 0005002C loop_scan: repne scasd jnz end_scan mov bl, 0x1 end_scan: mov byte ptr [b],bl } b?printf("OK"):printf("ECHEC");
- Assembleur ou C++, aucune différence: Un processus "utilisateur" ne peut pas regarder n'importe où ainsi.
- Je ne connais pas les debuggers de Kernel, mais ils utilisent sûrement un composant exécuté en "kernel mode".
- En plus, le type d'exception affiché montre que c'est un projet .Net. Et ça, je suis sûr qu'aucun debugger de Kernel ne tourne en .Net...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Un processus dispose en général d'un adressage mémoire virtuel, grâce au MMU du processeur.
Tu n'as donc pas accès directement à l'adresse mémoire que tu veux.
Pour résumer, un processus utilisateur ne peux accéder à la mémoire comme il veut. (à cause du "mapping" c'est ca ?)
En recherchant sur le net, on m'a conseillé de coder un driver, pour pouvoir y accéder. Etes vous d'accord? Est ce que ca peut fonctionner?
Autre chose si je hook un processus noyau, est ce qu'il pourrait accéder à tous l'espace noyau? Ou toujours pas à cause du mapping?









C'est le genre de questions que des specialistes de ton OS sont plus a meme de repondre qu'un specialiste C++ (surtout quand comme moi il n'utilise que Unix depuis plus de 10 ans).
Je te suggere donc de demander a un moderateur de deplacer ce sujet sur un forum windows adequat.
J'ai créer une autre discussion dans la section Windows
Voilà le lien pour la suite
http://www.developpez.net/forums/sho...61#post2362961
J'ai juste une question....
Elle sort d'ou cette addresse ? Je veux dire...
Si c'est une adresse "physique" (addressage de la ligne/colonne des barettes mémoire) non seulement elle doit changer à chaque démarrage, mais il ya fort à parier que c'est même pendant l'utilisation....
Est-ce que c'est une adresse d'un process donné ?
Ou est-ce une adresse du kernel ?
Il existe probablement des fonctions pour lire la mémoire dans le kernel... par contre, pou y écrire.... j'espere bien que non !
Et il y a (heureusement) de moins en moins de drivers tournant en mode kernel (et les BSOD associés).
Si tu nous en disais un peu plus sur ce que tu veux faire, on pourra peut-etre t'aider plus efficacement.
C'est quoi les informations que tu veux récupérer par exemple ?
En fait, au chargement de Windows, le winloader charge à un endroit dans la mémoire une clé, utile pour mon programme.
Cette clé est utilisé pour tous les accès disque.
L'endroit de cette clé est placé en fonction de l'endroit ou est chargé le noyau. Elle est placé toujours apres mon noyau est chargé en :
Kernel base = 0x82000000
Entete Clé = 0x859e1860
Clé = 0x859e186a
Pour reperer cette clé elle est précedé toujours d'un entete d'octets du genre:
Donc moi, je cherche justement une fonction qui permet de lire la mémoire dans l'espace noyau, de rechercher cet en tête, et de lire la clé qui la suit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0x859e1860 2C 00 05 00 01 00 00 00 ....
Je sais pas si je suis clair?
T'aurais plutôt intéret à repérer l'endroit où le noyau stocke le pointeur vers cette clé...![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Sinon, juste une suggestion comme ca.
Avec un petit driver en mode kernel qui manipule le registre CR0 du proco tu peux complettement déprotéger la memoire et aller lire/ecrire un peu ou tu veux.
Mais c'est super dangereux.
Et puis il n'est pas complettement improbable qu tu aie une levée de bouclier de logiciels comme les Anti virus...
Cette technique étant répertoriée dans les techniques mechantes (on imagine facilement pourquoi)
Tu peux tenter une call gate pour passer en mode kernel depuis une application user land mais depuis xp je n'ai pas réussit a faire passer de call gate bien que cela soit documenté dans la doc intel.
Bref a pars des techniques de barbare... Je ne vois pas trop quoi te conseiller.
Enfin je rapelle quand meme que ces mecanismes de protections de la memoire ont été créés pour eviter qu'un ordinateur se transforme en un gros corewar et de finir avec des processus mutants composés d'un bout de l'un et d'un bout de l'autre (ce qui plante dans 99.9999999% des cas)
Partager