C. S. Основы: Понимание Пакетов Данных, Протоколов, Wireshark


Задание

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

Фон

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

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

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

Помощь

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

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

1 3

1 ответ:

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

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

Очень полезно начать с диаграмм, подобных этой:

заголовок TCP

Из вики по 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

Я прочитал весь код "распаковки" мранни. 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

Теперь, когда вы просматриваете эти материалы, нужно кое-что запомнить. Большую часть времени они принимают двоичное представление буфера и преобразуют его в собственный тип javascript, например, число или строку. Они будут использовать передовые технологии методы для этого - побитовые операции, такие как сдвиги и тому подобное. Вам не обязательно все это понимать.

Ключевые вещи:

1) конечность-порядок битов (порядок байтов сети и хоста может быть обратным друг от друга), поскольку это относится к тому, как вещи распаковываются

2) представление чисел Javascript является причудливым - node-ctype подробно описывает, как они преобразуют различные типы чисел в число javascript. Целое число, с плавающей точкой, двойной и т. д., Все числа в JavaScript земли.

В конце концов, это, вероятно, хорошо, если вы просто используете эти распаковщики для ваших приключений. В конце концов мне пришлось распаковывать вещи, которые не были охвачены в этих библиотеках, такие как GUID и т. д., И это было чрезвычайно полезно для изучения источника.

Изолируйте трафик, на который вы смотрите

Фильтр, фильтр, фильтр. Цель один хозяин. Цельтесь в одном направлении. Выберите один тип сообщения. Сосредоточьтесь на удалении данных, которые имеют известную фиксированную длину во-первых, часто заголовок в протоколе является хорошим местом для начала. Как только вы получите заголовок, распакованный в красивую структуру json из binary, вы хорошо продвинетесь.

После этого его одно поле за раз, сверху вниз, одно сообщение за раз. Вы можете использовать Buffer#slice и функции распаковки из node-ctype для захвата каждого фрагмента данных одновременно.