RAM
-
Was wäre aber jetzt wenn ein ein Programm nur 2KByte brauchen würde, dann würde ich ja auf 0 Byte kommen oder 1 Byte (je nach Rundung)
Ich bräuchte eben die Anzahl in Bytes, die das Programm im Speicher liegt[ Dieser Beitrag wurde am 22.01.2003 um 15:12 Uhr von paranoiac.org editiert. ]
-
Achja, und was wäre meine Startadressse? Bei meinem Beispiel bekomme ich nämlich immer 0 heraus als Startadresse.
-
Original erstellt von paranoiac.org:
Achja, und was wäre meine Startadressse? Bei meinem Beispiel bekomme ich nämlich immer 0 heraus als Startadresse.Die angebene Startdraesse ist genau die die du VirtualQueryEx zu füttern gibtst. VirtualQueryEx liefert Infos über GENAU DEN Block wo die angegebene Adresse dirn liegt. Wenn man tatsächlich mal den Speicher durchgeht, kommen da ziemlich viele Blöcke raus..ich versuche gerade ne vernünftige Liste zu machen
-
So..demonstration was ein Prozess alles ansammelt (entsteht, indem man VirtualQueryEx immer mit der Adresse nach dem zurückgelieferten Block aufruft):
ACHTUNG, VIEL
Das beobachtete Programm war Notepad, ohne irgendwas geladen zu haben:Memory map for process ID 492: 0x00000000 - 0x00010000 ??? --- FREE ??????? 0x00010000 - 0x00011000 RW- RW- COMMIT PRIVATE 0x00011000 - 0x00020000 ??? --- FREE ??????? 0x00020000 - 0x00021000 RW- RW- COMMIT PRIVATE 0x00021000 - 0x00030000 ??? --- FREE ??????? 0x00030000 - 0x0006d000 RW- ??? RESERVED PRIVATE 0x0006d000 - 0x0006e000 RW- ??? GUARD COMMIT PRIVATE 0x0006e000 - 0x00070000 RW- RW- COMMIT PRIVATE 0x00070000 - 0x0007d000 RW- RW- COMMIT PRIVATE 0x0007d000 - 0x00170000 RW- ??? RESERVED PRIVATE 0x00170000 - 0x00171000 RW- RW- COMMIT MAPPED 0x00171000 - 0x00180000 RW- ??? RESERVED MAPPED 0x00180000 - 0x00196000 R-- R-- COMMIT MAPPED 0x00196000 - 0x001a0000 ??? --- FREE ??????? 0x001a0000 - 0x001cf000 R-- R-- COMMIT MAPPED 0x001cf000 - 0x001d0000 ??? --- FREE ??????? 0x001d0000 - 0x00211000 R-- R-- COMMIT MAPPED 0x00211000 - 0x00220000 ??? --- FREE ??????? 0x00220000 - 0x00224000 R-- R-- COMMIT MAPPED 0x00224000 - 0x00230000 ??? --- FREE ??????? 0x00230000 - 0x00234000 RW- RW- COMMIT PRIVATE 0x00234000 - 0x00240000 RW- ??? RESERVED PRIVATE 0x00240000 - 0x00242000 R-- R-- COMMIT MAPPED 0x00242000 - 0x00250000 ??? --- FREE ??????? 0x00250000 - 0x00254000 R-X R-X COMMIT MAPPED 0x00254000 - 0x00310000 R-X ??? RESERVED MAPPED 0x00310000 - 0x00312000 R-X R-X COMMIT MAPPED 0x00312000 - 0x00318000 R-X ??? RESERVED MAPPED 0x00318000 - 0x00320000 ??? --- FREE ??????? 0x00320000 - 0x00363000 R-- R-- COMMIT MAPPED 0x00363000 - 0x00380000 ??? --- FREE ??????? 0x00380000 - 0x003e4000 R-X R-X COMMIT MAPPED 0x003e4000 - 0x00680000 R-X ??? RESERVED MAPPED 0x00680000 - 0x00681000 RW- RW- COMMIT PRIVATE 0x00681000 - 0x00690000 ??? --- FREE ??????? 0x00690000 - 0x00691000 RW- RW- COMMIT PRIVATE 0x00691000 - 0x006a0000 ??? --- FREE ??????? 0x006a0000 - 0x006a4000 RW- RW- COMMIT PRIVATE 0x006a4000 - 0x006b0000 RW- ??? RESERVED PRIVATE 0x006b0000 - 0x006b1000 RW- RW- COMMIT MAPPED 0x006b1000 - 0x006c0000 ??? --- FREE ??????? 0x006c0000 - 0x006d0000 RW- RW- COMMIT MAPPED 0x006d0000 - 0x00700000 RW- ??? RESERVED MAPPED 0x00700000 - 0x00701000 RW- RW- COMMIT PRIVATE 0x00701000 - 0x00780000 RW- ??? RESERVED PRIVATE 0x00780000 - 0x00781000 RCX R-- COMMIT IMAGE 0x00781000 - 0x0079b000 RCX --X COMMIT IMAGE 0x0079b000 - 0x0079d000 RCX R-- COMMIT IMAGE 0x0079d000 - 0x007a2000 RCX RW- COMMIT IMAGE 0x007a2000 - 0x007aa000 RCX R-- COMMIT IMAGE 0x007aa000 - 0x007b0000 ??? --- FREE ??????? 0x007b0000 - 0x007b8000 RW- RW- COMMIT PRIVATE 0x007b8000 - 0x007c0000 RW- ??? RESERVED PRIVATE 0x007c0000 - 0x007c8000 RW- RW- COMMIT PRIVATE 0x007c8000 - 0x008c0000 RW- ??? RESERVED PRIVATE 0x008c0000 - 0x008c1000 RW- RW- COMMIT MAPPED 0x008c1000 - 0x008d0000 ??? --- FREE ??????? 0x008d0000 - 0x008d5000 RW- RW- COMMIT MAPPED 0x008d5000 - 0x00950000 RW- ??? RESERVED MAPPED 0x00950000 - 0x00990000 ??? --- FREE ??????? 0x00990000 - 0x00994000 RW- RW- COMMIT PRIVATE 0x00994000 - 0x009a0000 RW- ??? RESERVED PRIVATE 0x009a0000 - 0x009b0000 RW- RW- COMMIT PRIVATE 0x009b0000 - 0x00da0000 RW- ??? RESERVED PRIVATE 0x00da0000 - 0x00dc0000 ??? --- FREE ??????? 0x00dc0000 - 0x00dc1000 RW- RW- COMMIT MAPPED 0x00dc1000 - 0x00dd0000 ??? --- FREE ??????? 0x00dd0000 - 0x00dd1000 RW- RW- COMMIT MAPPED 0x00dd1000 - 0x00de0000 ??? --- FREE ??????? 0x00de0000 - 0x00de1000 RW- RW- COMMIT MAPPED 0x00de1000 - 0x00df0000 ??? --- FREE ??????? 0x00df0000 - 0x00df1000 RW- RW- COMMIT MAPPED 0x00df1000 - 0x00e00000 ??? --- FREE ??????? 0x00e00000 - 0x00e01000 RW- RW- COMMIT MAPPED 0x00e01000 - 0x00e10000 ??? --- FREE ??????? 0x00e10000 - 0x00e11000 RW- RW- COMMIT MAPPED 0x00e11000 - 0x01000000 ??? --- FREE ??????? 0x01000000 - 0x01001000 RCX R-- COMMIT IMAGE 0x01001000 - 0x01008000 RCX R-X COMMIT IMAGE 0x01008000 - 0x0100a000 RCX RW- COMMIT IMAGE 0x0100a000 - 0x01010000 RCX R-- COMMIT IMAGE 0x01010000 - 0x10000000 ??? --- FREE ??????? 0x10000000 - 0x10003000 RCX R-- COMMIT IMAGE 0x10003000 - 0x60000000 ??? --- FREE ??????? 0x60000000 - 0x60001000 RCX R-- COMMIT IMAGE 0x60001000 - 0x6003a000 RCX R-X COMMIT IMAGE 0x6003a000 - 0x6003c000 RCX RW- COMMIT IMAGE 0x6003c000 - 0x6003d000 RCX RC- COMMIT IMAGE 0x6003d000 - 0x6003e000 RCX RW- COMMIT IMAGE 0x6003e000 - 0x60045000 RCX R-- COMMIT IMAGE 0x60045000 - 0x70bd0000 ??? --- FREE ??????? 0x70bd0000 - 0x70bd1000 RCX R-- COMMIT IMAGE 0x70bd1000 - 0x70c2b000 RCX R-X COMMIT IMAGE 0x70c2b000 - 0x70c2c000 RCX RW- COMMIT IMAGE 0x70c2c000 - 0x70c2d000 RCX RC- COMMIT IMAGE 0x70c2d000 - 0x70c35000 RCX R-- COMMIT IMAGE 0x70c35000 - 0x71710000 ??? --- FREE ??????? 0x71710000 - 0x71711000 RCX R-- COMMIT IMAGE 0x71711000 - 0x71770000 RCX R-X COMMIT IMAGE 0x71770000 - 0x71771000 RCX RW- COMMIT IMAGE 0x71771000 - 0x71794000 RCX R-- COMMIT IMAGE 0x71794000 - 0x75940000 ??? --- FREE ??????? 0x75940000 - 0x75941000 RCX R-- COMMIT IMAGE 0x75941000 - 0x75943000 RCX R-X COMMIT IMAGE 0x75943000 - 0x75944000 RCX RW- COMMIT IMAGE 0x75944000 - 0x75946000 RCX R-- COMMIT IMAGE 0x75946000 - 0x76b00000 ??? --- FREE ??????? 0x76b00000 - 0x76b01000 RCX R-- COMMIT IMAGE 0x76b01000 - 0x76b2a000 RCX R-X COMMIT IMAGE 0x76b2a000 - 0x76b2b000 RCX RW- COMMIT IMAGE 0x76b2b000 - 0x76b2e000 RCX RC- COMMIT IMAGE 0x76b2e000 - 0x76b3e000 RCX R-- COMMIT IMAGE 0x76b3e000 - 0x77540000 ??? --- FREE ??????? 0x77540000 - 0x77541000 RCX R-- COMMIT IMAGE 0x77541000 - 0x77560000 RCX R-X COMMIT IMAGE 0x77560000 - 0x77564000 RCX RW- COMMIT IMAGE 0x77564000 - 0x77565000 RCX RC- COMMIT IMAGE 0x77565000 - 0x77571000 RCX R-- COMMIT IMAGE 0x77571000 - 0x77580000 ??? --- FREE ??????? 0x77580000 - 0x77581000 RCX R-- COMMIT IMAGE 0x77581000 - 0x7769e000 RCX R-X COMMIT IMAGE 0x7769e000 - 0x7769f000 RCX RW- COMMIT IMAGE 0x7769f000 - 0x776a2000 RCX RC- COMMIT IMAGE 0x776a2000 - 0x777cc000 RCX R-- COMMIT IMAGE 0x777cc000 - 0x777f0000 ??? --- FREE ??????? 0x777f0000 - 0x777f1000 RCX R-- COMMIT IMAGE 0x777f1000 - 0x77809000 RCX R-X COMMIT IMAGE 0x77809000 - 0x7780a000 RCX RW- COMMIT IMAGE 0x7780a000 - 0x7780c000 RCX RC- COMMIT IMAGE 0x7780c000 - 0x7780e000 RCX R-- COMMIT IMAGE 0x7780e000 - 0x77810000 ??? --- FREE ??????? 0x77810000 - 0x77811000 RCX R-- COMMIT IMAGE 0x77811000 - 0x77814000 RCX R-X COMMIT IMAGE 0x77814000 - 0x77815000 RCX RW- COMMIT IMAGE 0x77815000 - 0x77817000 RCX R-- COMMIT IMAGE 0x77817000 - 0x77880000 ??? --- FREE ??????? 0x77880000 - 0x77881000 RCX R-- COMMIT IMAGE 0x77881000 - 0x778cf000 RCX R-X COMMIT IMAGE 0x778cf000 - 0x778d1000 RCX RW- COMMIT IMAGE 0x778d1000 - 0x778d2000 RCX RC- COMMIT IMAGE 0x778d2000 - 0x77901000 RCX R-- COMMIT IMAGE 0x77901000 - 0x779a0000 ??? --- FREE ??????? 0x779a0000 - 0x779a2000 RCX R-- COMMIT IMAGE 0x779a2000 - 0x77a2a000 RCX R-X COMMIT IMAGE 0x77a2a000 - 0x77a2b000 RCX RC- COMMIT IMAGE 0x77a2b000 - 0x77a32000 RCX RW- COMMIT IMAGE 0x77a32000 - 0x77a3b000 RCX R-- COMMIT IMAGE 0x77a3b000 - 0x77a40000 ??? --- FREE ??????? 0x77a40000 - 0x77a41000 RCX R-- COMMIT IMAGE 0x77a41000 - 0x77b22000 RCX R-X COMMIT IMAGE 0x77b22000 - 0x77b26000 RCX RW- COMMIT IMAGE 0x77b26000 - 0x77b28000 RCX RC- COMMIT IMAGE 0x77b28000 - 0x77b35000 RCX R-- COMMIT IMAGE 0x77b35000 - 0x77d20000 ??? --- FREE ??????? 0x77d20000 - 0x77d21000 RCX R-- COMMIT IMAGE 0x77d21000 - 0x77d8b000 RCX R-X COMMIT IMAGE 0x77d8b000 - 0x77d8c000 RCX RW- COMMIT IMAGE 0x77d8c000 - 0x77d91000 RCX R-- COMMIT IMAGE 0x77d91000 - 0x77da0000 ??? --- FREE ??????? 0x77da0000 - 0x77da1000 RCX R-- COMMIT IMAGE 0x77da1000 - 0x77df3000 RCX R-X COMMIT IMAGE 0x77df3000 - 0x77df4000 RCX RW- COMMIT IMAGE 0x77df4000 - 0x77df7000 RCX RC- COMMIT IMAGE 0x77df7000 - 0x77dfd000 RCX R-- COMMIT IMAGE 0x77dfd000 - 0x77e00000 ??? --- FREE ??????? 0x77e00000 - 0x77e01000 RCX R-- COMMIT IMAGE 0x77e01000 - 0x77e59000 RCX R-X COMMIT IMAGE 0x77e59000 - 0x77e5a000 RCX RW- COMMIT IMAGE 0x77e5a000 - 0x77e65000 RCX R-- COMMIT IMAGE 0x77e65000 - 0x77e70000 ??? --- FREE ??????? 0x77e70000 - 0x77e71000 RCX R-- COMMIT IMAGE 0x77e71000 - 0x77ecf000 RCX R-X COMMIT IMAGE 0x77ecf000 - 0x77ed1000 RCX RW- COMMIT IMAGE 0x77ed1000 - 0x77f33000 RCX R-- COMMIT IMAGE 0x77f33000 - 0x77f40000 ??? --- FREE ??????? 0x77f40000 - 0x77f41000 RCX R-- COMMIT IMAGE 0x77f41000 - 0x77f78000 RCX R-X COMMIT IMAGE 0x77f78000 - 0x77f79000 RCX RW- COMMIT IMAGE 0x77f79000 - 0x77f7c000 RCX R-- COMMIT IMAGE 0x77f7c000 - 0x78000000 ??? --- FREE ??????? 0x78000000 - 0x78001000 RCX R-- COMMIT IMAGE 0x78001000 - 0x78033000 RCX R-X COMMIT IMAGE 0x78033000 - 0x7803b000 RCX R-- COMMIT IMAGE 0x7803b000 - 0x7803e000 RCX RW- COMMIT IMAGE 0x7803e000 - 0x78041000 RCX RC- COMMIT IMAGE 0x78041000 - 0x78042000 RCX RW- COMMIT IMAGE 0x78042000 - 0x78046000 RCX R-- COMMIT IMAGE 0x78046000 - 0x782f0000 ??? --- FREE ??????? 0x782f0000 - 0x782f1000 RCX R-- COMMIT IMAGE 0x782f1000 - 0x782fd000 RCX R-X COMMIT IMAGE 0x782fd000 - 0x782fe000 RCX RW- COMMIT IMAGE 0x782fe000 - 0x78300000 RCX R-- COMMIT IMAGE 0x78300000 - 0x7f6f0000 ??? --- FREE ??????? 0x7f6f0000 - 0x7f6f7000 R-X R-X COMMIT MAPPED 0x7f6f7000 - 0x7f7f0000 R-X ??? RESERVED MAPPED 0x7f7f0000 - 0x7ffb0000 ??? --- FREE ??????? 0x7ffb0000 - 0x7ffd4000 R-- R-- COMMIT MAPPED 0x7ffd4000 - 0x7ffde000 ??? --- FREE ??????? 0x7ffde000 - 0x7ffdf000 RWX RWX COMMIT PRIVATE 0x7ffdf000 - 0x7ffe0000 RWX RWX COMMIT PRIVATE 0x7ffe0000 - 0x7ffe1000 R-- R-- COMMIT PRIVATE 0x7ffe1000 - 0x7fff0000 R-- --- RESERVED PRIVATE
-
Ja also komm ich da nicht ran oder wie?
Also ich weiss ja nicht, aber das kann doch nicht so schwer sein:
Ich will einfach ein Programm schreiben dass mir den kompletten Arbeitsspeicher von einem best. Programm ausgibt, beispielsweise Notepad.Deshalb benötige ich die Startadresse des Programms im Speicher und die Endadresse des Programms im Speicher
Wie geht das?
danke!
cu para
-
Original erstellt von paranoiac.org:
**Ja also komm ich da nicht ran oder wie?
Also ich weiss ja nicht, aber das kann doch nicht so schwer sein:
Ich will einfach ein Programm schreiben dass mir den kompletten Arbeitsspeicher von einem best. Programm ausgibt, beispielsweise Notepad.Deshalb benötige ich die Startadresse des Programms im Speicher und die Endadresse des Programms im Speicher
**Also wenn du den gesamten Speicher ausgeben willst, gehst du wie ich die ganzen Speicherblöcke ab und gibst alle aus, bei denen Read-Zugriff erlaubt ist (im Fehl mbi.Protect PAGE_READ, PAGE_READWRITE etc.)
Edit: Startadresse und Endadresse sind ziemlich schwer zu definieren. Ein Programm kann ja durchaus von Windows Speicher anfragen und Windows kann den quer im Speicher verteilen. Außerdem kommen noch DLLs dazu etc. Im allgemeinen sind die Speicherbereiche, die von der EXE-Datei kommen, genauso wie die DLL-Bereiche diejenigen, die mit MEM_IMAGE markiert sind.
zusätzlich angeforderte Speicherbereiche (seis von EXE oder DLL) sind als MEM_PRIVATE markiert.
[ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von TriPhoenix editiert. ]
-
Ja wie? Ich muss also wenn ich 2GB RAM hab alles durchlaufen?? Und dann prüfen oder was? Kann ich nicht gezielt nur die Blöcke auslesen, die auch Notepad gehören?
Achja. Dann bräuchte ich ach kein VirtualQueryEx, da ja ReadProcessMemory sonst eh einen Fehler zurückgibt?!
[ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von paranoiac.org editiert. ]
-
Original erstellt von paranoiac.org:
**Ja wie? Ich muss also wenn ich 2GB RAM hab alles durchlaufen?? Und dann prüfen oder was? Kann ich nicht gezielt nur die Blöcke auslesen, die auch Notepad gehören?Achja. Dann bräuchte ich ach kein VirtualQueryEx, da ja ReadProcessMemory sonst eh einen Fehler zurückgibt?!
[ Dieser Beitrag wurde am 22.01.2003 um 15:40 Uhr von [qb]paranoiac.org** editiert. ][/QB]
Du musst IMMER 2GB ram durchlaufen, weil Windows ja einen virtuellen Adressraum so zur verfügung stellt. Ansonsten s. mein Edit im Post drüber.
Und ja, dann kannst du eigentlich schon genauso per ReadProcessMemory alles brutal abfragen. Dann aber in 4096-Stücken, da du ja vorher nicht wissen kannst, wie groß die lesbaren Bereiche sind. Und bedenke, dass du auch immer alle DLLs mitdumpst und deren Daten
PS: Was Notepad "GEHÖRT" ist ebenso schlecht definierbar. Im Prinzip gehören ihm alle seiten, die als MEM_COMMIT markiert sind.
[ Dieser Beitrag wurde am 22.01.2003 um 15:43 Uhr von TriPhoenix editiert. ]
-
Das heisst ich durchlaufe von 0x00000000 bis 0x80000000
-
Original erstellt von paranoiac.org:
Das heisst ich durchlaufe von 0x00000000 bis 0x80000000Exakt, weil ab 0x80000000 der Kernelbereich anfängt udn da hat man sowieso nichts zu melden
-
Habs jetzt so.
Das müsste doch den Speicher der Notepad gehört auspucken oder?
Weil nur bei den Blöcken die Notepad gehören ist Read....() erfolgreich odeR?#include <stdio.h> #include <windows.h> int main() { HWND hWnd; HANDLE hProc; DWORD dwProcID; DWORD dwRw = 0; unsigned sadress = 0x00000000; unsigned eadress = 0x80000000; int buffer = 0; long iBytes2Read ; long iBytes; // find notepad hWnd = FindWindow(0, "Unbenannt - Editor"); if(!hWnd) return 0; // get process id GetWindowThreadProcessId(hWnd, &dwProcID); // open process hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcID); // get bytes to read printf("Wieviele Bytes auslesen: "); scanf("%d", &iBytes2Read); printf("\n"); iBytes=0; iBytes2Read = 0x80000000; while(iBytes2Read--){ if(ReadProcessMemory(hProc,(LPCVOID)sadress,&buffer, sizeof(buffer),&dwProcID)){ iBytes++; if(buffer<127 && buffer>31) printf("%c", buffer); } sadress++; } printf("\n\nFertig!"); // close handle CloseHandle(hProc);//<-- Wichtig! // quit fflush(stdin); getchar(); return 0; }
-
fflush(stdin);
Das ist verboten
-
wieso das denn??
-
Original erstellt von <Offtopic>:
**fflush(stdin);Das ist verboten**
Nihct verboten, das Verhalten auf input-Streams ist nur undefiniert
Und in der MSDN wirds benutzt, ist also unter Windows sehr wohl von M$ definiert worden
-
fflush ist nur auf stdout definiert. auf stdin == undefiniertes verhalten
-
Original erstellt von paranoiac.org:
**Habs jetzt so.
Das müsste doch den Speicher der Notepad gehört auspucken oder?
Weil nur bei den Blöcken die Notepad gehören ist Read....() erfolgreich odeR?
**Sieht vernünftig aus....ist nu nicht gerade das schnellste
-
MMmh, wie geht es denn schneller?
Brauche so für 0x00000000 bis 0x01000000 57 Sekunden[ Dieser Beitrag wurde am 22.01.2003 um 15:56 Uhr von paranoiac.org editiert. ]
-
Original erstellt von paranoiac.org:
**MMmh, wie geht es denn schneller?
Brauche so für 0x00000000 bis 0x01000000 57 Sekunden
**Lies in 4096er-Blöcken (Eine Speicherseite), solange es geht. Also mach dienen Buffer z.B. so:
unsigned char buffer[4096];dann musst du halt deine while-Schleife so modifizieren, dass sie 4096er-Blöcke rechnet.
-
char buffer[4097];
-
Ok, aber ist deine vorherige Methode mit VirtualQueryEx nicht schneller?
Oder hab ich da jetzt was ganz falsch verstanden