Ich möchte wissen, welche Bibliotheken von ausführbaren Dateien auf meinem System verwendet werden. Insbesondere möchte ich bewerten, welche Bibliotheken am häufigsten verwendet werden, zusammen mit den Binärdateien, die sie verwenden. Wie kann ich das machen?
linux
shared-libraries
Alan Szlosek
quelle
quelle
dlopen
.Antworten:
ldd
diese Option, um gemeinsam genutzte Bibliotheken für jede ausführbare Datei aufzulisten.So finden Sie die Antwort für alle ausführbaren Dateien im Verzeichnis "/ bin":
Ändern Sie "/ bin" oben in "/", um alle Verzeichnisse zu durchsuchen.
Die Ausgabe (nur für das Verzeichnis / bin) sieht ungefähr so aus:
Bearbeiten - "grep -P" wurde entfernt
quelle
ldd -v
ldd
die ausführbare Datei tatsächlich mit einer speziellen Umgebungsvariablen ausgeführt wird und der dynamische Linux-Linker dieses Flag erkennt und nur die Bibliotheken ausgibt, anstatt die ausführbare Datei auszuführen. Schauen Sie sich die Quelle anldd
; Auf meinem System ist es ein Bash-Skript. Wenn die ausführbare Datei statisch verknüpft ist und Syscalls verwendet und einen anderen Loader angibt, kann sie beliebige böse Dinge tun. Verwendenldd
Sie es also nicht für eine ausführbare Datei, der Sie nicht vertrauen.Ich hatte kein ldd in meiner ARM-Toolchain, also habe ich objdump verwendet:
$ (CROSS_COMPILE) objdump -p
Zum Beispiel:
quelle
ldd
nicht vertrauenswürdigen ausführbaren Dateien.obbjdump -p
zusätzliche Informationen wieRPATH
die angezeigt, die bei der Untersuchung dynamischer Verknüpfungsprobleme mit Ihrer ausführbaren Datei hilfreich sein können.musl-gcc
regelmäßig Binärdateien erstellt werden, sodass beim Aufrufenldd
der Binärdatei nur die Binärdatei ausgeführt wird , sodass ich heutzutage regelmäßig daran erinnert werde, wie unsicher sieldd
ist).Unter Linux benutze ich:
Dies funktioniert besser als
ldd
wenn die ausführbare Datei einen nicht standardmäßigen Loader verwendetquelle
Verwenden Sie ldd, um zu erfahren, welche Bibliotheken eine Binärdatei verwendet
Sie müssten ein kleines Shell-Skript schreiben, um zu Ihrer systemweiten Aufschlüsselung zu gelangen.
quelle
Überprüfen Sie die Abhängigkeiten der gemeinsam genutzten Bibliothek einer ausführbaren Programmdatei
Um herauszufinden, von welchen Bibliotheken eine bestimmte ausführbare Datei abhängt, können Sie den Befehl ldd verwenden. Dieser Befehl ruft den dynamischen Linker auf, um die Bibliotheksabhängigkeiten einer ausführbaren Datei herauszufinden.
> $ ldd / path / to / program
Beachten Sie, dass es NICHT empfohlen wird, ldd mit einer nicht vertrauenswürdigen ausführbaren Datei eines Drittanbieters auszuführen, da einige Versionen von ldd die ausführbare Datei möglicherweise direkt aufrufen, um ihre Bibliotheksabhängigkeiten zu identifizieren, was ein Sicherheitsrisiko darstellen kann.
Stattdessen können Sie Bibliotheksabhängigkeiten einer unbekannten Anwendungsbinärdatei sicherer anzeigen, indem Sie den folgenden Befehl verwenden.
Für mehr Information
quelle
readelf -d
Rekursionredelf -d
erzeugt eine ähnliche Ausgabe,objdump -p
die unter https://stackoverflow.com/a/15520982/895245 erwähnt wurdeBeachten Sie jedoch, dass dynamische Bibliotheken von anderen dynamischen Bibliotheken abhängen können, auf die Sie zurückgreifen müssen.
Beispiel:
Beispiel ouptut:
Dann:
Wählen Sie eine aus und wiederholen Sie:
Beispielausgabe:
Und so weiter.
/proc/<pid>/maps
zum Ausführen von ProzessenDies ist nützlich, um alle Bibliotheken zu finden, die derzeit von ausführbaren Dateien verwendet werden. Z.B:
zeigt alle aktuell geladenen dynamischen Abhängigkeiten von
init
(PID1
):Diese Methode zeigt auch Bibliotheken
dlopen
, die mit diesem minimalen Setup geöffnet und getestet wurden, das mit einemsleep(1000)
unter Ubuntu 18.04 gehackten Setup gehackt wurde .Siehe auch: /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089
quelle
Unter OS X standardmäßig gibt es keine
ldd
,objdump
oderlsof
. Versuchen Sie alternativotool -L
:In diesem Beispiel
which openssl
füllt die Verwendung den vollständig qualifizierten Pfad für die angegebene ausführbare und aktuelle Benutzerumgebung aus.quelle
Angenommen, auf einem UNIX-System ist der binäre (ausführbare) Name test. Dann verwenden wir den folgenden Befehl, um die im Test verwendeten Bibliotheken aufzulisten
quelle
Mit
ldd
können Sie die Bibliotheken erhalten, die Tools verwenden. Um die Verwendung von Bibliotheken für eine Reihe von Tools einzustufen, können Sie den folgenden Befehl verwenden.(Hier werden
sed
alle Zeilen entfernt, die nicht mit einer Registerkarte beginnen, und nur die tatsächlichen Bibliotheken herausgefiltert. Mit erhaltensort | uniq -c
Sie jede Bibliothek mit einer Zählung, die angibt, wie oft sie aufgetreten ist.)Möglicherweise möchten Sie
sort -g
am Ende hinzufügen , um die Bibliotheken in der Reihenfolge ihrer Verwendung abzurufen.Beachten Sie, dass Sie mit dem obigen Befehl wahrscheinlich Zeilen erhalten, die nicht aus der Bibliothek stammen. Eine der statischen ausführbaren Dateien ("keine dynamische ausführbare Datei") und eine ohne Bibliothek. Letzteres ist das Ergebnis,
linux-gate.so.1
dass es sich nicht um eine Bibliothek in Ihrem Dateisystem handelt, sondern um eine vom Kernel "bereitgestellte".quelle
Eine weitere Option ist das Lesen der Datei unter
Wenn die Prozess-ID beispielsweise 2601 lautet, lautet der Befehl
Und die Ausgabe ist wie
quelle
auf Ubuntu-Druckpaketen, die sich auf eine ausführbare Datei beziehen
quelle
Ich fand diesen Beitrag sehr hilfreich, da ich Abhängigkeiten von einer von Drittanbietern bereitgestellten Bibliothek untersuchen musste (32- oder 64-Bit-Ausführungspfade).
Ich habe ein rekursives Q & D-Bash-Skript zusammengestellt, das auf dem Vorschlag 'readelf -d' in einer RHEL 6-Distribution basiert.
Es ist sehr einfach und testet jede Abhängigkeit jedes Mal, selbst wenn es zuvor getestet wurde (dh sehr ausführlich). Die Ausgabe ist auch sehr einfach.
Leiten Sie die Ausgabe in eine Datei um und suchen Sie nach "gefunden" oder "fehlgeschlagen".
Verwenden und modifizieren Sie auf eigenes Risiko, wie Sie möchten.
quelle