![]() |
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 :) |
Re: Arbeitsspeicher schnell durchsuchen
1) geht trotzdem (z.B. 'nen kleiner 1MB-Speicher und dann mit ReadProcessMemory da stückchenweise rein
2) hmmm, wo hab ich denn da nur die 64 KB her :gruebel: irgednwas war damit aber :? (nja, dann halt 4KB, aber 15 ist 'ne doofe Zahl) 3) aber normaler Weise nicht und da er nur Variablen wollte... Zitat:
|
Re: Arbeitsspeicher schnell durchsuchen
Moin Zusammen,
Zitat:
Zitat:
Wenn man Speicher reservieren will, geht das in 64K Schritten (allocation granularity), mit diesem reservierten Speicher kann man dann in 4K-Schritten etwas anstellen. |
Re: Arbeitsspeicher schnell durchsuchen
@brechi
wenn ich procedure MemLesen(ProcessID: integer); ausführe erhalte ich ja eine liste, aber was sagt diese mir? |
Re: Arbeitsspeicher schnell durchsuchen
Ah ne ich glaube der zeigt an wo was steht, und wie viele Bytes danach noch beschrieben sind aber gespeichert in verstehe ich icht
|
Re: Arbeitsspeicher schnell durchsuchen
Na die Funktion musst du schon durch deine ersetzen. Ich weiß doch nicht was du genau machen willst. Die Adresse wo das gespeichert wurde und die Länge hast du ja schließlich.
|
Re: Arbeitsspeicher schnell durchsuchen
[ot]
interessantes thema daher mal mit reinschreib um benachrichtigt zu werden.. [/ot] edit: danke wusste ich nicht dass man dadurch auch ne benachrichtigung bekommt :-)) wieder was dazugelernt! |
Re: Arbeitsspeicher schnell durchsuchen
Zitat:
Dafür gibt es doch den Button http://www.delphipraxis.net/images/p...n_favorite.gif stell dir vor jeder würde es so machen wie du. [/ot] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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