extern pe header informationen
-
hey,
ist es möglich extern (also ohne eine DLL in den betroffenen Prozess geladen zu haben) an die Adresse(BaseOfCode) und Größe(SizeOfCode) der Code Section zu kommen?
schönes Wochenende!
-
Ja.
-
Jochen Kalmbach schrieb:
Ja.
Das ging schnell
- magst du mir auch sagen welche möglichkeiten/Funktionen mir da zur Verfügung stehen?Danke!
-
Wenn Du danach fragst, gerne

Einfach fopen/fread oder CreateFile/ReadFile
Und hier gibt es die Doku dafür, was Du lesen willst:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
-
Jochen Kalmbach schrieb:
Wenn Du danach fragst, gerne

Einfach fopen/fread oder CreateFile/ReadFile
Und hier gibt es die Doku dafür, was Du lesen willst:
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspxHey,
so ganz verstehe ich die Antwort leider nicht.
Wenn ich die zwei Informationen aus dem aktuellen Prozess holen möchte, mache ich folgendes:
PeHeaderInformations getPeHeaderInformations(char* moduleName) { PIMAGE_NT_HEADERS pHeader; PeHeaderInformations peInfo; pHeader = ImageNtHeader(GetModuleHandle( moduleName )); if(pHeader == 0) { peInfo.bSuccess = FALSE; return peInfo; } peInfo.dwBaseOfCodeSection = pHeader->OptionalHeader.BaseOfCode; peInfo.dwSizeofCodeSection = pHeader->OptionalHeader.SizeOfCode; peInfo.bSuccess = TRUE; return peInfo; }Da Ich aber ja leider nicht in dem aktuellen Prozess bin, kann ich das so ja nicht machen.
Ich probier meine Frage nochmal deutlicher zu stellen:
Ich möchte aus einem fremden Prozess die Adresse und Größe der Code Section bekommen.
Oder habe ich deine Antwort falsch verstanden?
Denn wenn ich das Modul von dem ich diese Information haben möchte per fread in einen Buffer lese, bringt mich das ja nicht wirklich weiter, oder?
verwirrte Grüße!
-
Ich glaube mir ist soeben die Erleuchtung gekommen.
Ich lade die DLL per LoadLibrary in meinen Prozess und hole mir dann die Base & Size der Section.
Dannach besorge ich mir die Modulebase des Prozesses und addiere die zu der Base, jetzt habe ich die Adresse der Codesection in dem entfernten Prozess.
Nun bleibt einzig und allein die Frage, ob die Codebase in meinem und in dem entfernten Prozess immer gleich bleibt.
Bleibt Sie es?
In meinem Versuch auf jeden Fall.
-
Du willst etwas ganz anderes, als der Titel beschreibt...
Du willst: Einen fremden, gestarteten, Prozess auslesen... bzw. erfahren, wo er seinen Code stehen hat...
Das hat nun mal überhaupt nichts mit dem PE-Format zu tun...
-
Jochen Kalmbach schrieb:
Du willst etwas ganz anderes, als der Titel beschreibt...
Du willst: Einen fremden, gestarteten, Prozess auslesen... bzw. erfahren, wo er seinen Code stehen hat...
Das hat nun mal überhaupt nichts mit dem PE-Format zu tun...
Puh, es bleibt schwierig.
Habe mir den Titel ausgesucht, da man diese Information ja (auch?) aus dem PE-Header auslesen kann.
Welche Möglichkeiten gibt es denn, um zu erfahren wo der Code eines fremden, gestarteten Prozesses steht?

-
Kurz zusammengefrickelt und nicht kompiled:
// load target in buffer szFile = path to exe unsigned filesize; char * memblock; ifstream file (szFile, ios::in|ios::binary|ios::ate); if (file.is_open()) { filesize = file.tellg(); memblock = new char [filesize]; file.seekg (0, ios::beg); file.read (memblock, filesize); file.close(); } // get Dos and NT Headers PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)memblock; if(DosHeader->e_magic != IMAGE_DOS_SIGNATURE) { MessageBox(0, "Did not found Dos header!", szAppName, MB_ICONERROR); return; } PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(memblock + DosHeader->e_lfanew); if(NtHeaders->Signature != IMAGE_NT_SIGNATURE) { MessageBox(0, "Did not found NtHeaders!", szAppName, MB_ICONERROR); return; } // z. B. NtHeaders->OptionalHeader.BaseOfCode
-
Der Code sagt aber nichts darüber aus, wo der PE-Code in einem schon laufenden Prozess liegt! Das ist heute mit BaseAdress Randomiziation noch alles viel komplizierter...
-
joa, ich bin jetzt von Windows XP ausgegangen, da wäre die Code Section bei BaseOfCode + Imagebase