LECTURE DE LA MEMOIRE D'UN AUTRE PROCESSUS

Signaler
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
-
cs_Jean_Jean
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53350-lecture-de-la-memoire-d-un-autre-processus

cs_Jean_Jean
Messages postés
637
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
2
Bonjour Mokost,

J'ai été intéressé par ton code que j'ai inclu dans un projet test sous XE2.
Mais le compilateur me génère 29 erreurs du genre:
E2033 : les types des parametres VAR originaux et formels doivent être identiques.

Lorsque je regarde les fonctions en question, par exemple :

function TProcessDataModifier.ReadBytes(size:integer):TByteDynArray;
var readed :cardinal;
begin
setlength(result,size);
ReadProcessMemory(FAccessHandle,pointer(FAdresse),@result[0],size,readed);
inc(FAdresse,size);
end;

le compilateur s'arrête sur la 2ème ligne: ReadProcessMemory(...) que je n'ai pas modifié!

Je fais appel à la fonction dans la fiche principale:

procedure TForm1.FormActivate(Sender: TObject);
begin
// test1.exe qui est un code de D7
ProcessReader := TProcessDataModifier.Create('test1',0);
// Lire une chaîne de 256 octets
With ProcessDataModifier DO
Begin
Showmessage(ReadString(256)); //nombre d'octet à lire
End;
end;

Que se passe-t-il?
fredelem
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
J'ai introduit cette modification dans la procedure ReadString en remplaçant le "Raise Exception" par "result:=", ce qui donne:

if (not ReadProcessMemory (FAccessHandle, pointer (FAdresse), @result[1], size, readed)) then
result:=('Impossible de lire les données')
Else
begin (* reprise du programme original *)
ReadProcessMemory (FAccessHandle, Pointer (FAdresse) , @result[1] , Size,Readed);
setlength(str,readed);
result := String(str);
end;

Effectivement, au lieu d'obtenir "Lire_mem.exe", j'obtiens maintenant "Impossible de lire les données".

J'ai essayé de changer l'adresse de lecture. Après l'exemple que tu donnes (ProcessReader.Adresse := $047Fc87), j'ai essayé d'autres adresses.
Si je passe au dessous de 0460000, j'obtiens "Impossible de lire les données". Si je prends une valeur supérieure, j'obtiens un Showmessage vide. Je suppose que ça représente une longue suite de Chr(0) avec aucun autre caractère. C'est quand même un peu surprenant.

J'avoue que je ne sais pas grand-chose sur la gestion de la mémoire. Est-ce que tu vois une adresse où je pourrais lire quelque chose d'intéressant ?
Mokost
Messages postés
48
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
29 mars 2010

L'argument qui suit ReadString réprésente bien le nombre d'octet à lire. Il impossible de lire à l'adresse 0, c'est pour cela que tu obtient "Lire_mem.exe", on se sait pas ou il lit vraiment les données. En fait il aurait été plus judicieux si j'avais mit un test ex:
if(not ReadProcessMemory(FAccessHandle,pointer(FAdresse),@result[1],size,readed))
then raise Exception.Create('Impossible de lire les données');
fredelem
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
Je pense que c'est la mémoire de la calculatrice que j'ai lue puisque j'ai écrit au début du programme:

begin
// Faire de la calculatrice le processus étudié
ProcessReader := TProcessDataModifier.Create('Calc',0);

Mais j'ai essayé de modifier un peu ce Readstring(256). A la place, j'ai mis ReadString(500) et cette fois j'obtiens "Lire_mem.exe", le nom sous lequel j'ai sauvegardé ton programme. Bizarre, ça ne peut pas être contenu dans la mémoire de la calculatrice.

L'argument qui suit Readstring représente-t-il un nombre maximum d'octets à lire ou une adresse de départ ?