2009-08-20 19 views
2

NektraのDeviareを使用して、winsockのsendメソッド呼び出しをフックします。私の考えは、元のアプリケーションと同じソケットを通してメッセージを送信することを学ぶことです。だから、私がやっていることは、最初にsend messageを検出したときに、ソケットID(send関数の最初の引数)を保存して、後で使用できるようにすることです。ソケットで文字列を送信する(簡単ではありません)

は、だからここに私のコードです:

uint socket = 0; 

[DllImport("Ws2_32.dll")] 
private static extern int send(uint socket, string buf, int len, int flags); 

void _proxy_OnFunctionCalled(DeviareTools.IProcess proc, DeviareParams.ICallInfo callInfo, Deviare.IRemoteCall rCall) 
{ 
    socket = (uint)callInfo.Params.get_Item(0).Value; 
} 

以降

int ret = send(socket, "ABC", 3, 0); 
    MessageBox.Show(ret.ToString()); 

この最後のメッセージボックスには常にアップpopingさ-1。それはなぜでしょうか?

おかげ

編集:WSAGetLastError()を呼び出すことがMSDNに表示されていないようだと、私は、それが何を意味するのか分からない2を返します。

答えて

1

は、同様に

MessageBox.Show(socket.ToString()); 

をやってみて、あなたのソケット変数が設定されてしまったことを確認します。

私はエラー2が "ファイルが見つかりません"と考えています。これは無効なソケットIDを持っていることを示唆していますが、間違っている可能性があります。

+0

これは現在、1564という値があります。 –

+0

さて、ソケットの値を123に設定すると、同じエラーが表示されます。奇妙な。だから、おそらくソケットIDとは何か関係がありません。私は理由を知りません。 –

0

WinSockを初期化する必要があります。ソケットを作成する必要があります(ソケットがSOCK_DGRAMでない場合)。 それに加えて、API関数は、(char *)ポインタからのデータを処理し、それが起こっていることを保証します。 「ABC」がWIDECHAR配列、Stringオブジェクト、または(char *)バッファではないものとして宣言されている可能性があります。

は、MSDNで、ここで基本的なソケット接続の完全なexempleあります:http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx

+0

私は何も初期化する必要はないと思いますが、すでに作成されているソケットのIDを使用しています。 –

+0

はい、しかし、私はあなたがポイントを得ていないと思います。私はソケットで情報を送信する方法を尋ねていない、私は私が別のアプリケーションをフックしているソケットのIDを持っている情報を送信するようにお願いしています。 –

+0

データソケットを送信する準備ができていればかなりうまくいくはずです。たぶんあなたは何か別のことをやっているかもしれません。むしろAPIHookを使用するだけで、自分のコードにアクセスすることなく、ゲームサーバー用のセキュリティフィルタとアンチキートソリューションを既に作成しています。 – Havenard

0

それかもしれません少し遅れたが、問題はあなたが別のプロセスで作成したソケットを使用しようとしているということです。 Deviareを使用すると、あるプロセスからソケットIDが取得され、そのプロセスでそのIDを使用しようとしています。これはソケットIDが作成されたプロセスでのみ有効であるため機能しません。

関連する問題