CS基础知识:了解数据包,协议,Wireshark

ash*_*iso 3 javascript protocols binary-data wireshark node.js

任务

我正试图通过RCON协议从node.js与SRCDS服务器通信.RCON协议似乎已经足够解释,可以在每个主要编程语言的网站底部找到实现.使用它们很简单,但理解协议和开发JS库是我打算做的.

背景

作为一名自学成才的程序员,我跳过了很多计算机科学基础知识 - 只学习了我需要的东西,完成了我想要的东西.我开始使用PHP进行编码,最终围绕OO,与数据库等进行了交谈.我目前正在使用JavaScript进行编程,更具体地说是使用node.js进行Web编写.

二进制数据?!?!

我已阅读并理解绝对二进制基础知识.但是当谈到数据包数据时,我完全迷失了.我想阅读并理解wireshark输出,但是如果它没有任何意义.我最大的问题可能是我不明白JS的各种INT和STRING(char ..)的二进制表示是什么样的,以及我如何将从服务器获得的数据转换为程序中可用的东西.

救命

如果有人能指点我这些主题的教程,我将不胜感激.教程,如"只有凡人才能理解的解释,最好不是由CS教授写的".:)当我看到PHP参考实现时,我看到(太多)魔术发生在那里我无法翻译成JS.从套接字发送和读取数据没有问题,但我需要知道PHPs解包函数如何分别如何在JS中使用node.js.

所以我希望你能看到我在这里想要完成的事情.首要的是理解实现协议所需的整个理论.但是因为我只使用脚本语言,如果有人可以在PHP/JS的HOWTO部分中指导我,那将会非常有用.

非常感谢您的参与!

Jos*_*osh 5

我赞赏低级协议的追求.

我会告诉你我走的路.我的方法是使用已经讲过协议的客户端和服务器,并使用libpcap进行分析.我创建了一个库,能够解压缩我在此阶段分析的自定义协议.

从这样的图表开始,它非常有用:

TCP标头

来自TCP上的wiki.它是一种非常有用的可视化二进制数据结构的方法.它紧密包装,所以切片分开需要注意细节.

缓冲区和二进制文件

我读了Buffer.它是你在节点中处理二进制的方式.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的"unpack"代码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类型,比如说Number或String.他们将使用先进的技术来实现这一点 - 像移位这样的按位操作.你不一定需要理解这一切.

关键是:

1)字节顺序 - 位的排序(网络和主机字节顺序可以相互反转),因为这与事物的解包方式有关

2)Javascript Number表示是古怪的 - node-ctype在关于如何在javascript的Number中转换各种数字类型的注释中详细说明.整数,浮点数,双精度等都是javascript中的数字.

最后,如果你只是为了你的冒险而使用这些拆包机,它可能会很好.我最终不得不解压这些库中未涵盖的东西,比如GUID等,这对研究源非常有帮助.

隔离您正在查看的流量

过滤,过滤,过滤.定位一个主机.瞄准一个方向.定位一种消息类型.专注于首先剥离具有已知固定长度的数据 - 通常协议中的标头是一个好的起点.一旦你从二进制文件中解压缩到一个漂亮的json结构中,你就可以了.

之后,它一次一个字段,从上到下,一次一条消息.您可以使用Buffer#slice和node-ctype中的解包函数一次抓取每个数据.