0

我有一个显示 WebBrowser 组件的应用程序,其中包含一个使用服务器创建 XMLSocket 的 flash 应用程序。我现在正在尝试为日志目的挂钩 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 回答