AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MemorySpeicher effektiv durchsuchen

Ein Thema von Yakumo500 · begonnen am 24. Sep 2009 · letzter Beitrag vom 25. Sep 2009
Antwort Antwort
Yakumo500

Registriert seit: 15. Nov 2008
Ort: Darmstadt
106 Beiträge
 
#1

MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 11:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 11:33
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Yakumo500

Registriert seit: 15. Nov 2008
Ort: Darmstadt
106 Beiträge
 
#3

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 14:58
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;
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 16:45
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"?
  Mit Zitat antworten Zitat
almdudler777

Registriert seit: 4. Sep 2007
8 Beiträge
 
Delphi 2010 Professional
 
#5

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 17:20
Zitat von Delphi-Laie:
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"?

[OT]
Nen speicher, welcher speichert wo der Speicher gespeichert ist?!
[/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...
  Mit Zitat antworten Zitat
Yakumo500

Registriert seit: 15. Nov 2008
Ort: Darmstadt
106 Beiträge
 
#6

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 18:23
Versuch doch mal Cheat Engine (gibts hier) und so eine Suche wollte ich programmieren. Damit kannste auch Readonly Speicher ändern
  Mit Zitat antworten Zitat
Yakumo500

Registriert seit: 15. Nov 2008
Ort: Darmstadt
106 Beiträge
 
#7

Re: MemorySpeicher effektiv durchsuchen

  Alt 24. Sep 2009, 19:55
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;
  Mit Zitat antworten Zitat
Yakumo500

Registriert seit: 15. Nov 2008
Ort: Darmstadt
106 Beiträge
 
#8

Re: MemorySpeicher effektiv durchsuchen

  Alt 25. Sep 2009, 19:23
Ich habe selber eine Lösung gefunden: Ich machs einfach mit Threads, die sich den Speicherbereich aufteilen.

Trotzdem Danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 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