![](/img/trans.png)
[英]Microsoft Detour - Hook Function with an assembler “call” instruction
[英]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進行了初始化,則lpOverlapped
和lpCompletionRoutine
參數將變得非常相關。 您可能需要掛鈎完成例程或WSAGetOverlappedResult
才能實際攔截套接字數據。
最后,我是否可以建議另一種方法。 而不是嘗試“繞行”套接字API調用,而是運行“代理套接字”。 也就是說,在創建服務器套接字(通過調用“套接字”)時,可以將其更改為在其他端口上偵聽。 然后,創建一個單獨的偵聽套接字,該套接字在原始端口上進行偵聽。 當傳入連接進入套接字時,您將與游戲服務器正在偵聽的實際端口建立單獨的“代理”連接。 您可以有一個專用線程,該線程僅在客戶端套接字上調用send
和recv
根據需要對數據進行加密/解密。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.