截获MSN数据包时的长度有关问题

截获MSN数据包时的长度问题
用HOOK方法获取MSN收发的数据包.已经成功获得了正常聊天时的所有控制信息与MSG信息.但是当对方发送过来的数据包超过512字节时候,只能获得512字节长度的数据.然而我们在平时MSN聊天的时候,是可以接收到超过512字节的信息的.

    程序大致实现如下:
 
    HOOK_SEND(SOCKET   s,   char*   buf,   int   len,   int   flag)
{
        WaitForSingleObject(g_hSendEvent,   INFINITE);
        WriteProcessMemory(INVALID_HANDLE_VALUE,   (void*)g_pSend,(void*)                 g_dwOldBytesSend[0],   sizeof(DWORD)*2,   NULL);

        /*.......将buf内容写到文件的代码,省略.........*/
        send(s,   buf,   len,   flag);
}//   没有任何问题,在MSN客户端发送信息允许长度范围内的信息全部可以正确捕获

HOOK_RECV(SOCKET   s,   char*   buf,   int   len,   int   flag)
{
        WaitForSingleObject(g_hRecvEvent,   INFINITE);
        WriteProcessMemory(INVALID_HANDLE_VALUE,   (void*)g_pRecv,   (void*)g_dwOldBytesRecv[0],   sizeof(DWORD)*2,   NULL);

        memset(buf,   0,   len);
        nRet   =   recv(s,   buf,   len,   flags);

        /*.......将buf中的内容写到文件的代码,省略........*/
}//   当MSN客户端接收的信息长度(包括消息头)超过512字节的时候,超过512字节的内容全被丢弃了.小于512字节的内容正确捕获

我跟踪了两个函数中参数LEN的大小,发现SEND中LEN的大小随发送信息的长度变化,而RECV中LEN的值一直是512.不理解MSN的客户端在处理超过512字节的信息时是怎样做的,MSN的协议中似乎也没有讲到.有知道的高手请指点一下迷津,多谢.

------解决方案--------------------
这里的len应该是接受缓冲区的大小, 超过len应该就把剩余的data 放到下一次recv调用里去了
------解决方案--------------------
感觉应该是有后续的包没有截到,如果说下一次的RECV调用是对方发来的新数据,那么很有可能一个RECV把大于512的数据分开大包传送了~
------解决方案--------------------
DWORD g_dwOldBytesSend[2][2] = {0x0, 0x0, 0x0, 0x0};//保存原MSN的API入口的8个字节
DWORD g_dwOldBytesRecv[2][2] = {0x0, 0x0, 0x0, 0x0};//保存原MSN的API入口的8个字节

DWORD g_pSend = 0; //MSN客户端API中send函数的地址
DWORD g_pRecv = 0; //MSN客户端API中recv函数的地址

send()
recv()
你的HOOK程序中怎么是三套函数地址啊???它们什么关系?
一般HOOK API只有新旧两套地址吧??


------解决方案--------------------
HOOK_RECV(SOCKET s, char* buf, int len, int flag)
{
WaitForSingleObject(g_hRecvEvent, INFINITE);
WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)g_pRecv, (void*)g_dwOldBytesRecv[0], sizeof(DWORD)*2, NULL);

memset(buf, 0, len);
nRet = recv(s, buf, len, flags);

/*.......将buf中的内容写到文件的代码,省略........*/
}
是不是在处理顺序上有点问题?
HOOK_RECV(SOCKET s, char* buf, int len, int flag)的参数中是不是已经含有接收到的数据了?
你跟踪一下buf中的内容吧,看看你接收到的内容是不是消息开头的512个字节?如果不是的话,就说明处理顺序可能有问题了。
------解决方案--------------------
哦 :)看来只能帮你乱顶一下了 。

如果把 nRet = recv(s, buf, len, flags);
中的len值人为设定为比512更大的数值,会如何呢?一样也接收不到更多的数据吗?
------解决方案--------------------
http://www.donews.net/zwell/archive/2004/08/31/84513.aspx
//------------------------------------
// 由于要截获两个库里面的函数,所以每个函数定义了两个HOOK结构
// 在编程过程中因为没有考虑到这个问题,导致很多包没有截获到,
// 后来想到了冰哥在模仿SOCKCAP的程序中每个函数截了两次才明白
// 一个是wsock32.dll, 一个是ws2_32.dll
//------------------------------------

不知道MSN会不会也是这种情形,你把两个库都HOOK一下试试吧
:)希望好运吧!
------解决方案--------------------