Como encontrar tipos de arquivos executáveis?

7

Eu quero encontrar tipos de arquivos que sejam executáveis do ponto de vista do kernel. Tanto quanto eu sei todos os arquivos executáveis no Linux são arquivos ELF. Assim, tentei o seguinte:

find * | file | grep ELF

No entanto, isso não funciona; Alguém tem outras ideias?

    
por JohnnyFromBF 05.06.2012 / 16:24

7 respostas

9

Edição posterior: só este faz o que o jan precisa: obrigado huygens;

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

    
por 05.06.2012 / 16:56
2

Eu procuraria por arquivos regulares primeiro, pois executáveis binários pertencem a esse tipo de arquivo.

Então eu solicito para cada arquivo regular o tipo mime e se ele corresponder ao aplicativo / x-executável, então é um arquivo executável binário (que deve corresponder aos arquivos executáveis do Linux, um por exemplo match application / x-dosexec).

find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"

Tentando esse comando, encontrei uma discrepância com find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF . Parece que o comando file está com bugs e detecta o executável ELF como objeto compartilhado ELF. Portanto, mesmo que o comando seja teoricamente correto, na prática ele está incompleto.

Portanto, temos que procurar por executáveis ELF e objetos compartilhados, mas excluir todos os arquivos com o nome * .so e .so.

find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"

Provavelmente não é perfeito, mas é bem perto disso.

    
por 05.06.2012 / 17:23
1

Dê uma olhada no -executable flag de find .

    
por 05.06.2012 / 16:29
1

Solução alternativa que não usa file e readelf , para aqueles em sistemas limitados (por exemplo, incorporados):

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

Basicamente, geramos os primeiros quatro bytes com hexdump e os usamos como uma assinatura . Podemos, então, grep todos os arquivos do tipo ELF usando sua assinatura 7f454c46 .

Ou, como 7f é o excluir caractere e 45 , 4c , 46 bytes são E , L , F caracteres respectivamente, também poderíamos usar:

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

Além disso, você pode usar head em vez de hexdump neste caso:

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF
    
por 27.09.2018 / 13:36
0

Como outros, quero responder também. Minha resposta é baseada no uso do utilitário find também, mas tenho uma ideia, que é diferente de outras respostas. Baseada nesse fato, o -exec pode ser usado como critério de pesquisa também. Agora, tendo isso em mente, podemos refatorar todas as propostas anteriores para esta:

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

Ou seja. movemos o grep para o -exec .

O que isso nos dá, você pode perguntar? Podemos usar a flexibilidade do -print e outros do utilitário find . Por exemplo, podemos formatar uma saída em nosso gosto ou usar o -print0 e redirecionar uma saída para algum script, etc.

    
por 05.06.2018 / 22:43
0

Acho que isso responde à pergunta original se a intenção deles era encontrar arquivos executáveis binários garantindo que cada correspondência tenha um cabeçalho de elf.

Ele classifica os arquivos com base no tipo -executable e, em seguida, executa os resultados por meio de um shell separado que chama readelf -l , que canaliza para o grep e corresponde silenciosamente aos cabeçalhos que são explicitamente executable . Qualquer coisa que passar nesse teste é passada para printf da saída.

O bit pwd exibe o caminho completo.

find 'pwd' -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;
    
por 25.06.2018 / 01:46
-2
find -type f -exec file {} \; | grep ELF | grep executable | cut -d: -f1
    
por 12.07.2015 / 14:11