簡體   English   中英

WSARecv彎路鈎隱窩

[英]WSARecv Detour hook crypt

我正在為朋友的游戲服務器編寫數據包加密。 客戶端使用ws2_32接收/發送,但是服務器使用WSARecv / WSASend。

我已經設法加密/解密發送/接收/ 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;
}

任何想法,將不勝感激。

一些要考慮的事情。

在調用cryptPacket函數之前,您實際上並沒有從pWASRecv檢查返回值。 在就繞行彎鈎如何與套接字代碼一起使用做出任何其他假設之前,您需要首先從該修復程序開始。 如果調用指示錯誤,則可能無法很好地定義buffers->len將是什么或這些緩沖區中將是什么。

另外,您可能假設套接字已初始化為同步。 如果套接字針對重疊的I / O進行了初始化,則lpOverlappedlpCompletionRoutine參數將變得非常相關。 您可能需要掛鈎完成例程或WSAGetOverlappedResult才能實際攔截套接字數據。

最后,我是否可以建議另一種方法。 而不是嘗試“繞行”套接字API調用,而是運行“代理套接字”。 也就是說,在創建服務器套接字(通過調用“套接字”)時,可以將其更改為在其他端口上偵聽。 然后,創建一個單獨的偵聽套接字,該套接字在原始端口上進行偵聽。 當傳入連接進入套接字時,您將與游戲服務器正在偵聽的實際端口建立單獨的“代理”連接。 您可以有一個專用線程,該線程僅在客戶端套接字上調用sendrecv根據需要對數據進行加密/解密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM