2009-11-16 25 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方法上設置一個斷點,並找到堆棧跟蹤。這使您可以實時瞭解消息如何到達服務器,以及消息處理所必需的核心功能列表。接下來你可以找到相關的功能(列表中的功能的調用者/被調用者)。