2015-04-21 121 views
0

我正在爲朋友遊戲服務器寫封包加密。 客戶端正在使用ws2_32 recv/send,但服務器使用WSARecv/WSASend。WSARecv Detour hook crypt

我設法加密/解密send/recv/WSASend,但WSARecv似乎不可能。 我使用與recv相同的方法,但它似乎不工作。

int WINAPI MyWSARecv(SOCKET socket, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) 
{ 
     LPWSABUF buffers = lpBuffers; 
     int ret = pWSARecv(socket, buffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine); 

     cryptPacket(buffers->buf, buffers->len); 
     lpBuffers = buffers; 
     return ret; 
} 

任何想法,將不勝感激。

+1

爲什麼使用Detours而不是直接調用MyWSARecv?另外,可以向WSARecv顯示你的代碼在哪裏創建鉤子? – selbie

+0

我很確定這個鉤子能夠工作,因爲我設法記錄緩衝區。 http://pastebin.com/NzE66TWD這是代碼。 – Asmo

+0

那到底是什麼問題?你需要更多的描述性內容,而不僅僅是說「看起來不起作用」。 – selbie

回答

0

一些事情要考慮。

在調用cryptPacket函數之前,您實際上並沒有從pWASRecv檢查返回值。您需要首先從該修復開始,然後才能對繞行鉤子如何與套接字代碼一起工作做出任何其他假設。如果調用表明有錯誤,則可能沒有很好地定義什麼是buffers->len或將會在那些緩衝區中發生什麼。

此外,您可能會認爲套接字已初始化爲同步。如果套接字初始化爲重疊I/O,則參數lpOverlappedlpCompletionRoutine變得非常相關。您可能需要掛接完成例程或WSAGetOverlappedResult以實際攔截套接字數據。

最後,我可以提出另一種方法。與其試圖「繞行」套接字API調用,不如運行「代理套接字」。也就是說,當創建服務器套接字(通過調用「套接字」)時,您將其更改爲在其他端口上偵聽。然後,您創建一個單獨的偵聽套接字,偵聽原始端口。當一個傳入連接進入你的套接字時,你可以與遊戲服務器正在監聽的實際端口建立單獨的「代理」連接。您可以擁有一個專用線程,只需在客戶端套接字上調用sendrecv即可根據需要加密/解密數據。

+0

我沒有設法掛鉤WSAGetOverlappedResult。你能用一個例子多解釋一下你的建議嗎?從我的理解,我需要在xPort上創建套接字偵聽,然後將流量轉發到gameserverPort,如client-> xPort-> gameserver端口,反之亦然?這不會導致所有玩家使用相同的IP(GameServer IP)嗎? – Asmo

+0

這是一個客戶端 - 服務器遊戲,對嗎?客戶端是否通過TCP或UDP連接?在任何情況下,代理數據包的專用循環都可以。 – selbie

+0

客戶端通過TCP連接。不過,我寧願攔截WSARecv以避免gameserver識別所有玩家使用相同的IP。任何關於此的建議都是值得歡迎 – Asmo