Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Arbeitsspeicher schnell durchsuchen (https://www.delphipraxis.net/60132-arbeitsspeicher-schnell-durchsuchen.html)

MCQ 3. Jan 2006 15:57


Arbeitsspeicher schnell durchsuchen
 
mit TSearch kann man mit hilfe des integrierten HEX-Editors den Arbeitsspeicher blitzschnell durchsuchen. So kann man schnell finden wo sich bestimmte Werte befinden. Versuche ich allerdings soetwas selber zu programmieren dauert es teilweise über eine Stunde bis der Speicher durchsucht wurde. Was kann man machen damit der Vorgang schneller geht ?

Luckie 3. Jan 2006 18:24

Re: Arbeitsspeicher schnell durchsuchen
 
Tja, wie machst du es denn?

MCQ 3. Jan 2006 18:30

Re: Arbeitsspeicher schnell durchsuchen
 
Ich durchsuche mit Hilfe von ReadProcessMemory und einem 15kB-Buffer den kompletten Arbeitsspeicher des Programms von 0h bis FFFFFFFFh.
Kann man irgendwie feststellen in welchem Bereich Variablen-Inhalte gespeichert werden, so das ich den Bereich der Durchsucht werden soll eingrenzen kann.

brechi 3. Jan 2006 18:44

Re: Arbeitsspeicher schnell durchsuchen
 
Ja, such nur die Bereiche bei denen auch was drinsteht.

1. Liefert ReadProcessMemory wahr zurück wenns funktioniert hat und auch wieviel gelesen werden konnte.
2. Schau dir mal VirtualQueryEx an damit kann man sehen wo überhaupt Speicher benutzt wird.

MCQ 3. Jan 2006 19:00

Re: Arbeitsspeicher schnell durchsuchen
 
als ich eben mal nach VirtualQueryEx gegooglet hab, hab ich folgende Seite gefunden: http://www.egocrew.de/programmierung...utorial_teil_2

Sehr hilfreich auch für andere Leute die vor dem selben Problem stehen.

@brechi: danke für deine Hilfe ... bisher hast DU jedes meiner Probs gelöst, ich glaub das nächste mal Mail ich dich direkt an *lol*

jim_raynor 3. Jan 2006 19:29

Re: Arbeitsspeicher schnell durchsuchen
 
Zitat:

Zitat von MCQ
@brechi: danke für deine Hilfe ... bisher hast DU jedes meiner Probs gelöst, ich glaub das nächste mal Mail ich dich direkt an *lol*

Bitte nicht ;) denn hier im Forum besteht die geringe Chance mit den Beiträgen auch anderen zu helfen ;)

napsterxx 25. Feb 2008 16:55

Re: Arbeitsspeicher schnell durchsuchen
 
Ich wüsste gerne wie du das nun gmeacht hast. Ich durchsuche auch alles, und das dauert ja ewig. Kann das irgendwie nicht beschleunigen

brechi 5. Mär 2008 12:10

Re: Arbeitsspeicher schnell durchsuchen
 
Delphi-Quellcode:
procedure MemLesen(ProcessID: integer);
var
  ProcessHandle: THandle;
  StartMem: DWord;
  lpBuffer: TMemoryBasicInformation;
  myMem: Pointer;
  dwRead: DWord;
  dwOld: DWord;
begin
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);

  if (ProcessHandle <> 0) then
  begin
    StartMem := 0;
    while (StartMem <> $80000000) do
    begin
      if VirtualQueryEx(ProcessHandle, Pointer(StartMem), lpBuffer, SizeOf(lpBuffer)) = SizeOf(lpBuffer) then
      begin
        if VirtualProtectEx(ProcessHandle, lpBuffer.AllocationBase, lpBuffer.RegionSize, PAGE_EXECUTE_READWRITE, dwOld) then
        begin
          myMem := VirtualAlloc(nil, lpBuffer.RegionSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
          if (myMem <> nil) then
          begin
            if ReadProcessMemory(ProcessHandle, lpBuffer.AllocationBase, myMem, lpBuffer.RegionSize, dwRead) and (lpBuffer.RegionSize = dwRead) then
            begin
              Form1.ListBox1.Items.Add('Speicher gelesen: '+IntTohex(DWord(lpBuffer.AllocationBase),8)+', '+
                                        'Größe: '+IntToHex(lpBuffer.RegionSize,8)+', '+
                                        'gespeichert in: '+InttoHex(DWord(myMem),8));
            end;
            VirtualFree(myMem, 0, MEM_RELEASE);
          end;
          VirtualProtectEx(ProcessHandle, lpBuffer.AllocationBase, lpBuffer.RegionSize, dwOld, dwOld);
        end;
        if (lpBuffer.RegionSize <> 0) then
          inc(startMem, lpBuffer.RegionSize) else
          startMem := startMem+$1000;
      end else
        inc(StartMem,$1000);
    end;

  end;

end;
sollte in etwa so gehen

himitsu 5. Mär 2008 12:20

Re: Arbeitsspeicher schnell durchsuchen
 
willst du eigentlich den Speicher von anderen Programmen auslesen, oder nur eigenen?

VirtualAlloc und VirtualFree könnte man auch außerhalb der Schleife nur einmal resservieren

das die meißten Programme eh nud 32-Bittig sind und keiner 3G-Erweiterung aktiviert haben werden, reicht eigentlich auch schon 0h bis 7FFFFFFFh (alles darüber gib es da nicht)

und warum 15KB?
es is och alles in 2-Potenzen ausgelegt (also eher 16 KB).
nja und Windows verwaltet den Speicher in 64er-Schritten (also gleich 64KB)


Zitat:

Schau dir mal VirtualQueryEx an damit kann man sehen wo überhaupt Speicher benutzt wird.
das sagt nicht nur ob(wo) wasbelegt ist, sondern auch mit was.
und da kann man sich das Auslesen bestimmter Speicherblöcke, z.B. des gemapptem Programmcodes (der EXE und DLLs), gleich sparren ... da werden wohl kaum Variablen drin sein.


und nochmals aus Interesse ... wie hattest du es denn gemacht?

brechi 5. Mär 2008 12:29

Re: Arbeitsspeicher schnell durchsuchen
 
1) Ausserhalb der Schleife wäre schlecht bei unterschiedlicher RegionSize.
2) 32-Windows arbeitet in $1000 = 4906byte schritten (unter 64Bit mit 32bit programmen -> kp :/)
3) Programmcode ist auch veränderbar, und vill will er nur was auslesen (z.b. Konstanten) die stehen dann z.b da drin :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 Uhr.
Seite 1 von 2  1 2      

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