我有一个显示WebBrowser组件的应用程序,该组件包含一个使用服务器创建XMLSocket的Flash应用程序。 我现在正试图为日志purpuse挂钩recv(幸运的是一个LocalHook),但是当我尝试读取套接字内容时,我只得到奇怪的字符,但如果我用SpyStudio设置钩子,我会得到可读的字符串。 这是我使用的代码:
我用
设置了钩子CreateRecvHook = LocalHook.Create(
LocalHook.GetProcAddress("ws2_32.dll", "recv"),
new Drecv(recv_Hooked),
this);
CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
我用
设置了我需要的一切[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似乎没有任何问题。
答案 0 :(得分:1)
您正在保存未初始化缓冲区的内容,难怪它是垃圾。
在recv
(真实的)填充之前,该缓冲区中没有任何内容。除了检查真实{{1}的返回码之外,您还无法知道实际有效的字节数。 }。