20

我计划为游戏编写一个自动机器人。

棘手的部分是弄清楚他们如何编码他们的协议......要让机器人四处奔跑很容易,只需让角色运行并记录它在wireshark中所做的事情。但是,解释环境更加困难......如果您空闲,它每秒会收到大约 5 个数据包,因此会有很多垃圾。

我的计划:因为游戏是在 TCP 下运行的,所以我会使用 freecap ( http://www.freecap.ru/eng ) 来强制游戏连接到我机器上运行的代理。我需要这个代理能够进行数据包注入,或者可能需要一个能够重新发送捕获的数据包的服务器。通过这种方式,我可以重新创建和修改服务器发送的内容,并了解它们的协议编码。

  1. 有谁知道我在哪里可以获得允许数据包注入的代理或我可以在哪里执行数据包注入(不是通过硬件,就像无线或任何东西一样!)
  2. 我在哪里可以找到重新发送捕获的数据包的服务器/代理(即:重放连接)。
  3. 有更好的模式匹配工具或方法吗?可以从多条消息中突出显示模式的东西会很棒。

或者,有没有更好的方法在这里破译这个?可能是一个反汇编策略(通过挂钩一个winsock函数并从那里开始反汇编)?我以前没有这样做过,所以我不确定。或者,还有其他想法吗?

4

5 回答 5

20

网络流量拦截和协议分析通常是一种不太受欢迎的方法来实现您的目标。对于大多数现代游戏来说,加密是一个严重的因素,并且对于最常见的游戏场景的任何但微不足道的因素的协议分析都存在严重的问题。

您尝试做的大多数现代实现*都依赖于读取和操作正在运行的客户端的内存空间和进程。客户端已经为您完成了所有困难的部分,包括解密流量并将其分类为更易于阅读的数据结构。为了与服务器交互,您可以调用内置于客户端的函数,而不是从头开始制作整个系列的数据包。这种方法的优点是您需要做的工作要少得多来解释数据和产生活动。缺点是网络流量中通常有一些对机器人有用但被客户端丢弃的数据,或者您可能希望将流量发送到客户端无法生成的服务器(在我自己的情况下) -为此制定的层次结构,比“作弊”更进一步

*...我说这已经看到了大多数 MMORPG botting/hacking 社区从ShowEQOdin's Eye / Excalibur等网络协议分析器到MacroQuestInnerSpace等基于内存的应用程序的演变。关于这一点,InnerSpace 为您正在尝试的基于内存/进程的变体提供了一个出色的可扩展框架,如果您放弃网络分析方法,您应该将其作为您项目的基础。

于 2009-02-12T03:01:15.017 回答
14

正如我过去做过一些游戏机器人(当然是为了好玩,而不是为了盈利或悲伤——写游戏机器人很有趣),我推荐以下内容:

  • 如果您可以编码并且没有作弊保护阻止您这样做,我强烈建议您编写注入的 DLL,原因如下:
    1. 您的 DLL 将能够直接访问游戏的内存空间,并且一旦您对数据结构进行逆向工程(通过查看内存或通过代码反汇编),您将可以访问大量数据。这也将允许您绕过游戏可能具有的任何网络加密。直接访问进程内存的缺点是偏移量和数据结构在版本之间会发生变化 - 但是,数据结构不会在稳定的游戏中经常更改,您可以通过搜索代码模式而不是使用固定偏移量来补偿偏移量变化。
    2. 无论哪种方式,您仍然可以使用 API 挂钩来挂钩 WinSock 函数(查看 Microsoft Detours 和优秀但现已商业化的 madCodeHook)。
  • 否则,我只能建议您尝试像 WPE Pro 这样的实时/交互式数据包编辑器。

在大多数情况下,最酷的方法(代码逆向工程和直接内存访问)往往效率最低。他们需要大量的技能(理解代码)和时间,无论是最初(遍历所有代码并开发代码以与数据结构交互)和维护(以防游戏正在更新)。(当然,他们有时确实允许做一些官方客户端不可能做的酷事情,但大多数时候这很明显是公然的作弊,很可能会很快吸引GM)。大多数时候,机器人是通过用纯色替换游戏图形/纹理来制作的,并创建简单的“像素”机器人,在屏幕上搜索某些颜色并做出相应的反应(例如点击它们)。

希望这会有所帮助,并记住 - 作弊只有在不会让其他人的游戏变得不那么有趣的情况下才是有趣的;)

于 2009-02-27T18:50:46.130 回答
3

A) 我玩 MMO,不支持机器人,投反对票... B) 下载 Backtrack v.3,在您的默认网关和主机上运行 arpspoof。有一个应用程序会欺骗远程主机的 SSL 证书 sslmitm(我相信是名称),然后您可以通过主机创建完整连接。然后启动 tcpdump/ethereal/wireshark(选择你的 pcap 毒药)并四处走动做一些随机的事情来找出什么数据包在做什么。那将是你最大的挑战;但是代理中间人攻击自己是要走的路。

C) 我不容忍这种活动,这些信息仅作为免费信息提供。

于 2009-02-12T02:59:23.697 回答
3

您可以做出一些合理的假设,这些假设可以极大地简化您的任务。但是,要充分利用它们,您可能需要比听起来更舒服的袖子卷起编程。

首先,可以肯定的是,他们使用的加密属于以下三个类别之一:

  • 没有任何
  • 俗气
  • 比你可能破解的要好得多

中间情况的几率非常低。

接下来,可以肯定的是,数据包在程序边缘附近(就在它们进入时,就在它们出去之前)​​被加密/解密,并且游戏主体以解密的形式处理它们。

最后,他们使用的协议很可能包括

  • 带有数据块的 ascii
  • 二进制胶

因此,使用设置为混杂模式的卡对未加密的 ascii 进行小数据包嗅探。如果你看到一些,很好,你已经领先了。但是,如果您不放弃整个轻敲线的想法,而是开始跟踪代码,因为它通过断点和调试器单步执行从发送数据返回。图最外层或三层将是标准网络的东西,然后是加密层,除此之外还有大量处理未加密协议的东西。

如果你很热,你应该可以在一个小时内做到这一点,如果你相当熟练、积极和勤奋,你应该可以在一个周末完成,如果你没有希望的话,永远不会。但原则上(而且在实践中无疑更容易)这样做是可能的。

一旦你到达看起来像未加密的粘性的东西进来,被混杂,混杂的形式消失的地方,然后开始担心它意味着什么。

——马库斯

于 2009-03-03T05:20:31.973 回答
0

听起来好像没有加密,所以你可以做一个网络方法。

一个很好的起点是查找数据包 ID - 大多数情况下,靠近数据包前面的东西将是数据包类型的 ID。例如移动可以是 1,射击可以是“2”,聊天可以是“4”。

您可以编写自己的代理,在一个端口上侦听您的游戏连接,然后连接到服务器。您可以对您的代理进行按键触发命令,或者您可以让您的代理写出调试信息以帮助您更进一步。

(我已经用 PHP 为在线游戏编写了一个机器人 - 最重要的是。)

于 2009-03-05T21:47:14.237 回答