C++ と回り道を使用して、winsock2 関数をフックする dll に取り組んでいます。私の目標は、元の実行可能ファイルとの間でやり取りされる TCP トラフィックを変更することです。ある時点で、特定のパケット配信を停止する必要があります (そのため、元の実行可能ファイルはそのパケットについてまったく認識しませんが、接続は維持されます)。
WSASend フックを使えば、それは明らかです (元の WSASend を呼び出して 0 を返さないだけです)。しかし、WSAOVERLAPPED 構造を使用して WSARecv フックで作成する方法がわかりません。
以下のこのコードが、私が何を望んでいるのかを示していることを願っています:
__declspec(dllexport) int WINAPI WSARecv_hook(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
// Recieve real data
int ret = WSARecv_real(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
// Loop over lpBuffers and analyze it
for(int i=0; i < dwBufferCount; i++)
{
// analyze it
if(packet_should_be_blocked(lpBuffers[i].buf, lpBuffers[i].len))
{
// Do or return what?
} else {
// Otherwise, just process as usual
}
}
return ret;
}
何も起こらず、パケットが受信されなかったふりをするにはどうすればよいですか (偽の WSA_IO_PENDING のように)。アイデア/考えはありますか?
PS私が知っていることから、実行可能ファイルは完了ルーチンを使用しておらず (lpCompletionRoutine は常に NULL)、構造が重複しているだけです。