Wie kann ich in meinem C ++ - Programm programmatisch zur Laufzeit feststellen, ob Symbole über das GNU-Entwicklungswerkzeug "Strip" unter Linux entfernt wurden?
Ich möchte eine Funktionsdefinition, die true zurückgibt, wenn sie entfernt wird, sonst false.
Würde dlsym () in "main ()" funktionieren, um dies zuverlässig zu erkennen?
Von einem Kommentar links für eine andere Antwort :
Ein abgestreiftes ELF enthält keinen .symtab
-Eintrag. Der Befehl file
durchläuft alle ELF-Abschnittsheader, bis ein Symboltabellenabschnitt gefunden wird. Wenn man nicht gefunden werden kann, wird die Binärdatei als beraubt betrachtet.
Die Bibliothek libelf ermöglicht einem Programm, ELF-Objektdateien, Archivdateien und Archivmitglieder zu bearbeiten. Die Manpages elf (3E) enthalten Dokumentation zur Verwendung der Bibliothek. Der folgende Code bietet ein Beispiel zum Bestimmen, ob die ausführbare Datei entfernt wurde, indem nach dem Vorhandensein eines Symboltabellenabschnitts ( .symtab
) gesucht wird.
dlsym
sucht nach dynamischen Symbolen, die nicht von strip berührt werden. Die statische Symboltabelle ist in Abschnitten enthalten, die zur Laufzeit nicht geladen werden und daher nicht in der Segmenttabelle erscheinen.
Eine ziemlich gute Heuristik wäre, auf die Existenz einer Sektionstabelle im ELF-Header zu achten, die normalerweise Ihrem Prozessspeicher zugeordnet ist, obwohl die dynamischen Linker-Interfaces es absichtlich schwer machen, wo zu finden. Auf einem typischen System, das die Funktion dl_iterate_phdrs
hat (eine Erweiterung des Standards), können Sie möglicherweise die PHDRS laufen lassen und für jede Vaddr prüfen, ob dort eine magische ELF-Nummer vorhanden ist, aber das ist nein Art, Form oder Form tragbar.
Sie können popen () verwenden, um nm
für die Zielanwendung auszuführen, und dann analysiert die Ausgabe , um festzustellen, ob sie entfernt ist oder nicht.
readelf --sections binary_path | grep debug_info
Es ist nicht trivial, allgemein zu sagen, ob eine Binärdatei entfernt wurde oder nicht, weil es verschiedene Möglichkeiten gibt, eine Datei zu entfernen. Im Wesentlichen entfernen entfernt einige Abschnitte in Bezug auf Symbole und Debugging. Wenn Sie jedoch "debug_info" durch "debug" ersetzen, können Sie sehen, dass noch einige debugbezogene Abschnitte in den Standardbinärdateien der Ubuntu-Distribution vorhanden sind.
Tags und Links c++ symbols introspection strip dlsym