실행 파일 형식을 찾는 방법은 무엇입니까?

실행 파일 형식을 찾는 방법은 무엇입니까?

커널 관점에서 실행 가능한 파일 형식을 찾고 싶습니다. 내가 아는 한 Linux의 모든 실행 파일은 ELF 파일입니다. 그래서 다음을 시도했습니다.

find * | file | grep ELF

그러나 이것은 작동하지 않습니다. 다른 아이디어가 있는 사람이 있습니까?

답변1

나중에 편집: 이것만 jan의 요구 사항을 충족할 것입니다. 감사합니다 Huygens;

find . -exec file {} \; | grep -i elf

답변2

제한된(예: 임베디드) 시스템의 시스템의 경우 file다음을 사용하지 않는 대체 솔루션:readelf

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

기본적으로 처음 4바이트를 출력하고 hexdump이를 다음과 같이 사용합니다.징후. 그런 다음 모든 유형의 파일을 grep할 수 있습니다.매우 낮은 주파수서명을 사용하십시오 7f454c46.

아니면 7f그렇기 때문에문자 삭제, , 45, 4c, 바이트는 46각각 E, L, 문자입니다 F.

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

또한 이 경우 다음을 head사용할 수 있습니다.hexdump

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF

답변3

다른 사람들처럼 나도 대답하고 싶었습니다. 내 대답도 해당 유틸리티 사용을 기반으로 find하지만 다른 답변과 다른 아이디어가 있습니다. 이는 -exec검색 기준으로도 사용될 수 있다는 사실에 기초합니다 . 이제 이를 염두에 두고 이전 제안을 모두 다음으로 리팩토링할 수 있습니다.

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

즉, grep로 이동했습니다 -exec.

당신은 이렇게 물을 수도 있습니다. 이것이 우리를 어디로 떠나게 합니까? 우리는 이것 -print과 다른 유틸리티 의 유연성을 활용할 수 있습니다 find. 예를 들어 원하는 대로 출력 형식을 지정하거나 -print0출력을 사용하여 스크립트로 리디렉션할 수 있습니다.

답변4

원래 질문이 다음을 참조한다고 가정합니다.매우 낮은 주파수파일만(다른 "커널 관점에서 실행 가능"하지 않음) 더 짧고 더 빠른 대안이 있습니다 find.file

$ scanelf -R /SEARCH/PATH
 TYPE   FILE 
ET_DYN /SEARCH/PATH/library.so
ET_EXEC /SEARCH/PATH/app1
ET_EXEC /SEARCH/PATH/app2

ELF 파일을 재귀적으로 검색하여 각 파일의 대상 파일 유형과 파일 경로를 인쇄합니다.

실행 가능한 ELF 파일만 검색 범위를 좁힙니다: scanelf -EET_EXEC -R /SEARCH/PATH.

배너 및 유형을 억제하고 파일 경로만 유지합니다: scanelf -EET_EXEC -RBF %F /SEARCH/PATH.

관련 정보