Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MemorySpeicher effektiv durchsuchen (https://www.delphipraxis.net/140713-memoryspeicher-effektiv-durchsuchen.html)

Yakumo500 24. Sep 2009 11:29


MemorySpeicher effektiv durchsuchen
 
Hi,

Könnt ihr mir sagen wie ich den belegten Memoryspeicher eines fremden Prozesses am effektivsten durchsuchen kann?

Ich habe schon gelesen von VirtualQueryEx aber so ganz genau verstehe ich diese Funktion nicht.

himitsu 24. Sep 2009 11:33

Re: MemorySpeicher effektiv durchsuchen
 
Mit MSDN-Library durchsuchenVirtualQueryEx kannst du abfragen, ob ein bestimmter Block belegt ist und wenn ja womit und wie groß er eigentlich ist.

Mit MSDN-Library durchsuchenReadProcessMemory kann man ihn dann auslesen.

Yakumo500 24. Sep 2009 14:58

Re: MemorySpeicher effektiv durchsuchen
 
Ich habe das mal ausprobiert aber ich bekomme irgendwie zu wenig Addressen raus

(Ich habs erstma nur mit Integerwerten gemacht)

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var ProcessHandle: THandle;
    StartMem: DWord;
    lpBuffer: TMemoryBasicInformation;
    IntValue: Integer;
    dwRead: DWord;
    dwOld: DWord;
    WindowName: integer;
    pidi: integer;
begin
  Listbox1.Clear;

  WindowName := FindWindow(nil, PWideChar(Edit1.Text));
  GetWindowThreadProcessId(WindowName, @pidi);

  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, pidi);

  if (ProcessHandle <> 0) then
  begin
    StartMem := 0;
    while (StartMem < $80000000) do
    begin
      if VirtualQueryEx(ProcessHandle, Ptr(StartMem), lpBuffer, SizeOf(lpBuffer)) = SizeOf(lpBuffer) then
      begin
        if lpBuffer.State <> MEM_FREE then
        begin
          if ReadProcessMemory(ProcessHandle, lpBuffer.AllocationBase, @IntValue, 4, dwRead) = True then
          begin
            Listbox1.Items.Add('Address: ' + '$' + inttohex(Integer(lpBuffer.AllocationBase), 8) + ' Value: ' +inttostr(IntValue));
          end;
        end;

        if (lpBuffer.RegionSize <> 0) then
          inc(startMem, lpBuffer.RegionSize)
        else
          startMem := startMem + $00000100;
      end
      else
      begin
        startMem := startMem + $00000100;
      end;
    end;

  end;

  CloseHandle(ProcessHandle);
end;

Delphi-Laie 24. Sep 2009 16:45

Re: MemorySpeicher effektiv durchsuchen
 
Zitat:

Zitat von Yakumo500
Memoryspeicher

Was ist das denn? Memory ist doch schon Gedächtnis, Erinnerung, in der Fachsprache der Informatik(er) Speicher! Was also ist demnach "Memoryspeicher"? :gruebel:

almdudler777 24. Sep 2009 17:20

Re: MemorySpeicher effektiv durchsuchen
 
Zitat:

Zitat von Delphi-Laie
Zitat:

Zitat von Yakumo500
Memoryspeicher

Was ist das denn? Memory ist doch schon Gedächtnis, Erinnerung, in der Fachsprache der Informatik(er) Speicher! Was also ist demnach "Memoryspeicher"? :gruebel:


[OT]
Nen speicher, welcher speichert wo der Speicher gespeichert ist?! :warn:
[/OT]

Was mich viel mehr interessieren tät... warum muss man an den Speicher eines anderen Prozesses?

Kann man grundsätzlich alles auslesen? Oder kann eine Anwendung sich seinen Speicher auch sichern? Wäre ja cool wenn man Passwörter o.ä. im RAM hält...

Yakumo500 24. Sep 2009 18:23

Re: MemorySpeicher effektiv durchsuchen
 
Versuch doch mal Cheat Engine (gibts hier) und so eine Suche wollte ich programmieren. Damit kannste auch Readonly Speicher ändern :stupid:

Yakumo500 24. Sep 2009 19:55

Re: MemorySpeicher effektiv durchsuchen
 
So hab das Problem behoben leider ist mein Programm trotzdem noch langsam!
Kann jmd helfen und mir Tipps geben wie es schneller geht?

Delphi-Quellcode:
function MemorySearch(Process: Cardinal; FromAddr: DWORD = $00000000; ToAddr: DWORD = $FFFFFFFF): boolean;
var _FromAddr: DWORD;
    mbi: _MEMORY_BASIC_INFORMATION;
    StartValue: longint;
    EndValue: longint;
    buffer: integer;
    i: longint;
    bytesread: cardinal;
begin
  _FromAddr := FromAddr;

  while _FromAddr < ToAddr do
  begin
    VirtualQueryEx(Process, Ptr(_FromAddr), mbi, sizeof(_MEMORY_BASIC_INFORMATION));
                //<> MEM_FREE oder = MEM_COMMIT and (mbi.Protect = PAGE_READWRITE) and (mbi.Type_9 = MEM_PRIVATE)
    if (mbi.State = MEM_COMMIT) and (mbi.Protect <> PAGE_NOACCESS) and (mbi.Type_9 = MEM_PRIVATE) then
    begin
      StartValue := Integer(mbi.BaseAddress);
      EndValue := Integer(mbi.BaseAddress) + mbi.RegionSize;

      for i := StartValue to EndValue - 1 do
      begin
        if ReadProcessMemory(Process, Ptr(i), @buffer, Sizeof(integer), bytesread) = False then
        begin
          Continue;
        end
        else
        begin
          if buffer = 1 then
                   Form1.ListBox1.Items.Add('Start: $' + inttohex(i, 8) + ' Value: ' + inttostr(buffer));
        end;
          Form1.Label1.Caption := inttostr(form1.ListBox1.Items.Count);
        Application.ProcessMessages;
      end;
      Form1.Label1.Caption := inttostr(form1.ListBox1.Items.Count);

      Application.ProcessMessages;
    end;
    _FromAddr := _FromAddr + mbi.RegionSize;
  end;
  Showmessage('Ready');
end;

Yakumo500 25. Sep 2009 19:23

Re: MemorySpeicher effektiv durchsuchen
 
Ich habe selber eine Lösung gefunden: Ich machs einfach mit Threads, die sich den Speicherbereich aufteilen.

Trotzdem Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz