는 방법을 보여 모든 공유 라이브러리에 의해 사용된 실행파일 리눅스에서는?
-
09-06-2019 - |
문제
나는 알고 싶어하는 라이브러리에 의해 사용되는 실행 파일에 시스템입니다.조금 더 구체적으로 말씀드리고 싶은 순위는 라이브러리를 사용 가장,바이너리와 함께 하는 그들을 사용합니다.이렇게 하려면 어떻게 해야 합니까?
해결책
- 사
ldd
목록을 공유 라이브러리에 대한 각각의 실행 파일을 실행합니다. - 정 출력
- 분류,계산수,종류에 의해 계산
대답을 찾을 수 있는 모든 실행파일에서"/bin"디렉토리:
find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n
변경"/bin"위로"/"로 검색하는 모든 디렉토리입니다.
출력(대만/bin 디렉토리)아래와 같습니다:
1 /lib64/libexpat.so.0
1 /lib64/libgcc_s.so.1
1 /lib64/libnsl.so.1
1 /lib64/libpcre.so.0
1 /lib64/libproc-3.2.7.so
1 /usr/lib64/libbeecrypt.so.6
1 /usr/lib64/libbz2.so.1
1 /usr/lib64/libelf.so.1
1 /usr/lib64/libpopt.so.0
1 /usr/lib64/librpm-4.4.so
1 /usr/lib64/librpmdb-4.4.so
1 /usr/lib64/librpmio-4.4.so
1 /usr/lib64/libsqlite3.so.0
1 /usr/lib64/libstdc++.so.6
1 /usr/lib64/libz.so.1
2 /lib64/libasound.so.2
2 /lib64/libblkid.so.1
2 /lib64/libdevmapper.so.1.02
2 /lib64/libpam_misc.so.0
2 /lib64/libpam.so.0
2 /lib64/libuuid.so.1
3 /lib64/libaudit.so.0
3 /lib64/libcrypt.so.1
3 /lib64/libdbus-1.so.3
4 /lib64/libresolv.so.2
4 /lib64/libtermcap.so.2
5 /lib64/libacl.so.1
5 /lib64/libattr.so.1
5 /lib64/libcap.so.1
6 /lib64/librt.so.1
7 /lib64/libm.so.6
9 /lib64/libpthread.so.0
13 /lib64/libselinux.so.1
13 /lib64/libsepol.so.1
22 /lib64/libdl.so.2
83 /lib64/ld-linux-x86-64.so.2
83 /lib64/libc.so.6
편집거"grep-P"
다른 팁
지 않았 ldd 에 내 팔 툴체인 그래서 나는 사용 objdump:
$(CROSS_COMPILE)objdump-p
예를 들어:
objdump -p /usr/bin/python:
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libdl.so.2
NEEDED libutil.so.1
NEEDED libssl.so.1.0.0
NEEDED libcrypto.so.1.0.0
NEEDED libz.so.1
NEEDED libm.so.6
NEEDED libc.so.6
INIT 0x0000000000416a98
FINI 0x000000000053c058
GNU_HASH 0x0000000000400298
STRTAB 0x000000000040c858
SYMTAB 0x0000000000402aa8
STRSZ 0x0000000000006cdb
SYMENT 0x0000000000000018
DEBUG 0x0000000000000000
PLTGOT 0x0000000000832fe8
PLTRELSZ 0x0000000000002688
PLTREL 0x0000000000000007
JMPREL 0x0000000000414410
RELA 0x0000000000414398
RELASZ 0x0000000000000078
RELAENT 0x0000000000000018
VERNEED 0x0000000000414258
VERNEEDNUM 0x0000000000000008
VERSYM 0x0000000000413534
무엇을 배우고 라이브러리 바이너리 사용하는 사용 ldd
ldd path/to/the/tool
당신을 써야 할텐데 작은 쉘 스크립트를 얻을 당신의 시스템을 분석합니다.
체크인 공유 라이브러리 의존성 프로그램의 실행
무엇을 찾 라이브러리는 실행 파일에 따라 사용할 수 있습니다 ldd 명령입니다.이 명령을 호출하는 동적 링커를 찾 라이브러리 의존성의 실행 파일을 실행합니다.
>$ldd/path/to/프로그램
참고하는 그것을 실행하는 것은 권장되지 않습 ldd 으로 어떤 신뢰할 수 없는 제삼자 실행하기 때문에 일부 버전의 ldd 직접 수 있습 호출에 실행파일을 식별하는 라이브러리 의존성할 수 있는 보안 위험이 있습니다.
대신,안전한 방법을 표시 라이브러리의 종속성을 알 수없는 응용 프로그램 바이너리를 다음 명령을 사용합니다.
$objdump-p/path/to/프로그램|grep 요
readelf -d
재귀
redelf -d
과 비슷한 출력을 생성하는 objdump -p
는 언급되었다: https://stackoverflow.com/a/15520982/895245
하지만 조심하는 동적 라이브러리에 따라 달라질 수 있습 다른 동적 라이브러리로,당신은 recurse.
예제:
readelf -d /bin/ls | grep 'NEEDED'
샘플 ouptut:
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libacl.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
다음:
$ locate libselinux.so.1
/lib/i386-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libselinux.so.1
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1
중 하나를 선택하고 반복합니다:
readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED'
샘플 출력:
0x0000000000000001 (NEEDED) Shared library: [libpcre.so.3]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2]
그래서.
/proc/<pid>/maps
실행하기 위한 프로세스
이것을 찾기 위해 유용한 모든 라이브러리는 현재에 의해 사용되는 실행 파일을 실행.E.g.:
sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u
모두 보여줍니다 현재 로드된 동적의 종속성 init
(PID 1
):
/lib/x86_64-linux-gnu/ld-2.23.so
/lib/x86_64-linux-gnu/libapparmor.so.1.4.0
/lib/x86_64-linux-gnu/libaudit.so.1.0.0
/lib/x86_64-linux-gnu/libblkid.so.1.1.0
/lib/x86_64-linux-gnu/libc-2.23.so
/lib/x86_64-linux-gnu/libcap.so.2.24
/lib/x86_64-linux-gnu/libdl-2.23.so
/lib/x86_64-linux-gnu/libkmod.so.2.3.0
/lib/x86_64-linux-gnu/libmount.so.1.1.0
/lib/x86_64-linux-gnu/libpam.so.0.83.1
/lib/x86_64-linux-gnu/libpcre.so.3.13.2
/lib/x86_64-linux-gnu/libpthread-2.23.so
/lib/x86_64-linux-gnu/librt-2.23.so
/lib/x86_64-linux-gnu/libseccomp.so.2.2.3
/lib/x86_64-linux-gnu/libselinux.so.1
/lib/x86_64-linux-gnu/libuuid.so.1.3.0
이 방법은 또한 보 라이브러리는 열립 dlopen
, 테스트 이 최소한의 설정 해킹과 sleep(1000)
우분투에서 18.04.
도 참조하십시오: https://superuser.com/questions/310199/see-currently-loaded-shared-objects-in-linux/1243089
에서 유닉스 시스템,가진(실행)이름은 시험입니다.그런 다음 우리를 사용하여 다음과 같은 명령을 사용하는 라이브러리에서 테스트
ldd test
OS X 에서 기본적으로 없 ldd
, objdump
나 lsof
.에 대한 대안으로,시험 otool -L
:
$ otool -L `which openssl`
/usr/bin/openssl:
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
이 예제에서 사용하는 which openssl
을 채우에는 완전한 경로 주어진 실행 및 현재 사용자 환경이다.
가 ldd
당신이 얻을 수 있는 라이브러리는 도구로 사용.순위를 사용의 라이브러리 세트를 위한 도구 같은 것을 사용할 수 있습니다면 다음 명령입니다.
ldd /bin/* /usr/bin/* ... | sed -e '/^[^\t]/ d; s/^\t\(.* => \)\?\([^ ]*\) (.*/\2/g' | sort | uniq -c
(기 sed
스트립 하지 않는 모든 줄을 시작으로 탭을 필터만 실제 라이브러리입니다.가 sort | uniq -c
당신이 얻는 각각의 라이브러리와 횟수를 나타내는 횟수가 발생했습니다.)
에 추가할 수 있습니다 sort -g
끝에 얻은 라이브러리기 위해서는 사용할 수 있습니다.
참고로 당신은 아마 라인은 두 비 라이브러리인으로 위의 명령입니다.중 하나는 정적 파일("지 않는 동 실행")그리고 한없이 모든 라이브러리입니다.후자는 결과 linux-gate.so.1
하지 않은 라이브러리에서 당신의 파일 시스템만"제공"의 커널이다.
ubuntu 인쇄 패키지에 관련된 실행
ldd executable_name|awk'{print$3}'|xargs dpkg-S|awk-F":"'{print$1}'
하나 더 많은 옵션을 선택할 수 있습니다 그냥 읽어보 파일의 위치
/proc/<pid>/maps
예를 들어 프로세스 id2601 다음 명령입니다
cat /proc/2601/maps
과이
7fb37a8f2000-7fb37a8f4000 r-xp 00000000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37a8f4000-7fb37aaf3000 ---p 00002000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf3000-7fb37aaf4000 r--p 00001000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf4000-7fb37aaf5000 rw-p 00002000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf5000-7fb37aafe000 r-xp 00000000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37aafe000-7fb37acfd000 ---p 00009000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfd000-7fb37acfe000 r--p 00008000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfe000-7fb37acff000 rw-p 00009000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acff000-7fb37ad1d000 r-xp 00000000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37ad1d000-7fb37af1d000 ---p 0001e000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1d000-7fb37af1e000 r--p 0001e000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1e000-7fb37af1f000 rw-p 0001f000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1f000-7fb37af21000 r-xp 00000000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37af21000-7fb37b121000 ---p 00002000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b121000-7fb37b122000 r--p 00002000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b122000-7fb37b123000 rw-p 00003000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
이 게시물에 매우 도움이하는 데 필요한 조사의 종속성 제 3 자로부터 제공된 라이브러리(32 대 64 비트를 실행한 경로(s)).
내가 함께 Q&D recursing bash 기반으로 하는 스크립트'readelf-d'제안에 RHEL6 배포판.
그것은 매우 기본적인 것입니다 테스트는 모든 종속성의 모든 시간이다 경우에도 수하기 전에 테스트되었습니다(i.e 는 매우 자세한).출력이 매우 기본이 너무입니다.
#! /bin/bash
recurse ()
# Param 1 is the nuumber of spaces that the output will be prepended with
# Param 2 full path to library
{
#Use 'readelf -d' to find dependencies
dependencies=$(readelf -d ${2} | grep NEEDED | awk '{ print $5 }' | tr -d '[]')
for d in $dependencies; do
echo "${1}${d}"
nm=${d##*/}
#libstdc++ hack for the '+'-s
nm1=${nm//"+"/"\+"}
# /lib /lib64 /usr/lib and /usr/lib are searched
children=$(locate ${d} | grep -E "(^/(lib|lib64|usr/lib|usr/lib64)/${nm1})")
rc=$?
#at least locate... didn't fail
if [ ${rc} == "0" ] ; then
#we have at least one dependency
if [ ${#children[@]} -gt 0 ]; then
#check the dependeny's dependencies
for c in $children; do
recurse " ${1}" ${c}
done
else
echo "${1}no children found"
fi
else
echo "${1}locate failed for ${d}"
fi
done
}
# Q&D -- recurse needs 2 params could/should be supplied from cmdline
recurse "" !!full path to library you want to investigate!!
출력을 리디렉션은 파일과 grep 위해'발견'또는'하지 못했습니다.'
을 사용하고 수정하에서 자신의 위험 물론,습니다.