2017-06-29 3 views
0

Ich habe eine ELF-Datei, die bestimmte Zeichenfolgen enthält, die ich ändern möchte (sie sind Pfade zu Konfigurationsverzeichnissen). This answer zu this question sagt etwas über das Laufen gdb --write <path_to_executable>, um eine Zeichenkette in <path_to_executable> zu ändern, geht aber nicht ins Detail. Was sind die anderen Dinge, die ich mit diesem Befehl tun muss, um mein Ziel zu erreichen?Ändern von Strings in ausführbaren Dateien mit GDB

+0

@EmployedRussian Nein. Kein Duplikat. Ich habe nach einer bestimmten Methode gefragt, auf die sich die Frage nicht bezieht. – Melab

Antwort

0

(Es gibt einige binäre Editing-Tools besser als GDB, jede Hex bearbeiten Programm oder einige Reverse-Engineering-Tools)

-write Option von gdb ist in der Dokumentation des GDB dokumentiert: https://sourceware.org/gdb/onlinedocs/gdb/Mode-Options.html#Mode-Options

-write

Öffnen Sie die ausführbaren Dateien und Kerndateien für das Lesen und Schreiben. Dies entspricht dem Befehl "set write on" in GDB (siehe Patchen).

Patching Link zu https://sourceware.org/gdb/onlinedocs/gdb/Patching.html#Patching

17,6 Patchen Programme

... Wenn Sie möchten in der Lage sein, das binäre Patch, können Sie das explizit mit dem set write Befehl angeben . Sie können beispielsweise interne Debugging-Flags aktivieren oder sogar Notreparaturen durchführen.

set write on set write off Wenn Sie öffnet GDB ausführbare und Core-Dateien zum Lesen und Schreiben ‚auf Set write‘ angeben; Wenn Sie set write off (Standardeinstellung) angeben, öffnet GDB sie schreibgeschützt.

Wenn Sie bereits eine Datei geladen wird, müssen Sie es wieder geladen werden (mit dem exec-file oder core-file Befehl) nach set write ändern, für die neue Einstellung wirksam wird.

show write Zeigt an, ob ausführbare Dateien und Kerndateien zum Schreiben und Lesen geöffnet sind.

Noch keine Informationen über die Dateibearbeitung. Versuchen Sie einfach, Speicherbefehl Bearbeiten set something=value, wo etwas die Adresse mit richtigen Typ ist, verwenden Sie Adressen Ihrer Strings (wie in https://stackoverflow.com/a/3305200):

https://sourceware.org/gdb/onlinedocs/gdb/Assignment.html#Assignment

Werte in im Speicher beliebigen Orten zu speichern, verwenden Sie die ' {...} 'Konstrukt, um einen Wert des angegebenen Typs an einer angegebenen Adresse zu generieren (siehe Ausdrücke). Zum Beispiel {int} 0x83040 bezieht sich auf Speicherstelle 0x83040 als eine ganze Zahl (die eine bestimmte Größe und die Darstellung in dem Speicher bedeutet) und

set {int}0x83040 = 4 

speichert den Wert 4 in diesem Speicherplatz.

+0

Probieren Sie es einfach aus: Dateibearbeitung mit gdb und '-write' funktionieren nicht, wenn Ziel-Binary läuft; und wenn es nicht läuft (und nicht gestartet wurde), mit der Adresse von 'info file', ist es immer noch unverändert und' gdb' stürzte in corefile auf 'quit' ab. Bedenken Sie (bezüglich des Neubaus von gdb mit Debugging-Informationen im gdb-Format) und debuggen von gdb mit gdb (oder mit valgrind: "Adresse 0x28 ist nicht Stack'd, Malloc'd oder (kürzlich) frei. Von Signal 11 (SIGSEGV) .. Zugriff nicht innerhalb der gemappten Region bei Adresse 0x28 ") ... Scheint, dass' gdb -write' auch über Jahre hinweg überhaupt nicht funktioniert, auch ohne die verwendeten Befehle zu bearbeiten. – osgx

+0

Der Fehler kommt von 'bfd_close -> _bfd_elf_write_obejct_contents -> _bfd_elf_assign_file_positions_for_non_load -> _bfd_elf_strtab_finalize' (zuletzt in' elf-strtab.c'), wahrscheinlich weil _bfd_elf_strtab_finalize mit NULL 'tab' aufgerufen wurde, und der Fehlerbericht ist https: // bugs. debian.org/cgi-bin/bugreport.cgi?bug=835439 und https://sourceware.org/bugzilla/show_bug.cgi?id=20948: "jbm 2017-06-01 10:14:34 UTC: Das ist eine null-ptr-Dereferenz in bfd/elf-strtab.c: 367, resultierend aus einer null-ptr-Zeichenkette, die in bfd/elf.c extrahiert wurde: 6272. Elf_shstrtab (abfd) == abfd-> tdata.elf_obj_data-> o- > strtab_ptr == NULL' – osgx

Verwandte Themen