2009-11-16 47 views
1

我正在尝试为流行网络编写聊天客户端。原来的客户端是专有的,比我想要的大15GB左右。 (公平地说,其他人称它为游戏)。如何从服务器的源代码中提取网络协议?

在互联网上绝对没有可用的协议文档,并且大多数搜索结果只会返回客户端的脚本界面。我可以理解,既然以错误的方式使用,就可能导致其他人的经验受损。

我已经下载了几个备用服务器,包括一个我想要连接到的源代码,但这些

  • 不包含除安装说明文档
  • 被注释掉不好(我做一个肤浅的浏览)
  • 是巨大的(目标服务器的src文件夹中包含12 MB值得.cpp.h文件),并grep没有发现任何有关

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

数据包嗅探不可能有帮助,因为协议严重依赖于加密。

在这一点上,我所有的希望是我的能力,咀嚼不合要求的代码量。我如何开始?

编辑:A related question

回答

3

如果您的原始代码使用OpenSSL或Ctypto ++等一些众所周知的库进行加密,那么为这些库的主要入口点编写包装器,然后将调用分层到实际库可能会很有用。如果您进行了这种替换并成功地构建了项目,那么您将能够以纯文本的方式追踪出现的所有内容。

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

祝你好运!

2

我想说

  1. 发现,用于通过套接字来发送数据的命令(呼叫取决于网络库)
  2. 找到这个命令的引用,并从那里展开。如果你可以修改 - 重新编译服务器代码,它可能会有所帮助。

途中,您将能够记录解密(或更有可能尚未加密)的网络活动。

1

IMO,最好的答案是阅读替代服务器的源代码。尝试使用一个好的C++ IDE来帮助你。它会造成很大的不同。

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

0

一个可行的方法是解决这个作为加密挑战。这很容易,因为你控制这么多。

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