PE Datei durch Modifikation verkleinern

Hallo zusammen,
ich versuche mich etwas in das portable executable File Format einzuarbeiten (mit Hilfe des ARTeam PE File Format Compendium). Zur Zeit bin ich gerade bei den Sections. Ich habe nun ein kleines Beispielprogramm in MASM geschrieben, welches nur eine einfache MessageBox ausgibt, um das Dateiformat zu untersuchen.
Mein Programm hat 3 Section. ".text", ".rdata" und ".data". Für die stehen jeweils im Section Header unter anderem folgende Informationen:

  • sizeOfRawData
  • pointerToRawData
Für alle drei Sections beträgt der Wert für die sizeOfRawData 200h, was eigl viel zu groß ist. Allein der Data Bereich würde eigl nur 10h als size brauchen.

Nunja, ich hab für alle Sections die beiden obigen Werte angepasst und die leeren Bereiche, die durch die zu große Größe angefallen sind entfernt. Wenn ich das Programm jetzt allerdings starte, stürtzt es ab. Wenn ich es in OllyDbg öffne, sehe ich, dass da ziemlicher Mist geschehen muss (PE Header wurde anscheinend nicht richtig geladen, Sections sind nicht vorhanden, ...).

Hier sind erstmal die beiden exe Dateien
MessageBox.exe
MessageBox_Mod.exe

Es wäre schön, wenn ihr mir dabei eben kurz helfen könnt. Es geht jetzt hier auch nicht primär darum PE Dateien zu verkleinern, sprich mit Hilfe von anderer Software, sondern nur ums verständis des Dateiformats.

gruß seux
 
Das nennt sich file alignment (IMAGE_OPTIONAL_HEADER->FileAlignment). Wenn der Wert nun 0x200 ist, bedeutet, dass das sizeOfRawData immer auf das nächst größere Vielfache von 0x200 aufgerundet wird.
 
Okay, das kling schonmal vielversprechend :thumb_up:. Ich hab den Wert von FileAlignement jetzt runter auf 0x10 gesetzt. Damit wären alle meine sizeOfRawData ein vielfaches davon.

Zur Übersicht:
.text: 0x30
.rdata: 0x90
.data: 0x10

Jetzt bekomme ich jedoch eine Fehlermeldung, dass es sich um keine gültige W32 Anwendung handelt :frage:.
 
FileAlignment muss erstens eine Potenz von 2 sein und mindestens 512 (0x200).
SectionAlignment muss größer oder genauso groß wie FileAlignment sein.

Das hängt damit zusammen, dass diese Granularität für den Memory Manger des Kernels günstiger ist. (schnelleres Mapping der Adressen)
Deine Werte (wenn sie gehen würden) wären aufwendiger und langsamer. Man spart eben nur das bisschen Festplatte.

Allerdings braucht eine PE nicht unbedingt mehrere Sections. Man kann theoretisch alles in eine stopfen und so ein wenig sparen.
 
Code:
ml /c /coff /nologo my.asm
Link /SUBSYSTEM:WINDOWS /FILEALIGN:512 /[COLOR=black]MERGE[/COLOR]:.data=.text /section:.text,RWE  my.asm
das /MERGE wiederholt man dann für alle Sections.
Ansonsten kann man auch hier ein wenig lesen:
Tiny PE
 
Das interessante an den Tiny-PEs ist, dass diese auf eigene Faust "researched" wurden. Microsofts Dokumentationen geben das nicht her.
Nette Spielerei. Aber beide TinyPEs failen beispielsweise mittlerweile auf Win7 x64. (x86 habe ich nicht probiert)
Da müsste man wohl eine neue TinyPE ins Rennen schicken. :wink:
Hat jemand diesbezüglich schon einmal rumprobiert?
 
Das klingt ja sehr interessant, aber ich muss ertmal die Grundlagen verstehen. Ich merke mir das mal vor :wink:
 
Zurück
Oben