钩子recv和不可读的缓冲区

时间:2010-12-28 18:53:33

标签: c# sockets easyhook

我有一个显示WebBrowser组件的应用程序,该组件包含一个使用服务器创建XMLSocket的Flash应用程序。 我现在正试图为日志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);;
    
    }
  3. 我已经尝试过使用不同的编码而没有成功。作为旁注,WebBrowser似乎没有任何问题。

1 个答案:

答案 0 :(得分:1)

您正在保存未初始化缓冲区的内容,难怪它是垃圾。

recv(真实的)填充之前,该缓冲区中没有任何内容。除了检查真实{{1}的返回码之外,您还无法知道实际有效的字节数。 }。