我正试图通过SRCDS Server与node.js的RCON Protocol对话。 RCON协议似乎已经足够解释,可以在每个主要编程语言的网站底部找到实现。使用它们很简单,但理解协议并开发JS库是我打算做的。
作为一名自学成才的程序员,我跳过了很多计算机科学基础知识 - 只学习了我需要的东西,以实现我想要的东西。我开始使用PHP进行编码,最终围绕OO,与数据库等进行了交谈。我目前正在使用JavaScript进行编程,更具体地说是使用node.js进行Web编写..
我已阅读并理解绝对二进制基础知识。但是当谈到数据包数据时,我完全迷失了。我想阅读并理解wireshark输出,但是如果它没有任何意义。我最大的问题可能是我不明白JS的各种INT和STRING(char ..)的二进制表示是什么样的,以及我如何将从服务器获得的数据转换为程序中可用的东西。
如果有人可以指点我这些主题的教程,我会非常感激。教程,如“只有凡人才能理解的解释,最好不是由C.S.教授写的”。 :) 当我看到PHP参考实现时,我看到(太多)魔术发生在那里,我无法翻译成JS。从套接字发送和读取数据没有问题,但我需要知道PHPs解包函数如何分别在JS中使用node.js来实现。
所以我希望你能看到我在这里想要完成的事情。首要的是理解实现协议所需的整个理论。但是因为我只对脚本语言很好,所以如果有人可以在PHP / JS的HOWTO部分中指导我,那将会非常有用。
非常感谢您的时间!
答案 0 :(得分:5)
我赞赏低级协议追求。
我会告诉你我走的路。我的方法是使用已经讲过协议的客户端和服务器,并使用libpcap进行分析。我创建了一个能够解压缩我在此阶段分析的自定义协议的库。
从这样的图表开始,它非常有用:
来自TCP上的wiki。它是一种非常有用的可视化二进制数据结构的方法。它紧密包装,所以切片分开需要注意细节。
我读了Buffer。它是你在节点中处理二进制的方式。 http://nodejs.org/docs/v0.4.8/api/buffers.html - 这里要实现的第一件事是缓冲区可以通过数组语法逐位访问,即缓冲区[0]等。
将二进制数据转储为十六进制表示非常有用。我使用https://github.com/a2800276/hexy.js来实现这一目标。
我抓住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
现在,当你仔细研究这些东西时要记住的事情。大多数时候,他们采用二进制缓冲区表示并转换为本机javascript类型,比如说Number或String。他们将使用先进的技术来实现这一点 - 像移位这样的按位操作。你不一定需要理解这一切。
关键是:
1)字节顺序 - 位的排序(网络和主机字节顺序可以相互反转),因为这与解压缩的方式有关
2)Javascript Number表示是古怪的 - node-ctype在关于如何在javascript的Number中转换各种数字类型的注释中详细说明。整数,浮点数,双精度等都是javascript中的数字。
最后,如果你只是为了你的冒险而使用这些拆包机,它可能会很好。我最终不得不解压这些库中没有涉及的东西,比如GUID等,这对研究来源非常有帮助。
过滤,过滤,过滤。定位一个主机。瞄准一个方向。定位一种消息类型。专注于首先剥离具有已知固定长度的数据 - 通常协议中的标头是一个很好的起点。一旦你从二进制文件中解压缩到一个漂亮的json结构中,你就可以了。
之后,它一次一个字段,从上到下,一次一条消息。您可以使用Buffer#slice和node-ctype中的解包函数一次抓取每个数据。