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
Antwort
(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 Sieset 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
odercore-file
Befehl) nachset 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.
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
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
- 1. Linux: Wie man Verbindung zwischen gdb und ausführbaren Dateien einrichtet?
- 2. Einstellung Strings in gdb
- 3. kwargs in ausführbaren Python-Dateien
- 4. Ausführen von ausführbaren Dateien in Gradlew
- 5. Bedeutung einer gemeinsamen Zeichenfolge in ausführbaren Dateien?
- 6. Aufruf von ausführbaren Dateien von JSP
- 7. Debuggen mit mehreren verknüpften Dateien in GDB
- 8. Vergleichen von generierten ausführbaren Dateien für Äquivalenz
- 9. Go Projekt mit 2 ausführbaren Dateien
- 10. Übertragen von Daten zwischen ausführbaren Dateien
- 11. Laden von Typen aus ausführbaren .NET-Dateien
- 12. Wrap-Dateien in einem ausführbaren Paket
- 13. GDB grep info sources dateien
- 14. Finding relative Bibliotheken, wenn Symlinks mit ausführbaren Dateien in Ruby
- 15. Debuggen von TensorFlow-Tests: pdb oder gdb?
- 16. Verwenden von Strings in Batch-Dateien
- 17. Wie vergleiche ich die Größe von ausführbaren Dateien in VB6?
- 18. Name der ausführbaren Anwendung unterscheidet sich von vshost ausführbaren Namen
- 19. Erstellen von ausführbaren Dateien von Labview für Linux-basierte Platform
- 20. Warum bekomme ich "nicht im ausführbaren Format: Erfolg" von gdbserver, aber alles funktioniert gut in gdb?
- 21. Auswahl Subset von Debug-Info-Dateien in gdb Sitzung
- 22. Erstellen einer ausführbaren Jar von 2 anderen ausführbaren Jar
- 23. Ändern der Ressourceninhalte einer laufenden ausführbaren Datei
- 24. Programmatisch das Symbol der ausführbaren Datei ändern
- 25. Unterschied zwischen ausführbaren Dateien python3 und python3m
- 26. WiX Heat-Tool kann keine Informationen von ausführbaren Dateien ernten
- 27. Auswahl zwischen mehreren ausführbaren Dateien mit demselben Namen (linux)
- 28. Erstellen von ausführbaren Dateien für Python 3 und PyQt
- 29. Ändern von Code zum Ziehen von Strings
- 30. Konfigurieren von gdb zum Ändern der Anzeige von Objekten
@EmployedRussian Nein. Kein Duplikat. Ich habe nach einer bestimmten Methode gefragt, auf die sich die Frage nicht bezieht. – Melab