Eine Section zur PE manuell hinzufügen

Moin,
ich mach ja gerade meinen Weg durch das PE Datei Format und bin immer noch bei den Sections. Heute wollte ich eine Section manuell hinzufügen, allerdings bekomm ich das nicht hin. Wie immer orientiere ich mich hauptsächlich an dem PE File Compendium vom ARTeam.

Meine Ansatz war:

  1. numberOfSections zu inkrementieren
  2. die .text Section zu kopieren und nach der .data Section einzufügen. Die neue Section nach .mySec umbenennen.
  3. die 200 Bytes von der .text Section kopieren und am Ende der Datei anfügen. Da es sich dabei um Code handelt hab ich diesen vorerst durch 0x90 ersetzt.
  4. Das Anpassen der Werte für die Sections. Da ich eine neue Section direkt nach .data eingefügt hab, stimmen natürlich die Werte von pointerToRawData nicht mehr. Da der Section Header 0x28 Bytes groß ist, hab ich den pointerToRawData auch um jeweils 0x28 für jede einzelne Section erhöht.
  5. im OptionalHeader befinden sich noch so zwei Werte, von denen ich denke, dass sie angepasst werden müssen. SizeOfImage und SizeOfHeaders. SizeOfImage hatte zuerst den Wert 0x400. Da ich 200 Bytes für die Section und 40 Bytes für den Header hinzugefügt hab, kam für mich ein wert von 0x4F0 raus. Zur SizeOfSectionHeaders erläutert das Compedium folgendes:
    [...] You can also use this value as the file offset of the first Section in the PE file
    Demnach hab ich den Wert auf 0x427 gesetzt.
Das Ergebnis davon ist keine gültige Win32 Anwendung. Ich bin schon die ganze Zeit am suchen, aber ich finde den Fehler einfach nicht.

Ich hab anbei wieder die beiden Dateien angehängt
MessageBox.exe
MessageBox6.exe

gruß seux
 
So mal auf die Schnelle:
Das Anpassen der Werte für die Sections. Da ich eine neue Section direkt nach .data eingefügt hab, stimmen natürlich die Werte von pointerToRawData nicht mehr. Da der Section Header 0x28 Bytes groß ist, hab ich den pointerToRawData auch um jeweils 0x28 für jede einzelne Section erhöht.
Sections können nur an einem Vielfachen von FileAlignment bzw SectionAlignment starten. Falls also das Hinzufügen des Headereintrags zur Folge hat, dass das Ganze nicht mehr in den ursprünglichen Header passt, muss man den Rest auffüllen und die erste Section entsprechend an 0x400 starten lassen. Damit das Ganze auch in den Ram geladen wird, sollte man auch entsprechend VirtualAddr Werte anpassen.

Am einfachsten wäre es, wenn man in IID King http://tuts4you.com/download.php?list.38, eine Section hinzufügt und dann schaut, welche Werte verändert wurden.

Als vereinfachte Version kann man auch erstmal nur die letzte Section erweitern. Oder eine Executable nehmen, die noch Platz zum Hinzufügen neuer Sectioneinträge bietet.
 
Sections können nur an einem Vielfachen von FileAlignment bzw SectionAlignment starten. Falls also das Hinzufügen des Headereintrags zur Folge hat, dass das Ganze nicht mehr in den ursprünglichen Header passt, muss man den Rest auffüllen und die erste Section entsprechend an 0x400 starten lassen. Damit das Ganze auch in den Ram geladen wird, sollte man auch entsprechend VirtualAddr Werte anpassen.

Da hab ich wohl was Missverstanden. Nachdem ich meinen 40 Byte langen Header hinzugefügt hab, hab ich auch alle anderen Sections, um diese 40 Bytes verschoben und die entsprechenden Pointer korrigiert.
Das mit der VirtualAddr hab ich auch gemacht, fehlt aber in der obigen Liste, sry.

Ich hab deinen Rat jetzt mal befolgt und es mit einem anderem Programm gemacht um mir die Unterschiede anzugucken. Mit IID King hab ich das allerdings nicht hingekriegt. Sowie ich das Programm verstanden hab, füge ich damit neue API's hinzu. Ich hab jetzt LordPE genommen, und damit eine Section hinzugefügt.
Das Ergebnis sah im Hex-Editor auch so aus, wie ich es nach jetzigem Kenntnisstand erwartet hab. Jedoch bekomme ich beim ausführen ebenfalls die Mitteilung, dass es sich um keine gültige Win32 Anwendung handelt.

LordPE hat ebenfalls die numberOfSections angepasst und die neue Section hinzugefügt und die VirtualAddr und pointerToRawData angepasst.
 
Wie von CDW bereits gepostet, muss es sich wohl um ein Alignment-Problem handeln. Ich hab dein file mal in Ida geöffnet: "Unaligned section pointers".
Wenn du es im CFF Explorer öffnest, siehst du, dass die "Section Headers" ziemlich krumme Werte haben. Dort kannst du aber auf "Rebuilder" gehen, "Realign File" und "Rebuild", anklicken, und schon funzt es (nach dem Abspeichern, natürlich).
Einen Artikel zum Thema findest du z.B. bei
Inside Windows: An In-Depth Look into the Win32 Portable Executable File Format
 
So, funzt. War an sich schon richtig, nur der sizeOfImage Wert war falsch. Hab nur 0x4000 Bytes für meine 4 Sections allokiert, dabei belegt der PE Header ja auch noch 0x1000 Bytes. Vielen dank für eure Hilfe
 
Zurück
Oben