Я приветствую стремление к низкому уровню протокола.
Я расскажу вам путь, который я выбрал.Мой подход состоял в том, чтобы использовать клиент и сервер, которые уже говорили по протоколу, и использовать libpcap для анализа.Я создал библиотеку, которая могла распаковать пользовательский протокол, который я анализировал на этом этапе.
Очень полезно начать с таких диаграмм:
Из вики по TCP.Это невероятно полезный способ визуализации структуры двоичных данных.Он плотно упакован, поэтому его разделение требует внимания к деталям.
Буферы и двоичные файлы
Я читал о буфере.То, как вы работаете с двоичным в узле.http://nodejs.org/docs/v0.4.8/api/buffers.html - первое, что здесь нужно понять, это то, что буферы могут быть доступны побитово с помощью синтаксиса массива, то есть буфер [0] и т. Д.
Визуализация
Это полезночтобы иметь возможность выгружать ваши двоичные данные в шестнадцатеричное представление.Для этого я использовал https://github.com/a2800276/hexy.js.
node_pcap
Я схватил https://github.com/mranney/node_pcap - это эквивалентно wireshark, но вы можете программно тыкать во все исходящиеи входящий трафик.Я добавил поддержку полезной нагрузки udp: https://github.com/jmoyers/node_pcap/commit/2852a8123486339aa495ede524427f6e5302326d
Я прочитал код распаковки всех Mranney https://github.com/mranney/node_pcap/blob/master/pcap.js#L116-171
Я нашел https://github.com/rmustacc/node-ctype
Я прочитал все их "распаковать "код https://github.com/rmustacc/node-ctype/blob/master/ctio.js
Теперь, что нужно помнить, когда вы просматриваете этот материал.В большинстве случаев они принимают двоичное представление Buffer и конвертируют его в собственный тип javascript, например, Number или String.Для этого они будут использовать передовые методы - побитовые операции, такие как сдвиги и тому подобное.Вам не обязательно понимать все это.
Ключевыми вещами являются:
1) endianness - порядок битов (порядок байтов сети и хоста может быть обратным друг другу), поскольку это относится к распаковке вещей
2) Представление чисел в Javascript является странным - node-ctype подробно рассказывает в комментариях о том, как они преобразуют различные типы чисел в Number в javascript.Целое число, число с плавающей запятой, двойное число и т. Д. - все это число в javascript land.
В конце концов, вполне возможно, что вы просто используете эти распаковщики для своих приключений.В итоге мне пришлось распаковать вещи, которые не были описаны в этих библиотеках, такие как GUID и т. Д., И было чрезвычайно полезно изучить источник.
Изолировать трафик, на который вы просматриваете
Фильтр, фильтр, фильтр.Таргетинг на одного хоста.Таргетинг в одном направлении.Выберите один тип сообщения.Сосредоточьтесь на удалении данных, которые сначала имеют известную фиксированную длину - часто заголовок в протоколе - хорошее место для начала.Как только вы получили заголовок, распаковывающийся в хорошую структуру json из двоичного файла, вы уже в пути.
После этого по одному полю за раз, сверху вниз, по одному сообщению за раз.Вы можете использовать Buffer # slice и функции распаковки из node-ctype, чтобы захватывать каждый фрагмент данных за раз.