Como ler um byte hexdump por byte no bash ou awk?

2

Esta é a saída hexadecimal de um pacote TCP IPv6 capturado com tcpdump :

 6000 0000 0018 0620 0000 0000
 0000 0000 0000 0000 0000 0001 0000 0000
 0000 0000 0000 0000 0000 0002 *0026 0026
 0000 0001 0000 0002 {5}412 0065 0034 0000*
 6162 6364    

O pacote em si está entre os * s acima. O {5} representa o comprimento do pacote em palavras de 32 bits (então são 5 palavras de comprimento - 20 bytes). Eu preciso extrair o cabeçalho tcp desta informação usando um script bash / awk, então o script precisa encontrar o tamanho do byte e usá-lo para saber o quanto mais vai ler. Como posso fazer isso no bash ou no awk?

    
por Udit Gupta 22.10.2011 / 19:13

1 resposta

1

Este é mais um trabalho para Perl ou Python, mas você pode fazê-lo com puro bash. Aviso: não testado.

ipv6_packet='6000 … 6364'
ipv6_packet=${ipv6_packet,,?}               # normalize hexadecimal digits to lowercase, just in case
ipv6_packet=${ipv6_packet//[!0-9a-f]/}      # remove whitespace and everything else that isn't a hex digit
tcp_packet=${ipv6_packet:80}                # all but the first 40 bytes (IPv6 header)
((tcp_data_offset=0x${tcp_packet:24:1}*4))  # data offset (25th nybble), converted from words to bytes
tcp_header=${tcp_packet:0:$tcp_data_offset} # that's the TCP header (still in hexdump form)

Ou para breve:

ipv6_packet=${ipv6_packet,,?}; ipv6_packet=${ipv6_packet//[!0-9a-f]/}
tcp_header=${ipv6_packet:80:$((0x${ipv6_packet:104:1}*4))}
    
por 22.10.2011 / 20:47