如何从服务器的源代码中提取网络协议?

时间:2009-11-16 09:16:04

标签: c++ networking tcp reverse-engineering

我正在尝试为热门网络编写聊天客户端。原始客户端是专有的,比我想要的大15 GB。 (公平地说,其他人称之为游戏。)

互联网上的协议绝对没有可用的文档,大多数搜索结果只返回客户端的脚本界面。我可以理解,因为以错误的方式使用,可能会导致破坏其他人的经历。

我已经下载了几个替代服务器的源代码,包括我要连接的服务器,但那些

  • 不包含安装说明以外的其他文档
  • 评论很差(我做了一个肤浅的浏览)
  • 是巨大的(目标服务器的src文件夹包含12 MB的.cpp.h个文件),grep没有找到任何相关的内容

我也试过搜索他们的论坛并联系服务器的维护人员,但到目前为止,没有运气。

数据包嗅探不太可能有所帮助,因为协议在很大程度上依赖于加密。

此时,我所有的希望都是能够咀嚼不同代码的能力。我该如何开始?

修改:A related question

4 个答案:

答案 0 :(得分:3)

如果您的原始代码是使用OpenSSL或Ctypto ++这样的知名库加密的,那么为这些库的主入口点编写包装器可能会很有用,然后将调用分离到实际库。如果您进行此类替换并成功构建项目,您将能够以纯文本方式跟踪所有内容。

如果您的项目没有使用第三方加密库,希望仍然可以用一些跟踪其输入的包装器替换加密例程,然后将加密委托给实际代码。 您的赌注是通常enctyption是在单独的相对较少数量的源文件中实现的,因此您可以更轻松地跟踪这些文件中的输入/输出。

祝你好运!

答案 1 :(得分:2)

我会说

  1. 找到用于通过套接字发送数据的命令(该调用取决于网络库)
  2. 找到此命令的引用并从那里展开。如果您可以修改 - 重新编译服务器代码,它可能会有所帮助。
  3. 在途中,您将能够记录解密(或更可能是尚未加密)的网络活动。

答案 2 :(得分:1)

IMO,最好的答案是阅读替代服务器的源代码。尝试使用优秀的C ++ IDE来帮助您。它会产生很大的不同。

您需要了解的与协议相关的材料可能仅限于文件的子集。这些将包含对网络套接字和东西的引用。从那里开始,尽可能地向外工作。

答案 3 :(得分:0)

一种可行的方法是将此作为加密挑战来解决。这很容易,因为你控制了很多。

例如,您可以使用当前客户端将已知消息发送到服务器,然后检查服务器内存中的该字符串。一旦你发现了字符串结束的对象,就可以通过代码跟踪它的祖先。在对象的任何非const方法上设置断点,并找到堆栈跟踪。这使您可以实时查看消息如何到达服务器,以及消息处理所必需的核心功能列表。接下来您可以找到相关的函数(列表中函数的调用者/被调用者)。