Wie erkenne ich zur Laufzeit, ob Symbole entfernt sind?

8

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?

    
WilliamKF 28.02.2011, 16:22
quelle

5 Antworten

7

Ich weiß, dass der file -Befehl den Unterschied erkennen kann, also könntest du möglicherweise auf seine Quelle schauen, um zu sehen, welchen Mechanismus er benutzt.

    
Mark B 28.02.2011, 16:30
quelle
7

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.

%Vor%     
jschmier 01.03.2011 20:24
quelle
2

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.

    
Simon Richter 28.02.2011 17:28
quelle
1

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.

%Vor%     
karlphillip 28.02.2011 17:38
quelle
1

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.

    
Tosha 26.09.2013 11:09
quelle