Adressen im Arbeitsspeicher lesen
-
Hi ich habe mir folgendes Programm geschrieben:
vul.exe
#include <windows.h> #include <iostream> int main() { SetConsoleTitle("test programm"); int var = 19; while (1) { system("CLS"); std::cout<< var << " " << &var << std::endl; Sleep(1500); } }
Ich weiss das an Adresse: 12FF88 der Wert 19 steht.
Das kann ich ja auch mit ReadMemory auslesen.Auf 32Bit Systemen kann mein Programm maximal 4GB belegen.
Aber wie finde ich heraus wo genau im Speicher mein Programm läuft, also ab wo ist ende?
Den Anfang von meinem Programm im Speicher den würde ich so berechnen.
1. Entrypoint und ImageBase aus PE Header auslesen.
2. EntryPoint + ImageBase = Adresse im Arbeitsspeicher(Virtual Address Space) wo mein Programm anfängtz.b.
0x12FF00 <-- Anfang von meinem Program
0x12FF01 Code aus meinem Programm
0x12FF02 Code aus meinem Programm
0x12FF88 Meine gesuchte Variable im Speicher
0x12FF89 Code aus meinem Programm
0x12FF03 <-- Ende von meinem ProgrammWas ich halt machen möchte ist mein Programm von Anfang bis Ende auslesen wenn es im Arbeitsspeicher läuft.
VirtualAddressSpace = Ein Adressraum im Arbeitsspeicher
-
Schau Dir mal den Code hier an:
http://blog.kalmbachnet.de/?postid=9
-
Hallo, Danke für den Link:
Das Programm hat mir folgendes ausgeben:
Largest Free Region: 0x43BB8000 bytes at 0x32778000Also kann ich sagen das:
Dort fängt mein Programm im Virtual Address Space an: 0x32778000
Und hier ist es zu ende: 0x43BB80000x32778000 = RegionSize aus MEMORY_BASIC_INFORMATION Struktur
0x43BB8000 = BaseAddress aus MEMORY_BASIC_INFORMATION StrukturDie MEMORY_BASIC_INFORMATION structure: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx
Habe ich das so richtig verstanden?
-
lange ist es her das ich das gemacht habe, aber ich glaube mich zu entsinnen das die BaseAddress + RegionSize = das ende des Programmes ist.