Lecture de la memoire d'un autre processus

Description

Une classe qui permet de lire et modifier la mémoire d'un autre processus à une adresse donnée.

ProcessReader := TProcessDataModifier.Create('calc',0);
Va créer une nouvelle instance de TProcessDataModifier et accéder à la mémoire du premier processus dont le nom de fichier contient 'calc' à l'évidence ce sera la calculatrice de windows : 'calc.exe'. Sous réserve que celle-ci soit lancé au préalable.

ProcessReader := TProcessDataModifier.CreateFromFile('c:\un\chemin\fichier.exe',0);
Va créer une nouvelle instance de TProcessDataModifier et lancer fichier.exe puis accéder à sa mémoire.

A chaque lecture l'adresse est incrémenter automatique de la taille des données lues. A tout moment pour venir à l'adresse de base il suffit d’exécuter ProcessReader.ResetPos; Pour positionner directement à l'adresse des données à lire : ProcessReader.Adresse := $047Fc87;

Source / Exemple :


//Codé sous delphi Xe, pour une compatibilité descendante (delphi 7 par exemple) il suffira de
//remplacer rawbytestring par string et verifier la taille en memoire des types de donnée 
TProcessDataModifier = Class
    constructor Create(aProcess: string; BaseAdresse:Cardinal);overload;
    constructor CreateFromFile(aFullPath: string; BaseAdresse:Cardinal);
    destructor Free;
  private
    FProcessName:string;
    FAccessHandle : HWND;
    FProcessId : HWND;
    FAdresse : cardinal;
    FBaseAdresse : cardinal;
  public
    property Adresse:cardinal read FAdresse write FAdresse;
    //Déplace l'adresse de offset
    procedure Move(offset:integer);
    //Réinitialise l'adresse de lecture à l'origine
    procedure ResetPos;

    //Lecture de donnée
    function ReadSmallInt:SmallInt;
    function ReadShortInt:ShortInt;
    function ReadLongInt:LongInt;
    function ReadChar:Char;
    function ReadByte:Byte;
    function ReadWord:Word;
    function ReadLongWord:LongWord;
    function ReadSingle:Single;
    function ReadReal:Real;
    function ReadReal48:Real48;
    function ReadExtended:Extended;
    function ReadBytes(size:integer):TByteDynArray;
    function ReadString(size:integer):RawByteString;

    //Ecriture de donnée
    procedure Write(value:SmallInt);overload;
    procedure Write(value:ShortInt);overload;
    procedure Write(value:LongInt);overload;
    procedure Write(value:Char);overload;
    procedure Write(value:Byte);overload;
    procedure Write(value:Word);overload;
    procedure Write(value:LongWord);overload;
    procedure Write(value:Single);overload;
    procedure Write(value:Real);overload;
    procedure Write(value:Real48);overload;
    procedure Write(value:Extended);overload;
    procedure Write(value:TByteDynArray);overload;
    procedure Write(value:RawByteString);overload;
    procedure Write(value:RawByteString;size:cardinal);overload;
End;

Conclusion :


Pour obtenir des adresses de lecture vous pouvez utiliser cheat engine par exemple.

Tout tourne principalement autour de ReadProcessMemory et de WriteProcessMemory de l'api Windows.

En conclusion j'espère que cette classe vous sera utile et j'attends vos conseils et avis.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.