Domanda

Ho un'applicazione che mostra un componente del browser web, che contiene un'applicazione flash che creano un XMLSocket con un server. Ora sto cercando di agganciare recv (per fortuna una LocalHook) per il registro purpuse, ma quando provo a leggere il contenuto presa ottengo solo strani caratteri, ma se ho impostato il gancio con SpyStudio ottengo stringhe leggibili. Qui è l'uso di codice I:

  1. ho impostato il gancio con

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        new Drecv(recv_Hooked),
        this);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. ho creato tutto quello che serve con

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

Ho già provato con codifica diversa senza successo. Come nota a margine, il browser web non sembra avere alcun problema.

È stato utile?

Soluzione

Si sta salvando il contenuto del buffer non inizializzato, Nessuna meraviglia è spazzatura.

Non c'è nulla in quel buffer fino a dopo recv (quello vero) riempie dentro. Non è inoltre possibile sapere quanti byte sono in realtà validi se non per ispezionare il codice di ritorno dal reale recv.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top