挂钩recv和不可读的缓冲区

发布于 2024-10-09 03:50:35 字数 1381 浏览 5 评论 0原文

我有一个显示 WebBrowser 组件的应用程序,其中包含一个使用服务器创建 XMLSocket 的 Flash 应用程序。 我现在正在尝试挂钩recv(幸运的是LocalHook)以进行日志用途,但是当我尝试读取套接字内容时,我只得到奇怪的字符,但是如果我使用SpyStudio设置挂钩,我会得到可读的字符串。 这是我使用的代码:

  1. 我设置了钩子

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        新的 Drecv(recv_Hooked),
        这);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. 我设置了我需要的一切

    <前><代码>[DllImport("ws2_32.dll")] 静态外部 int 接收( IntPtr套接字句柄, IntPtr buf, 整数计数, int 套接字标志 ); [UnmanagedFunctionPointer(CallingConvention.StdCall, 字符集 = 字符集.Unicode, 设置最后一个错误= true)] 委托 int Drecv( IntPtr套接字句柄, IntPtr buf, 整数计数, int 套接字标志 ); 静态 int recv_Hooked( IntPtr套接字句柄, IntPtr buf, 整数计数, int套接字标志) { 字节[]测试=新字节[计数]; Marshal.Copy(buf, 测试, 0, 计数);
    IntPtr ptr = IntPtr.Zero;
    
    
    ptr = Marshal.AllocHGlobal(count);
    Marshal.Copy(测试, 0, ptr, 计数);
    
    
    字符串 s = System.Text.UnicodeEncoding.Unicode.GetString(test);
    调试.WriteLine(s);
    System.IO.StreamWriter 文件 = new System.IO.StreamWriter("log.txt");
    文件.WriteLine(s);
    
    
    文件.关闭();
    返回recv(socketHandle, buf, count, socketFlags);;
    
    }

我已经尝试使用不同的编码但没有成功。顺便说一句,WebBrowser 似乎没有任何问题。

I have an application that shows a WebBrowser component, which contains a flash application that create a XMLSocket with a server.
I'm now trying to hook recv ( luckly a LocalHook) for log purpuse, but when I try to read the socket content I get only strange chars, but if i set the hook with SpyStudio I get readable strings.
Here is the code I use :

  1. I set the hook with

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        new Drecv(recv_Hooked),
        this);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. I set up everything I need with

    [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);;
    

    }

I've already tried using different Encoding without success. As a side note, the WebBrowser doesn't seems to have any problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

狼性发作 2024-10-16 03:50:35

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

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

You're saving the content of the uninitialized buffer, no wonder it's garbage.

There is nothing in that buffer until after recv (the real one) fills it in. You also can't know how many bytes are actually valid except by inspecting the return code from the real recv.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文