Alt-F4 #32 - 操作 Wireshark 2021-04-23
翻译 Ph.X
欢迎来到鲨鱼游弋的第 2⁵ 期 Alt-F4。在这个危险水域中,The-Kool 在最新一集的复杂角中指导我们用好扬声器,比如用作鲨鱼警告系统!然后,Hornwitser 用 Wireshark 进行了一些真正的捕鲨活动,讲述了他如何追踪游戏中遇到的网络问题的故事。拿起鱼叉,跳下水吧!
复杂角:扬声器 The Kool
欢迎回到复杂角,在这里我们将对游戏中较少使用或较复杂的机制进行梳理,为不熟悉这些机制的人做个介绍。在这篇文章中,我们将提出三个问题:“它是什么?”,“它能提供什么效果?”,“它应该用在哪里?”。
它是什么?
程控扬声器是个只占一格“建筑”。当连接到一个电路时,它可以根据该电路上的信号发出你将在游戏中听到的声音。你可以调整音量,为它选择一个特定的声音,告诉它无论你在多远的地方都能听到,甚至在地图上显示一个自定义警报。扬声器是通过电路技术解锁的,这在科技树中是如此之早甚至可能是你的第一个绿色科技。
它能提供什么效果?
它能响!好吧,这句话有点废话。虽然扬声器因为用它们建造的乐器而闻名,但也有着一些实际用途。如果你把扬声器连接到你的工厂,并设置全局播放和警报图标,你就可以为任何事情设计自定义警报。你可以(而且应该!)给它一个自定义的图标和名字,因为你绝对会忘记这个响亮的警报器是用来干什么的。这是一个在整个工厂广播警报的简单方法,能够帮助你在小麻烦变成真正的大问题之前抓住警告信号。
它应该用在哪里?
你是否曾经历过意外的电力不足,使你的煤矿采矿机放慢速度,导致你的锅炉燃料不足,最终进入停电的螺旋?试着在通往锅炉的运煤传送带旁放一个扬声器,用一根线缆将它与运煤带连接起来。一格完整的传送带可容纳 8 件物品,所以如果你将扬声器设置为在少于 8 块煤时触发,这样当你的煤传送带出现任何空隙时,你将得到一个警报。将这个警报设置为全局播放,并给它起个名字,如“检查你的采煤情况!”,那么无论你在哪里,或者正在分心做什么,你都会收到通知。
另一个完全不同类型的报警器是列车靠近警报。将扬声器连接到你可能穿过的铁路的信号灯上,再加上每个方向的一个信号(确保你得到铁路两边的信号)。告诉它,如果任何一个信号灯是黄色的(黄色信号灯的数量 > 0),就发出本地警报。下次你走向那条铁轨时,如果有列车正驶过来,你就会听到一个响亮的警报,告诉你前先等一下再过马路!
像异星工厂中的许多其他东西一样,扬声器有着无限的用处,无论是在实用性还是创造性方面。构建的范围从上面显示的超简单,到超复杂的 MIDI 播放器甚至更多。我希望这能激励你想出一些自己的主意,并帮你省去一些麻烦。在那之前,我们工厂车间见……注意脚下!
分析异星工厂的 Wireshark 剖析器 Hornwitser
这是一个大约在 Gridlock Cluster 活动期间开始的项目。我当时正在调查客户端从游戏中随机退出的一些问题,这促使我开始使用 Wireshark 来追踪和检查数据包。这些数据包大多是捕获自计算机的网卡所收发的二进制记录。为了理解这些二进制数据的含义,Wireshark 用协议剖析器对其进行解码,它支持横跨网络各个方面的协议编码。但是它并没有提供异星工厂的剖析器,所以当我在异星工厂流量上使用 Wireshark 时,我只能看到服务器和客户端之间发送的十六进制乱码。
在看了服务器和客户端之间来回的字节后,我想知道:写一个 Wireshark 剖析器来解码这些数据能有多难?我研究了一下,发现最简单的方法是用 Lua 来写,然后可以作为一个插件由 Wireshark 加载,这个系统和异星工厂的 mod 没多大区别。就这样,我开始盯着十六进制的字节,弄清楚它的结构。要弄清楚每个字节的含义并将其解码到 Wireshark 变成了一项个人挑战。我想我在剖析器上工作了大约两个星期,然后放弃了。
这并不是说我做不到。它只是不值得我付出所有的努力。你看,剖析器的输出在告诉你究竟发生了什么事方面并不那么那么有用。它看起来像这样:
当然,它可以解码帧和重新组合碎片化的数据包,但除非你碰巧知道那个诡异的、奇怪的、神秘的彩色数据的意义,否则它不会有什么用处。这也是我没有发布这个剖析器的原因之一。它比看十六进制数据要好,但也好不到哪儿去。它不能让你深入了解异星工厂协议的内部运作情况,而这是你从 Wireshark 的其他协议剖析器中所预期得到的。于是,这个项目就被我束之高阁,不再关注了。
在过去,异星工厂开发者 Twinsen 在 FFF #196 中谈到了制作一个 Wireshark 剖析器。这篇文章包含了很多关于协议的内部信息,我本可以在制作我的剖析器时使用这些信息,但我选择不,因为我想在制作我的剖析器时不依赖游戏源代码的内部信息。不过,一个明显的问题冒出来了:为什么 不 使用 Twinsen 的剖析器而要自己写一个呢?嗯,首先,它不是公开的,但更重要的是,它 不能 被公开。Twinsen 的剖析器的工作方式是将异星工厂构建为一个共享库,然后再构建一个链接到该共享库的自定义 Wireshark。现在,Wireshark 是根据 GPL 授权的,你不允许分发与私有代码链接的 GPL 代码,所以要分发这个剖析器,Wube 必须根据 GPL 发布异星工厂,而这显然是不可能的。
不过几周前,我意识到了一些事情。Windows 版本的异星工厂带有一个包含调试符号的 .pdb
文件。当游戏崩溃时,开发者用它来生成符号化的堆栈跟踪,这样他们就可以看到崩溃发生在源代码的哪个位置。但幸运的是,它还塞满了其他类型的调试数据,比如将调试器连接到异星工厂并检查存储在内存中的变量值所需的那种。这意味着它包含了类型信息,也就是代码中定义的数据结构,以及字段和枚举的名称。字段名是非常有用的,因为它是开发人员放在一块数据上的标签,以便在代码中引用它。同样地,枚举名包含逻辑名称与数值的映射。
我用 ‘cvdump.exe’ 工具将这种类型的信息从 .pdb
文件中转储为可读的东西。一旦我有了这些信息,就很容易从 .pdb
文件中找到结构的名称,并重新命名我的剖析器中的所有字段以使用它们。我还可以让枚举定义将数字值转换为使用它们的字段的逻辑名称。在我对代码和数据表述进行了一些整理后,剖析器的输出看起来像这样:
现在不需要再猜测“Odd Blue”值是什么:显然它是一个 InputActionSegment
的 id
。这个类型被从机器码的 0xa2
翻译成更友好的名称 ServerCommand
。使用游戏中的数据来创建剖析器的唯一问题是,它不再是我的原创作品,这使分发它的合法性受到质疑。我没有试图弄清楚版权法是否站在我这边,而是去问了问异星工厂的开发者,他们说他们对我公开发布这个东西没有意见。因此,如果你想自己尝试一下,或者把它添加到你的工具箱中,你可以在我的 GitHub 仓库中找到它。
就我个人而言,我曾用它来调查异星工厂的网络问题,从客户端连接被断开到 NAT 打洞无效。我还根据我的发现写了一些 Bug 报告并最终在游戏中得以修复。随着使用异星工厂调试符号中的名称,它所显示的数据已经变得非常清晰和丰富,至少与以前相比是这样的。但它仍然是一个针对计算机网络和异星工厂内部有经验的人所设计工具,所以如果你不熟悉这些东西,不必指望能理解这些东西的所有含义。
征稿
一如既往的,我们正在召集任何想要为 Alt-F4 做出贡献的人,无论是提交文章还是帮助翻译都可以。如果您有些有趣的想法,并乐于与社区分享,这里就是一个好地方。如果您没有太大把握,我们会很乐意帮助您讨论内容创意和结构问题。如果您有意参与,从加入 Discord 开始吧!