IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Delphi XE Obtenir l'adresse d' implentation en RAM d'une application


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut Delphi XE Obtenir l'adresse d' implentation en RAM d'une application
    Bonjour a tous et toutes,

    Eh oui l'année commence à peine et moi aussi j'ai de la peine

    Je tente depuis une semaine de récupérer l'adresse d'implantation en mémoire de n'importe quelle application ( comme disent les anglophones : la Process Base address ou la Module Base Address ou encore la Base Pointer of Module... ). Je suis donc parti - confiant - qu'en récupérant le PID de l'application et / ou le Handle, ce serait l'histoire de quelques secondes pour obtenir l'adresse d'implantation ou de l'adresse du premier octet de mon application (je parle ici de l'exécutable et pas des données de l'application)... Et comme un ou de bons dessins valent mieux que des tonnes d'explications, voici noir sur blanc ce qui a déjà été tenté:

    Le / les routines utilisées:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    unit SBTools;
    interface
    uses
      Windows,Messages,SysUtils,Variants,Classes,StrUtils,TlHelp32,PSAPI;
     
      function GetModuleBaseAddress(const PHandle: Thandle; MName: String):Pointer;
      function GetPIDFromName(appname: string): cardinal;
      function GetBasePointerOfModule(const ProcessId: cardinal; ModuleName: string): Pointer;
     
    var
      MyHandle : THandle;
      BaseAdr : pointer;
      PID : cardinal;
     
    implementation
     
    function GetPIDFromName(appname: string): cardinal;
    Var
      processEntry : TProcessEntry32;
    Begin
      Result := 0; appName := UpperCase(appname);
      MyHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      If MyHandle <> 0 Then
      try
        processEntry.dwSize := Sizeof(processEntry);
        If Process32First(MyHandle, processEntry) Then
        Repeat
        If Pos(appname,UpperCase(ExtractFilename(StrPas(processEntry.szExeFile)))) > 0
        Then Begin
          Result:= processEntry.th32ProcessID;
          Break;
        End; { If }
        Until not Process32Next(MyHandle, processEntry);
      finally
        CloseHandle(MyHandle);
      End; { try }
    End;
     
    function GetModuleBaseAddress(const PHandle: Thandle; MName: String):Pointer;
    var
      Modules         : Array of HMODULE;
      cbNeeded, i     : Cardinal;
      ModuleInfo      : TModuleInfo;
      ModuleName      : Array[0..MAX_PATH] of Char;
    begin
      Result := nil;
      SetLength(Modules, 1024);
      if (PHandle <> 0) then
      begin
        try
         EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE),cbNeeded);
        except
          Exit;
        end;
        SetLength(Modules, cbNeeded div SizeOf(HMODULE)); //Setting the number of modules
       if (Length(Modules) > 0) then
       begin
        for i := 0 to Length(Modules) - 1 do //Start the loop
        begin
          try
            GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName));
            if (Pos(MName, ModuleName) > 0) then
            begin
              GetModuleInformation(PHandle, Modules[i], @MoDuleInfo, SizeOf(ModuleInfo));
              Result := ModuleInfo.lpBaseOfDll;
              Exit;
            end;
          Except
          end;
        end;
       end;
      end;
    end;
     
    function GetBasePointerOfModule(const ProcessId: cardinal; ModuleName: string): Pointer;
    var
      FSnapshotHandle: THandle;
      FModulEntry32: MODULEENTRY32;
      s: string;
    begin
      Result := nil;
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE (* {$IFDEF WIN64}or
        TH32CS_SNAPMODULE32{$ENDIF} *), ProcessId);
      if FSnapshotHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;
      try
        FModulEntry32.dwSize := SizeOf(FModulEntry32);
        if not Module32First(FSnapshotHandle, FModulEntry32) then
        begin
          if GetLastError() <> ERROR_NO_MORE_FILES then RaiseLastOSError;
          Exit;
        end;
        repeat
          s := FModulEntry32.szModule;
          if s = ModuleName then
          begin
            Result := FModulEntry32.modBaseAddr;
            Exit;
          end;
        until not Module32Next(FSnapshotHandle, FModulEntry32);
        if GetLastError() <> ERROR_NO_MORE_FILES then RaiseLastOSError;
      finally
        CloseHandle(FSnapshotHandle);
      end;
    end;
    end.
    Fonctions appelées depuis :

    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
    16
    17
    18
    19
    20
    21
    22
     
    procedure TfrmSB.cmdStartClick(Sender: TObject);
    var
      IBase : cardinal;
      Bstr : string;
    begin
      PID := GetPIDFromName('LuaEdit');
      if PID <> 0 then
        begin
          staBar.Panels[1].Text := 'IS RUNNING.';
          staBar.Panels[3].Text := intToStr(PID);
          TxtHand.Text := intToStr(MyHandle);
        end
      else
        begin
          staBar.Panels[1].Text := 'IS NOT RUNNING.'; exit;
        end;
    //  BaseAdr := GetBasePointerOfModule(PID, 'LuaEdit');
      BaseAdr := GetModuleBaseAddress(MyHandle, 'LuaEdit');
      IBase := NativeInt(BaseAdr); Bstr := IntToHex(IBase, 8);
      TxtMem.Text := Bstr;
    end;
    Que je choisisse d'utiliser la fonction : GetModuleBaseAddress en passant le Handle ou que j'utilise la fonction GetBasePointerOfModule en passant le Process ID, le résultat est toujours le même soit : 00000000

    Ce que j'ai vraiment du mal à croire...

    Bref, si quelqu'un parmi vous peut me faire comprendre l'étendue de mon ignorance, je lui serais infiniment reconnaissant.

    Bonne continuation, bonne année et A+++
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    il y a deux erreurs

    1) le "CloseHandle(MyHandle);" fait que GetModuleBaseAddress ne peux pas fonctionner
    2) "if s = ModuleName then" fait que GetBasePointerOfModule ne peux pas fonctionner
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut
    Salut et merci Paul TOTH pour ta réponse...

    Citation Envoyé par Paul TOTH Voir le message
    il y a deux erreurs

    1) le "CloseHandle(MyHandle);" fait que GetModuleBaseAddress ne peux pas fonctionner
    2) "if s = ModuleName then" fait que GetBasePointerOfModule ne peux pas fonctionner
    Mais là je vais faire mon gilet jaune sur le point 1...

    Cette instruction est incluse dans la fonction : GetPIDFromName

    Or comme tu as pu le constater sur la copie d'écran jointe au message, j'obtiens bien un PID (malgré qu'apparemment ce ne soit pas correct )... Cherchez l'erreur...

    Pour ce qui est du point 2... Ben j'avoue que je sèche et que je vais tacher de trouver une autre routine ailleurs que sur des forums anglophones (car bien entendu ces 2 routines ont été trouvé sur des forums anglophones et s'ils se mettent à nous publier des trucs qui ne fonctionnent pas, c'est qu'ils sont vraiment perturbés par le Brexit )

    Bon pour rester sérieux, j'ai pensé un instant que c'est plutot moi qui ne sait pas non plus comment afficher correctement la valeur d'un pointeur... Je vais donc investiguer un peu plus sur ce point aussi.

    Encore Merci et A+++

    EDIT: OUPS sorry, je viens juste de comprendre le sens de CloseHandle(MyHandle)... OK Paul TOTH je vais modifier et je te dis ca...

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par zano972 Voir le message
    Salut et merci Paul TOTH pour ta réponse...



    Mais là je vais faire mon gilet jaune sur le point 1...

    Cette instruction est incluse dans la fonction : GetPIDFromName

    Or comme tu as pu le constater sur la copie d'écran jointe au message, j'obtiens bien un PID (malgré qu'apparemment ce ne soit pas correct )... Cherchez l'erreur...

    Pour ce qui est du point 2... Ben j'avoue que je sèche et que je vais tacher de trouver une autre routine ailleurs que sur des forums anglophones (car bien entendu ces 2 routines ont été trouvé sur des forums anglophones et s'ils se mettent à nous publier des trucs qui ne fonctionnent pas, c'est qu'ils sont vraiment perturbés par le Brexit )

    Bon pour rester sérieux, j'ai pensé un instant que c'est plutot moi qui ne sait pas non plus comment afficher correctement la valeur d'un pointeur... Je vais donc investiguer un peu plus sur ce point aussi.

    Encore Merci et A+++

    EDIT: OUPS sorry, je viens juste de comprendre le sens de CloseHandle(MyHandle)... OK Paul TOTH je vais modifier et je te dis ca...
    pour le point 2 , tu pourras constater en mode pas à pas que s contient le nom complet de l'exécutable et pas seulement "LuaEdit", il faut faire comme dans les autres cas un Pos()
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Obtenir l'adresse IP du client provenant d'une socket
    Par laurent12345 dans le forum Réseau
    Réponses: 11
    Dernier message: 15/04/2010, 21h43
  2. Obtenir l'adresse mac de sa carte reseau
    Par kivoch dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/11/2009, 18h30
  3. obtenir l'adresse MAC
    Par acastor dans le forum Développement
    Réponses: 2
    Dernier message: 18/04/2004, 13h19
  4. Obtenir l'adresse IP de mon pc
    Par Biou Pink Powa dans le forum C
    Réponses: 3
    Dernier message: 28/01/2004, 20h01
  5. Obtenir l'adresse MAC réelle
    Par gpetto dans le forum Réseau
    Réponses: 16
    Dernier message: 03/11/2003, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo