Se os dados do arquivo começarem com uma certa sequência hexadecimal, execute o comando strings no arquivo

0

Eu quero rastrear recursivamente um diretório e se o arquivo tiver \x58\x46\x53\x00 como os primeiros 4 bytes, eu quero executar strings no arquivo.

    
por sp334 20.04.2017 / 08:54

3 respostas

1
h_signature=$(echo 58465300 | tr 'a-f' 'A-F')
read -r x a b x <<<$(od --endian=big -N 4 -t x2 yourfile | tr 'a-f' 'A-F')
case "$a$b" in "$h_signature" ) strings yourfile ;; esac

Meth-2:

dd if=yourfile count=4 bs=1 2>/dev/null |
perl -lpe '$_ = uc unpack "H*"' | xargs test "$h_signature" = && strings yourfile

Meth-3:

head -c 4 yourfile | xxd -ps -g 4 | grep -qwi "$h_signature" && strings yourfile
    
por 20.04.2017 / 09:29
2

Se você é um tipo de arquivo que você usa regularmente, eu o definiria no seu ~/.magic (ou mesmo no arquivo mágico do sistema):

0 long 0x00534658 XFS-file

(supondo que você esteja em um pequeno sistema endian). Agora você pode testar com o comando file :

$ file testfile
testfile: XFS-file

E você pode fazer isso para testes:

if [[ 'file -b testfile' == XFS-file ]]; then strings testfile; fi
    
por 20.04.2017 / 09:56
1

Para ver se os primeiros quatro bytes de um arquivo são a string específica XFSod -N 4 -a (à qual corresponde a sequência de bytes hexadecimais na pergunta):

if od -N 4 -a file | grep -qF 'X   F   S nul'; then
    strings file
fi

grep -qF converterá os primeiros quatro bytes do arquivo em seu formato de exibição de um byte. Usamos od para testar a saída de od -N 4 em relação ao que estamos procurando.

Em uma máquina little-endian, você pode usar 043130 000123 sem nenhum sinalizador adicional e, em vez disso, grep para %code% .

Alternativamente:

if od -N 4 -A n -c file | tr -d ' ' | grep -qF 'XFS
if od -N 4 -a file | grep -qF 'X   F   S nul'; then
    strings file
fi
'; then strings file fi
    
por 20.04.2017 / 09:42