Speicherbereich einer Anwendung
-
Hi,
ich will den gesamten Speicher eines Prozesses auslesen und in eine Datei speichern.
Nur, wie bekomm ich heraus ab welchem Offset ich lesen musss und wie groß er ist bzw. bei welchem Offset er endet?
-
Viel kann ich wohl nicht helfen (falls überhaupt): ReadProcessMemory
-
flenders schrieb:
Viel kann ich wohl nicht helfen (falls überhaupt): ReadProcessMemory
und auch ganz wichtig: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/virtualqueryex.asp
btw: benutzt du überhaupt windoofs?
-
Natülich benutze ich Windows, bin ja im WinAPI Forum.
Das lesen im Speicher ist kein Problem. Ich will nur wissen ab wo der Speicher
meines Programms anfängt und wie lang der ist. Ich hab vorhin gelesen, dass
die meisten Compiler die Basis bei 0x40000 setzten. Ist das bei VC++ genauso?
Außerdem, stellt Windows ja 4Gig virtuellen Speicher zur verfügung. Wobei
ein Teil für Dlls vestimmt ist. Es wär einfacher, wenn ich alles von 0x000000
bis 0xffffff lesen würde. Aber das würde ewig dauern und die Datei wär dann
4 Gig groß und liese sich nicht mit Notepad, Word oder sonstwas öffnen.
-
Das kann man sicher nicht so pauschalisieren. Das mit der Basis-Adresse ist afaik nur der Eintritts-Punkt (main bzw. WinMain, oder eben erst noch irgendwelche Runtime-Initialisierungs-Funktionen) - den kann man aber soviel ich weiß auch verändern.
Was genau willst du überhaupt genau auslesen?
-
Ich hab vorhin gelesen, dass
die meisten Compiler die Basis bei 0x40000 setzten.Diese Adresse ist ja das HINSTANCE was du von WinMain bekommst oder auch von GetModuleHandle.
-
Ah, danke für den Hinweis! Aber ich hab jetzt leider noch ein Problem.
Als ich den Speicher ab hinstance gelesen hab, kamen nur 68kb zusammen.
Aber wenn man alles von 0x00000000 bis 0xffffffff liest, so kommen 20mb zusammen!
Kann man rausfinden wo die anderen Speicherblöcke anfangen und enden?
-
INTEGER schrieb:
Kann man rausfinden wo die anderen Speicherblöcke anfangen und enden?
ich hatte da oben so'nen link gepostet. schau's dir bitte mal an
-
INTEGER: Ich glaube du hast die Speicherverwaltung von Windows nicht ganz verstanden.
Jedes Programm hat 2GB Speicher (aus Gründen, die jetzt zu weit führen würden, sinds nicht 4GB). Der "Start-Offset" ist z.B. bei Notepad.exe 0x40000; aber bei calc.exe ist dieser Offset genau der gleiche.
Eine Speicherstelle wird nämlich nicht nur über den Offset adressiert, sondern auch über den Selektor. Der Selektor steht in einem CPU-Register und wird IMHO normalerweise während der Programmausführung nicht verändert (Code und Daten haben AFAIK verschiedene Selektoren, auch wenn sie physikalisch manchmal (Win9x?) denselben Speicher haben).
notepad.exe bekommt von Windows einen anderen Selektor zugeteilt als calc.exe. calc.exe hat also technisch keinen Zugriff auf den Speicher von notepad.exe. Dieser Zugriff würde einen anderen Selektor voraussetzen, was aber unter Windows zu einer allgemeinen Schutzverletzung führt.
Die einzige Chance an den Speicher von fremden Programmen zu kommen, haben flenders und net gepostet.
-
net schrieb:
INTEGER schrieb:
Kann man rausfinden wo die anderen Speicherblöcke anfangen und enden?
ich hatte da oben so'nen link gepostet. schau's dir bitte mal an
Irgendwie kann ich damit nix Anfangen...
Folgendes hab ich jetzt:HWND hwnd=NULL HANDLE h=NULL DWORD ID=0; MEMORY_BASIC_INFORMATION mbi[11]; char s[255]; int x; hwnd=FindWindow(NULL,"test"); GetWindowThreadProcessId(hwnd,ID); h = OpenProcess(PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION | PROCESS_VM_WRITE | PROCESS_VM_READ,FALSE,ID); VirtualQueryEx(h,hinstance,mbi,10); x = (int) mbi[0].BaseAddress; sprintf(s,"%d",x); MessageBox(NULL,s,"!",MB_OK); CloseHandle(h);