【问题标题】:Deciphering MMORPG Protocol Encoding解密 MMORPG 协议编码
【发布时间】:2010-10-07 02:10:49
【问题描述】:

我打算为游戏编写一个自动机器人。

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

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

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

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

【问题讨论】:

  • 只要确保您没有违反游戏的 TOS。在这个问题的背景下,你的名字很有趣。

标签: encoding reverse-engineering encryption


【解决方案1】:

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

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

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

【讨论】:

  • 读取客户端的内存空间,是破解编码还是运行bot?这个实现的问题是机器人现在需要客户端,以及客户端需要的所有资源(gpu、cpu、整个屏幕、大量内存等)。
  • 您的问题意味着误解。据我所知,没有人能够充分破译闭源 MMO 游戏协议,以实际用独立机器人取代客户端。我见过的每个实现,无论是基于网络还是基于内存,都需要运行原始客户端。
  • 嗯,我见过很多机器人,它们似乎知道周围的环境并知道如何步行到某个位置。我假设他们知道如何查看服务器告诉客户端玩家字符在哪里的 x/y 坐标。
  • 他们从网络流量到客户端或从客户端的内存中读取 x/y 坐标。无论哪种方式,客户端仍在运行。
  • 也许他们运行多个虚拟机,因为通常我会同时看到 4-6 个虚拟机。
【解决方案2】:

由于我过去做过一些游戏机器人(当然是为了好玩,而不是为了利润或悲伤 - 编写游戏机器人很有趣),我建议如下:

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

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

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

【讨论】:

  • 是否可以运行游戏客户端及其所有图形而不将图形显示到屏幕上?因此,您可以运行多个副本 + 原始计算机用户甚至永远不会在屏幕上看到游戏?
  • 当然。您可以使用任意数量的方法,从完全虚拟化开始(在虚拟机中运行每个副本,以获得最佳兼容性),在不同的桌面或终端会话上运行它,或者简单地使用 ShowWindow() 函数隐藏窗口 - 取决于游戏。
  • >如果没有作弊保护阻止你这样做,我不太明白。您是在谈论第三方内存监控程序吗?他们真的工作得很好,可以完全防止这种情况发生吗?还是他们只是将某些程序从内存中列入黑名单?
  • 比较流行的两者兼而有之。他们中的大多数采用了一套通用的保护方法,例如监控 API 函数地址(以阻止 API 挂钩),甚至加载内核模式驱动程序以获得对系统的更高程度的控制。
  • 他们通常还会扫描正在运行的进程以查找某些字符串,以识别他们不希望在您的系统上看到运行的进程(例如调试和逆向工程工具)。
【解决方案3】:

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

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

【讨论】:

  • 我玩了很多 MMO 和支持机器人,反对你的投票。
  • 哈哈,谢谢你的意见;机器人是您可以玩许多 MMO 的原因。但我实际上对这篇文章投了赞成票。我投赞成票的原因是什么?因为我的背景是网络安全,所以我喜欢破坏网络协议。解码协议很有趣!!
  • Suroot -- 什么是分析各种数据包并同时比较它们的好方法......我想我有点像多个文件的无法比较......
  • D) 答应我你不会这样做。 :)
  • @Zombies,我会说使用 tcpdump 并用 ethereal(现在是 Wireshark)读取 .pcap 文件,看看 tcp 流中发生了什么。
【解决方案4】:

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

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

  • 俗气
  • 比你可能破解的要好得多

中间情况的几率非常低。

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

最后,他们使用的协议最有可能由以下任一组成

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

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

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

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

-- MarkusQ

【讨论】:

  • 我在捕获数据包时通过游戏聊天输入了诸如“这是一个测试”之类的短语,并注意到它没有加密。此外,所有数据包的结构都非常相似。
  • 聊天和玩游戏可能在不同的频道,使用不同的协议。
  • RG 是对的,但只要你在进步,就坚持下去。诀窍是正确识别您何时在错误的树上吠叫并尝试其他方法,而不是每次遇到减速带时都放弃。
【解决方案5】:

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

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

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

(我已经用 PHP 编写了一个用于在线游戏的机器人。)

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多