2016-03-30 4 views
0

Ich weiß, dass Sie leicht die ELF mit einem Wert der gleichen Größe patchen können. Aber was, wenn ich es für einen größeren Wert ändern möchte? Gibt es eine Möglichkeit, den ELF zu entpacken und neu zu verpacken?Ist es möglich, den Wert eines char * in .rodata-Abschnitts einer Elfe zu ändern?

Ich bin nicht daran interessiert, die Binärdatei im Speicher zu patchen.

+1

Sie möchten also die Größe einer Zeichenfolge ändern? Dies ist prinzipiell möglich, aber da es sich aufgrund von Compiler/Linker-Optimierungen mit anderen Rohdaten überlappen kann (zB C-Style-Strings "asdf" und "sdf"), haben Sie möglicherweise mehr Glück beim Hinzufügen eines neuen Wertes .rodata-Abschnitt und Ändern aller erforderlichen Verweise auf den alten .rodata-Wert auf den neuen Speicherort. In jedem Fall ist das keine leichte Aufgabe. – jotik

Antwort

2

Aber was, wenn ich es für einen größeren Wert ändern möchte?

Sie wollen offenbar ein länger String, keinen größeren Wert.

Gibt es eine Möglichkeit, die ELF zu entpacken und neu zu verpacken?

Hängt davon ab, welche Art von ELF Sie fragen. Wenn Sie eine verschiebbare Objektdatei des Typs ET_REL (normalerweise .o) haben, ist die Änderung ziemlich trivial: Sie fügen einfach einen neuen Abschnitt an das Ende der Datei an (normalerweise befindet sich der Inhalt der Zeichenfolge im Abschnitt .rodata, so dass Sie eine (größere) Kopie davon, und dann aktualisieren Abschnitt Header .sh_offset und .sh_size an der richtigen Stelle in der Datei zu verweisen.

auf der anderen Seite entspricht, für einen verknüpftELF binär (ET_DYN oder ET_EXEC), die Aufgabe ist so kompliziert, als sehr schwer (fast unmöglich), weil mehrere Zeiger aktualisiert werden müssten, und die Platzierung im Speicher ist nicht willkürlich.

Verwandte Themen