Основы CS: Понимание пакетов данных, протоколов, Wireshark - PullRequest
3 голосов
/ 16 июня 2011

Квест

Я пытаюсь связаться с SRCDS-сервером из node.js по протоколу RCON . Протокол RCON кажется достаточно объясненным, реализации можно найти внизу сайта на всех основных языках программирования. Использовать их достаточно просто, но понимание протокола и разработка библиотеки JS - вот что я намеревался сделать.

Фон

Будучи программистом-самоучкой, я пропустил много основ компьютерных наук - узнал только то, что мне было нужно, чтобы выполнить то, что я хотел. Я начал программировать с помощью PHP, в конце концов сосредоточился на OO, общался с базами данных и т. Д. В настоящее время я программирую на JavaScript, более конкретно занимаюсь веб-вещанием с помощью node.js ..

Двоичные данные?!?!

Я прочитал и понял абсолютные бинарные основы. Но когда дело доходит до пакетных данных, я полностью теряюсь. Я хотел бы прочитать и понять вывод wireshark, но я не могу иметь никакого смысла, если это. Моя самая большая проблема, вероятно, в том, что я не понимаю, как выглядит двоичное представление различных INT и STRING (char ..) из JS и как я преобразовываю данные, полученные с сервера, во что-то пригодное для использования в программе.

Помощь

Так что я был бы более чем признателен, если бы кто-нибудь указал мне учебник по этим темам. Учебное пособие, как в «объяснении, которое могут понять простые смертные, предпочтительно не написанное профессором С.С.». :) Когда я смотрю на справочную реализацию PHP, я вижу (слишком много) магию, которая не может быть переведена в JS. Отправка и чтение данных из сокета не проблема, но мне нужно знать, как работает функция распаковки PHP, и как я могу это сделать в JS с помощью node.js.

Так что я надеюсь, что вы видите, чего я пытаюсь достичь здесь. Прежде всего, это понимание всей теории, необходимой для того, чтобы сделать реализацию протокола простой. Но так как я хорошо разбираюсь в языках сценариев, было бы невероятно полезно, если бы кто-нибудь мог немного рассказать мне о HOWTO в PHP / JS.

Большое вам спасибо за ваше время!

1 Ответ

5 голосов
/ 17 июня 2011

Я приветствую стремление к низкому уровню протокола.

Я расскажу вам путь, который я выбрал.Мой подход состоял в том, чтобы использовать клиент и сервер, которые уже говорили по протоколу, и использовать libpcap для анализа.Я создал библиотеку, которая могла распаковать пользовательский протокол, который я анализировал на этом этапе.

Очень полезно начать с таких диаграмм:

TCP Header

Из вики по 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, чтобы захватывать каждый фрагмент данных за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...