PE Header auslesen

11/14/2013 16:53 DerkurvigeTyrann#1
Hi
wie schon im Titel gesagt will ich die Informationen des PE Headers auslesen.
Ungünstigerweise wird durch die relocation table bei jedem Start des Programms die Position geändert wodurch der Zugriff durch static-adresses kompliziert wird und ich weder eine .au3 noch eine winapi gefunden habe die mir da weiterhelfen könnte, daher meine Frage welche Möglichkeiten gibt es?
11/14/2013 17:26 butter123#2
ich kenn mich mit dem dateiaufbau nicht wirklich aus, aber das sagt wiki:
Das letzte Feld im DOS-Header verweist auf die Position des PE-Headers, der dann auch mit der ASCII-Kennung „PE“ beginnt.
11/14/2013 17:48 lolkop#3
die ganz normalen fileread funktion sollten hierfuer doch vollkommen ausreichend sein
11/14/2013 19:12 DerkurvigeTyrann#4
Quote:
Originally Posted by butter123 View Post
ich kenn mich mit dem dateiaufbau nicht wirklich aus, aber das sagt wiki:
Das letzte Feld im DOS-Header verweist auf die Position des PE-Headers, der dann auch mit der ASCII-Kennung „PE“ beginnt.
Das ist mir soweit auch bekannt allerdings wechselt ja selbst dieser seine ansonsten fast immer statische Position
Quote:
Originally Posted by lolkop View Post
die ganz normalen fileread funktion sollten hierfuer doch vollkommen ausreichend sein
Leider nein da ich keine Text-Datei auslesen will, sondern ein Programm

Aber um meine Frage nochmal zu spezifizieren kennt hier irgendeine freundliche Seele eine Funktion die mir die am liebsten die einzelnen sections eines Programms aus dem PE-Header liest bzw. ihn zumindest finden könnte, da sobald ich die Adresse ,und sei es die des DOS-Headers, habe das ganze auch durch Offsets einfach auslesen könnte
11/14/2013 19:18 lolkop#5
Quote:
Originally Posted by DerkurvigeTyrann View Post
Das ist mir soweit auch bekannt allerdings wechselt ja selbst dieser seine ansonsten fast immer statische Position

Leider nein da ich keine Text-Datei auslesen will, sondern ein Programm

Aber um meine Frage nochmal zu spezifizieren kennt hier irgendeine freundliche Seele eine Funktion die mir die am liebsten die einzelnen sections eines Programms aus dem PE-Header liest bzw. ihn zumindest finden könnte, da sobald ich die Adresse ,und sei es die des DOS-Headers, habe das ganze auch durch Offsets einfach auslesen könnte
natürlich kannst du mit fileread beliebige dateien einlesen...

hier ein einfaches beispiel, welches dir den dos-header ausliest:
Code:
#include <array.au3>
ReadPeHeader("foobar2000_v1.2.9.exe")
Func readPeHeader($file)
	Local $hwnd = FileOpen($file, 16), $content = FileRead($hwnd, FileGetSize($file))
	$DosHeader = reverseArray(StringRegExp($content, "0x(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})(.{16})", 3))
	_ArrayDisplay($DosHeader)
EndFunc
Func reverseArray($array)
	Local $size=UBound($array), $return[$size]
	For $i=0 To $size-1
		$return[$i]='0x'&trimZero(reverseHexString($array[$i]))
	Next
	Return $return
EndFunc
Func reverseHexString($hex, $tmp='')
	If $hex='' Then Return $tmp
	Return reverseHexString(StringTrimRight($hex,2), $tmp&StringRight($hex,2))
EndFunc
Func trimZero($string)
	If $string='' Then Return '0'
	If StringLeft($string,1)<>0 Then Return $string
	Return trimZero(StringTrimLeft($string,1))
EndFunc
definiert ist der dos-header so:
Code:
typedef struct _IMAGE_DOS_HEADER {
        WORD e_magic;
        WORD e_cblp;
        WORD e_cp;
        WORD e_crlc;
        WORD e_cparhdr;
        WORD e_minalloc;
        WORD e_maxalloc;
        WORD e_ss;
        WORD e_sp;
        WORD e_csum;
        WORD e_ip;
        WORD e_cs;
        WORD e_lfarlc;
        WORD e_ovno;
        WORD e_res[4];
        WORD e_oemid;
        WORD e_oeminfo;
        WORD e_res2[10];
        LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
11/14/2013 20:15 DerkurvigeTyrann#6
Ja ich als Depp des Tages hab natürlich vergessen zu sagen, dass das im laufenden Prozess ausgelesen werden muss, allerdings ergibt sich das auch, da die Position des PE-headers und der sections ja während des Startvorgangs durch den relocation table jedesmal geändert werden. Ansonsten hätte ich die Werte ja auch kurz in olly nachschauen können.
Trotzdem Danke für die Funktion kann man sicherlich mal wann anders gebrauchen^^
11/14/2013 20:34 lolkop#7
Quote:
Originally Posted by DerkurvigeTyrann View Post
Ja ich als Depp des Tages hab natürlich vergessen zu sagen, dass das im laufenden Prozess ausgelesen werden muss, allerdings ergibt sich das auch, da die Position des PE-headers und der sections ja während des Startvorgangs durch den relocation table jedesmal geändert werden. Ansonsten hätte ich die Werte ja auch kurz in olly nachschauen können.
Trotzdem Danke für die Funktion kann man sicherlich mal wann anders gebrauchen^^
dir ist schon bewusst das "PE-Header" der header einer "portable executable" (ausführbaren datei) ist? ein prozess geht vllt von einer datei aus... hierbei kann aber keinesfalls von PE-Files gesprochen werden <.<
11/16/2013 13:59 DerkurvigeTyrann#8
Ehrlich gesagt hatte ich keine Ahnung das man da differenzieren muss... wovon redet man denn dann? Und vor allem wie liest man es aus?
11/17/2013 12:13 lolkop#9
Quote:
Originally Posted by DerkurvigeTyrann View Post
Ehrlich gesagt hatte ich keine Ahnung das man da differenzieren muss... wovon redet man denn dann? Und vor allem wie liest man es aus?
leider weis ich bis jetzt nicht wovon du redest... alles bisher von dir angesprochene befindet sich im pe-file.

plötzlich redest du dann vom speicher laufender anwendungen, erwähnst hierbei aber keinesfalls worum es eigentlich geht...
11/17/2013 14:24 DerkurvigeTyrann#10
Also meine Intention war es die Adressen einzelner Module in einem Prozess herauszufinden, hat sich aber erledigt hab gestern die KDmemory.au3 gefunden da sind alle funktionen drin die ich brauche