0

サーバーで XMLSocket を作成するフラッシュ アプリケーションを含む WebBrowser コンポーネントを表示するアプリケーションがあります。現在、ログ purpuse のために recv (幸運にも LocalHook) をフックしようとしていますが、ソケットの内容を読み取ろうとすると、奇妙な文字しか取得できませんが、SpyStudio でフックを設定すると、読み取り可能な文字列が取得されます。ここに私が使用するコードがあります:

  1. でフックをセットしました

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        new Drecv(recv_Hooked),
        this);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. 必要なものをすべてセットアップしました

    [DllImport("ws2_32.dll")]
    static extern int recv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    [UnmanagedFunctionPointer(CallingConvention.StdCall,
        CharSet = CharSet.Unicode,
        SetLastError = true)]
    
    
    delegate int Drecv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    static int recv_Hooked(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags)
    {
        byte[] test = new byte[count];
        Marshal.Copy(buf, test, 0, count);
    
    
    
    IntPtr ptr = IntPtr.Zero;
    
    
    ptr = Marshal.AllocHGlobal(count);
    Marshal.Copy(test, 0, ptr, count);
    
    
    string s = System.Text.UnicodeEncoding.Unicode.GetString(test);
    Debug.WriteLine(s);
    System.IO.StreamWriter file = new System.IO.StreamWriter("log.txt");
    file.WriteLine(s);
    
    
    file.Close();
    return recv(socketHandle, buf, count, socketFlags);;
    
    }

私はすでに成功せずに別のエンコーディングを使用しようとしました。ちなみに、WebBrowser には問題ないようです。

4

1 に答える 1

1

初期化されていないバッファの内容を保存していますが、それがゴミであることは不思議ではありません。

(実際の) バッファが埋められるまで、そのバッファには何もありませrecvん。また、 real からの戻りコードを調べない限り、実際に有効なバイト数を知ることはできませんrecv

于 2010-12-28T22:08:24.977 に答える