0

カスタムの recv() winsock2.0 メソッドをリモート プロセスにフックしようとしていたため、プロセス内の関数ではなく関数が実行されました。これをグーグルで調べたところ、本当に良い例がいくつか見つかりましたが、説明が不足しています。

typedef (WINAPI * WSAREC)( SOCKET s, char *buf, int len, int flags ) = recv;

さて、私の質問は、これはどういう意味ですか、またはこれは実際の recv() 関数へのある種のポインターですか?

そして、カスタム関数のもう 1 つのコード

int WINAPI Cus_Recv( SOCKET s, char *buf, int len, int flags ) 
{
    printf("Intercepted a packet");

    return WSAREC( s, buf, len, flags ); // <- What is this?
}

これらの質問が本当に基本的に聞こえる場合は申し訳ありませんが、私は 2、3 週間前に学習を始めたばかりです。ありがとう。

4

1 に答える 1

1

そのような例はどこで見つけましたか?

最初の行は、新しいタイプWSARECを定義しようとします。これは、と同じシグニチャーを持つ関数へのポインターrecv()です。残念ながら、関数のアドレスを格納するために、このタイプの変数も宣言しようとしていrecv()ます。関数に戻り型がないため、typedefが間違っています。そのため、VisualStudio2003ではコンパイルされません。

あなたはより多くの運を使うかもしれません:

int (WINAPI * WSAREC)( SOCKET s, char *buf, int len, int flags ) = &recv;

これは、のアドレスを格納する「関数へのポインタ」タイプの変数のみを宣言しますrecv()

2番目のスニペットは、関数と同じ署名を持つ関数です。この関数は、メッセージを出力し、上記で宣言された関数ポインターを介してrecv()元のスニペットを呼び出します。recv()

ここでのコードは、ポインターを介して関数を呼び出す方法のみを示しています。現在のプロセスでは何も置き換えられません。

また、別のプロセスに干渉して、1つの機能を自由に置き換えることができるかどうかもわかりません。これは、システムのセキュリティにとって大きな脅威になります。しかし、なぜあなたはそもそもそれをするのですか?

于 2010-02-10T10:21:25.640 に答える