PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PE] Vertauschen von Sections



Cardano
12.07.2010, 02:34
Ja hi, ich bins schon wieder :P
Nach dem Rückschlag heute mittag beim Erstellen von Codecaves hab ich mich nicht zurrückschlagen lassen und hab mich wieder an etwas gesetzt. Ich bin dabei gut zur Hälfte fertig, wollte es testen und bin nun nach mehreren Stunden rumtesten mit der Hilfe eines Kumpels am Ende meiner Latein.

Folgendes mache ich:
Ich vertausche Sections
Mein kleines helloworld App hat 5 Sections:
Section 0: .text
Section 1: .rdata
Section 2: .data
Section 3: .rsrc
Section 4: .reloc

Was ich nun mache, ist Section 1 mit Section 2 zu vertauschen.
Wenn es nötig sein sollte, werde ich diesen Vorgang auch noch genau erläutern, wie aber die unten folgenden Screenshots euch zeigen werden, scheint dieser Vorgang aber so zu funktionieren wie er soll.

Danach vertausche ich ebenfalls die SectionHeader und setze alle Section Header so neu, dass sie wirklich wieder zu den Daten auf der Disk passen, sprich RawSize und/oder RawOffset werden verändert.

Ich spiele hierbei noch nicht mit den RVA herum, da ich bis zu diesem Punkt erstmal nur die physische Seite ändern wollte.

Da EBFE mich aufgeklärt hatte, dass es des öfteren vorkommt, dass short jmp's, bzw. short calls ausgeführt werden, dachte ich mir, das man zumindest die Sections im ganzen vertauschen könnte. Denn wann sollte eine .text Section in eine .reloc JMPen ?

Nichts destotrotz scheint sich aber trotzdem ein Fehler eingeschlichen zu haben. Denn die fertig modifizierte Datei
hello_world_modified.exe
Erzeugt folgende Meldung bevor überhaupt nur die Konsole geöffnet wird:
.....exe ist keine zulässige Win32-Anwendung

Egal welche Sections ich vertausche, es kommt immer auf dasselbe hinaus.
Hab ich meinen Test zufrüh gemacht und ich muss erst alle Relocs abarbeiten, DataDirectorys neuen RVA's zuweisen bevor das ganze überhaupt läuft. Oder ist hier wieder ein grundsetzlicher Fehler ?

Ich hab es übrigens schon probiert, dass ich zumindest die RVA's in CFF Explorer so abänder, das alles wieder linear ist. Das hat leider auch nichts gebracht. Naja hier Screens und die orig. und modified Datei

RapidShare: 1-CLICK Web hosting - Easy Filehosting (http://rapidshare.com/files/406444445/helloworld.rar)
http://www.imagebanana.com/img/rtqee4cs/thumb/Unbenannt.png (http://www.imagebanana.com/view/rtqee4cs/Unbenannt.png)
http://www.imagebanana.com/img/3hrgogz2/thumb/Unbenannt.png (http://www.imagebanana.com/view/3hrgogz2/Unbenannt.png)
http://www.imagebanana.com/img/bl3g5b2v/thumb/Unbenannt1.png (http://www.imagebanana.com/view/bl3g5b2v/Unbenannt1.png)

Vielen Dank wieder schonmal, Cardano

EDIT: Na okay, war wohl gestern Abend doch nicht ganz so wach, die beiden letzten Sections wurden nicht richtig kopiert. Es kommt aber auch wieder zum selben Fehler. Aber diesmal nicht in allen Fällen. Wenn ich nur die Sections 1 und 2 vertausche und anschließend die RVAs wieder in die richtige Reihenfolge bringe, sprich 1.VirtualAddress = 2000 und 2.VirtualAddress = 3000, dann startet es, zeigt kein Bild, und lädt sich mit 256kb Größe in den Speicher und macht gar nichts.

http://rapidshare.com/files/406485593/hello_world_modified2.exe

Edit 2: Nachdem ich nun die Addressen der DataDirs angepasst habe, kommen zumindest Fehlermeldungen das Datein nicht geladen werden konnten. Ich muss wohl noch ein paar rva's fixen.

Kann mir einer sagen warum ich Section 1 und 2 tauschen kann aber keine der anderen ? Beim Tauschen von z.b. 3 und 4 komm ich nicht soweit

l0dsb
12.07.2010, 14:14
012417C0 FF15 00202401 call near dword ptr [1242000]Dein Problem sind dieses Mal die Imports. Die RVA der Import Table ist inkorrekt, weshalb die IAT nicht erzeugt wird.

Deine Import-Table liegt in .rdata, welche nun an 0x3000 liegt (die RVA 0x2234 ist also nicht mehr richtig). Richtig wäre 0x3234 und entsprechend die Anpassung der RVAs in der Tabelle selbst. Ich nehme an, dass du daran schon arbeitest.

Des Weiteren musst du alle Referenzen im Code (siehe obigen Codeblock) auf die neue VA der IT (und somit auch der IAT, siehe IT.FirstThunk) abändern.

Üblicherweise sind es nur folgende Pattern, die du lokalisieren und abändern musst (von der Fehleranfälligkeit her ist dieser Ansatz recht unbedenklich):


call dword ptr [__imp]
jmp dword ptr [__imp]
mov reg32, dword ptr [__imp]Deshalb kannst du die IT-Section nicht ohne Weiteres vertauschen.

Schön, dass du nicht aufgegeben hast. ;)

edit: Was ich noch fast vergessen hätte (was einem im IRC nicht alles einfällt): Referenziert beispielsweise deine .text-Section Variablen in einer anderen Section (.data/.bss/...), musst du diese Verweise natürlich auch noch anpassen, was wiederum auf eine hundertprozentig korrekte Disassembly hinausläuft.

Damit (Imports und Daten) sollten aber so ziemlich alle üblicheren Zugriffe in eine andere Section abgedeckt sein.