Hook Recv и нечитаемый буфер - PullRequest
       31

Hook Recv и нечитаемый буфер

0 голосов
/ 28 декабря 2010

У меня есть приложение, которое показывает компонент WebBrowser, который содержит флэш-приложение, которое создает XMLSocket с сервером.Сейчас я пытаюсь перехватить 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);
    
    
    <pre><code>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, похоже, нет проблем.

1 Ответ

1 голос
/ 29 декабря 2010

Вы сохраняете содержимое неинициализированного буфера, неудивительно, что это мусор.

В этом буфере ничего не будет, пока recv (реальный) не заполнит его. Вы также не можете знать, сколько байтов действительно допустимо, кроме как путем проверки кода возврата из действительного recv. * 1005. *

...