Kaitai Struct - инструмент для описания структуры бинарных файлов, основная особенность которого в декларативном подходе, когда формат файла задаётся не командами на скриптовом языке (перейти туда-то, считать столько-то байт и т.д.), а определением каждого поля (это - двойное слово, это - строка и т.д.) на подмножестве языка YAML. Описание затем можно скомпилировать в модуль для конкретного языка, от C++ до JavaScript, и использовать в своей программе как чёрный ящик.
Например, так может быть описан TCP пакет:
tcp_segment.ksy
После компиляции командойCode:meta: id: tcp_segment endian: be seq: - id: src_port type: u2 - id: dst_port type: u2 - id: seq_num type: u4 - id: ack_num type: u4 - id: b12 type: u1 - id: b13 type: u1 - id: window_size type: u2 - id: checksum type: u2 - id: urgent_pointer type: u2 - id: body size-eos: trueполучаем TcpSegment.pm. Чтобы распарсить дамп пакета, импортируем в скрипте модуль, создаём объект и извлекаем всю интересующую информацию:Code:ksc -t perl tcp_segment.ksy
parse_tcp_segment.pl
Вывод:Code:use strict; use warnings; use TcpSegment; my $kaitai_tcp = TcpSegment->from_file("segment.dmp"); print "src_port = ", $kaitai_tcp->src_port(), ", dst_port = ", $kaitai_tcp->dst_port(), ", body = '", unpack('H*', $kaitai_tcp->body()), "'\n";
Если нужный вам язык не поддерживается, то можно самостоятельно написать рантайм и сообщить об этом на гитхабе - автор работает очень быстро.Code:src_port = 43690, dst_port = 48059, body = 'ae85fa908ec1246f'
Ссылки:
http://kaitai.io/
https://github.com/kaitai-io



Reply With Quote
Thanks