0

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)、構造が重複しているだけです。

4

2 に答える 2

3

主なハードルは、呼び出し元の関数が保留状態で終了した後、重複した操作がバックグラウンドで実行されることを意図していることです。呼び出し元がWSARecv()オーバーラップ読み取りの実行を要求した場合、データがバックグラウンドで到着することを期待しており、まだ受信されていないため、フック内のデータを直接検証することはできません。独自のプライベートWSAOVERLAPPEDを使用して独自のオーバーラップ読み取りを実行し、スレッドまたは完了コールバックを使用してその読み取りがいつ終了したかを検出し、データを分析できるようにする必要があります。データが受け入れられる場合は、それを呼び出し元のバッファーにコピーし、呼び出し元のWSAOVERLAPPED. それ以外の場合は、別の読み取りを投稿してそのデータが到着するのを待ち、呼び出し元に提供したいデータを最終的に受け取るまで、必要に応じて繰り返します。

于 2014-08-06T23:20:18.517 に答える