![]() |
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 ?
|
Re: Arbeitsspeicher schnell durchsuchen
Tja, wie machst du es denn?
|
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. |
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. |
Re: Arbeitsspeicher schnell durchsuchen
als ich eben mal nach VirtualQueryEx gegooglet hab, hab ich folgende Seite gefunden:
![]() 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* |
Re: Arbeitsspeicher schnell durchsuchen
Zitat:
|
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
|
Re: Arbeitsspeicher schnell durchsuchen
Delphi-Quellcode:
sollte in etwa so gehen
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; |
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:
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? |
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 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz