解密MMORPG协议编码

时间:2009-02-12 02:52:43

标签: encoding reverse-engineering encryption

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

棘手的部分是弄清楚他们如何编码他们的协议......为了让机器人运行起来很容易,只需让角色运行并记录它在wireshark中的作用。然而,解释环境更加困难......如果您闲置,它每秒收到大约5个数据包,因此有很多装饰。

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

  1. 有谁知道我在哪里可以获得允许数据包注入的代理或我可以执行数据包注入的地方(不是通过硬件,如无线或其他任何情况!)
  2. 如果我找到重新发送捕获数据包的服务器/代理(例如:重放连接),我将在哪里。
  3. 任何更好的模式匹配工具或方法?可以突出显示来自多个消息的模式的东西将是伟大的。
  4. ,有没有更好的解释方法?可能是一种解决策略(通过挂钩winsock函数并从那里开始反汇编)?我之前没有这样做,所以我不确定。 OR ,还有其他想法吗?

5 个答案:

答案 0 :(得分:19)

网络流量拦截和协议分析通常是在这里实现目标的不太受欢迎的方法。对于大多数现代游戏来说,加密是一个严重的因素,对于最常见的游戏场景中的任何微不足道的因素,协议分析都会产生严重的麻烦。

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

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

答案 1 :(得分:13)

因为我过去做了几个游戏机器人(当然是为了好玩,不是利润或悲伤 - 写游戏机器人很有趣),我推荐以下内容:

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

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

希望这会有所帮助,并且记住 - 作弊只会让游戏对其他人的游戏不那么有趣时才会很有趣;)

答案 2 :(得分:3)

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

C)我不宽恕这项活动,此信息仅作为免费信息提供。

答案 3 :(得分:3)

您可以做出一些合理的假设,这些假设可以极大地简化您的任务。但是,为了充分利用它们,你可能需要更多舒适的袖子卷起编程而不是你的声音。

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

  • 不好的
  • 远比你可能会破解

中间案例的可能性非常低。

接下来,可以肯定的是,数据包在程序边缘附近加密/解密(在它们出去之前就已经加密/解密)并且游戏正文以解密的形式处理它们。

最后,他们使用的协议最有可能是

  • ascii with data blocks
  • binary goo

因此,对于未加密的ascii,使用针对混杂模式设置的卡片进行嗅探。如果你看到一些,很棒,你就领先于游戏。但是,如果你不放弃整个点击线的想法,而是开始关注代码,因为它通过断点和调试器步骤从发送数据返回。图最外层或者三个将是标准网络的东西,然后将来到加密层,除此之外,大量的东西处理未加密的协议。

如果你很热,你应该能够在一个小时内达到这个目标,如果你是一个技术熟练,有动力和勤奋的人,那么这个周末就永远不会这样。但是 原则上是可能的(并且在实践中无疑更容易)以这种方式实现。

一旦你到达一个看起来像未加密的粘性物品的地方,就会变得混乱,并且有问题的形式消失了,然后开始担心这意味着什么。

- MarkusQ

答案 4 :(得分:0)

听起来没有加密,所以你可以采用网络方法。

一个好的起点是查找数据包ID - 大多数情况下,数据包前端附近的某些内容将成为数据包类型的ID。例如,移动可以是1,射击可以是“2”,聊天可以是“4”。

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

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