Chciałbym wiedzieć, które biblioteki są używane przez pliki wykonywalne w moim systemie. Mówiąc dokładniej, chciałbym ustalić, które biblioteki są najczęściej używane, wraz z binariami, które ich używają. W jaki sposób mogę to zrobić?
linux
shared-libraries
Alan Szlosek
źródło
źródło
dlopen
.Odpowiedzi:
ldd
do wyświetlania bibliotek współdzielonych dla każdego pliku wykonywalnego.Aby znaleźć odpowiedź na wszystkie pliki wykonywalne w katalogu „/ bin”:
Zmień „/ bin” powyżej na „/”, aby przeszukać wszystkie katalogi.
Dane wyjściowe (tylko dla katalogu / bin) będą wyglądać mniej więcej tak:
Edytuj - Usunięto „grep -P”
źródło
ldd -v
ldd
faktycznie uruchamia plik wykonywalny ze specjalną zmienną środowiskową, a linker dynamiczny Linux rozpoznaje tę flagę i po prostu wyświetla biblioteki zamiast uruchamiać plik wykonywalny. Spójrz na źródłoldd
; w moim systemie jest to skrypt bash. Jeśli plik wykonywalny jest statycznie powiązany i używa wywołań systemowych i określa inny moduł ładujący, może on wykonywać dowolne złe działania. Więc nie używajldd
pliku wykonywalnego, któremu nie ufasz.Nie miałem ldd na moim zestawie narzędzi ARM, więc użyłem objdump:
$ (CROSS_COMPILE) objdump -p
Na przykład:
źródło
ldd
którego nie należy używać w niezaufanych plikach wykonywalnych.obbjdump -p
pokazy dodatkowe informacje, takie jakRPATH
, które mogą być pomocne podczas badania dynamiczne łączenie problemów z wykonywalny.musl-gcc
regularnie produkuje pliki binarne, tak że wywoływanie plikuldd
binarnego po prostu wykonuje plik binarny , więc w dzisiejszych czasach regularnie przypominam sobie, jak niebezpiecznyldd
jest).W systemie Linux używam:
Działa to lepiej niż
ldd
wtedy, gdy plik wykonywalny używa innego niż domyślny modułu ładującegoźródło
aby dowiedzieć się, jakich bibliotek używa plik binarny, użyj ldd
Musisz napisać mały skrypt powłoki, aby dostać się do awarii całego systemu.
źródło
Sprawdź zależności biblioteki współdzielonej od pliku wykonywalnego programu
Aby dowiedzieć się, od jakich bibliotek zależy dany plik wykonywalny, możesz użyć polecenia ldd. To polecenie wywołuje dynamiczny linker, aby dowiedzieć się o zależnościach bibliotekowych plików wykonywalnych.
> $ ldd / ścieżka / do / program
Zauważ, że NIE jest zalecane uruchamianie ldd z dowolnym niezaufanym plikiem wykonywalnym innej firmy, ponieważ niektóre wersje ldd mogą bezpośrednio wywoływać plik wykonywalny w celu zidentyfikowania zależności biblioteki, co może stanowić zagrożenie bezpieczeństwa.
Zamiast tego bezpieczniejszym sposobem pokazania zależności biblioteki nieznanego pliku binarnego jest użycie następującego polecenia.
po więcej informacji
źródło
readelf -d
rekurencjaredelf -d
produkuje podobne wyniki, oobjdump -p
których wspomniano na stronie : https://stackoverflow.com/a/15520982/895245Ale uważaj, że biblioteki dynamiczne mogą zależeć od innych bibliotek dynamicznych, abyś musiał się powtarzać.
Przykład:
Przykładowy ouptut:
Następnie:
Wybierz jeden i powtórz:
Przykładowe dane wyjściowe:
I tak dalej.
/proc/<pid>/maps
do uruchamiania procesówJest to przydatne, aby znaleźć wszystkie biblioteki aktualnie używane przez uruchamianie plików wykonywalnych. Na przykład:
pokazuje wszystkie aktualnie załadowane zależności dynamiczne
init
(PID1
):Ta metoda pokazuje również biblioteki otwarte przy użyciu
dlopen
, przetestowane przy użyciu tej minimalnej konfiguracji zhakowanej za pomocąsleep(1000)
Ubuntu 18.04.Zobacz także: /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089
źródło
W OS X domyślnie nie ma
ldd
,objdump
lublsof
. Alternatywnie spróbujotool -L
:W tym przykładzie użycie
which openssl
wypełnia pełną ścieżkę dla danego środowiska wykonywalnego i bieżącego użytkownika.źródło
W systemie UNIX załóżmy, że nazwa binarna (wykonywalna) to test. Następnie używamy następującego polecenia, aby wyświetlić listę bibliotek używanych w teście
źródło
Dzięki
ldd
niemu możesz uzyskać biblioteki, których używają narzędzia. Aby uporządkować wykorzystanie bibliotek dla zestawu narzędzi, możesz użyć czegoś takiego jak następujące polecenie.(Tutaj
sed
usuwa wszystkie wiersze, które nie zaczynają się od tabulatora, i odfiltrowuje tylko rzeczywiste bibliotekisort | uniq -c
Otrzymujesz każdą bibliotekę z liczbą wskazującą liczbę jej wystąpienia).Możesz dodać
sort -g
na końcu, aby uporządkować biblioteki w kolejności użycia.Zauważ, że prawdopodobnie otrzymujesz linie dwie linie niebiblijne z powyższym poleceniem. Jeden ze statycznych plików wykonywalnych („nie jest dynamicznym plikiem wykonywalnym”) i jeden bez żadnej biblioteki. Ta ostatnia jest wynikiem, że
linux-gate.so.1
nie jest to biblioteka w systemie plików, ale „dostarczana” przez jądro.źródło
Jeszcze jedną opcją może być po prostu odczytanie pliku znajdującego się pod adresem
Na przykład, czy identyfikator procesu to 2601, a następnie polecenie to
A wynik jest jak
źródło
na pakietach drukowania ubuntu związanych z plikiem wykonywalnym
źródło
Uznałem ten post za bardzo pomocny, ponieważ potrzebowałem zbadać zależności z biblioteki dostarczonej przez inną firmę (ścieżki wykonania 32 lub 64-bitowe).
Złożyłem rekursywny skrypt bashowy Q&D oparty na sugestii „readelf-d” w dystrybucji RHEL 6.
Jest to bardzo podstawowe i za każdym razem będzie testować każdą zależność, nawet jeśli mogła być wcześniej przetestowana (tj. Bardzo gadatliwa). Wyjście jest również bardzo podstawowe.
przekieruj wyjście do pliku i grep dla „znaleziono” lub „nie powiodło się”
Używaj i modyfikuj, na własne ryzyko, oczywiście, jak chcesz.
źródło