none
关于 Hook WSARecv的一个问题~ RRS feed

  • 问题

  • Hook WSARecv后

    WSARecv(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD pNumberOfBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)

    目标程序(Word2003),传递参数
    lpFlags=32; 这个完全没搞懂是什么意思
    lpCompletionRoutine参数为null;
    lpOverlapped 参数不为null, 但 lpOverlapped>hEvent=null。 
    按理说应该是个完成端口
    但是 hook GetQueuedCompletionStatus 或 WSAGetOverlappedResult 没有反应,应该是没有调用。

    所有参数通过 WSARecv后。
    如果 lpOverlapped->InternalHigh >0 ,WSBUF里的数据就接收的数据了,InternalHigh就是数据长度。
    如果lpOverlapped->Internal!=0 ,按我的理解就是,操作成功。数据等通知。
    问题是,是等哪个函数的通知。我应该hook哪个函数?
     GetQueuedCompletionStatus 或 WSAGetOverlappedResult 都没有反应。
    2014年6月10日 3:28

全部回复

  • 你好,

    不知道你具体是如何进行hook 的,如果就是要hook WSARecv这个函数,那么hook 的方法和hook 其他函数的方法是一样的。只是当你通过WSAOverlapped 调用的 WSARecv, 你需要同时

     hook WSARecv() 和 WSAGetOverlappedResult().

    当你通过completion routine 调用的WSARecv,你需要再hook GetQueuedCompletionStatus().

    更多信息,可以参考如下链接:

    How to handle hooked WSARecv

    同时更多关于使用hook的说明,你可以参考MSDN文档:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960(v=vs.85).aspx


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年6月11日 8:57
  • 我看了这些文档,但好像都没有解决我的问题。现在我把问题详细说一下:

    关于hook ,我用的detours 1.2,就因为出现了这个问题,我开始以为是detours库的问题,所以我升级到detours 3.0 问题依旧


    目前我用detours hook了 WSARecv GetQueuedCompletionStatus  WSAGetOverlappedResult 函数

    //这是我的WSARecv 替换程序。

    int WSAAPI Mywsarecva(SOCKET s, LPWSABUF lpBuffers,         DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,          LPINT lpFlags, LPWSAOVERLAPPED lpOverlapped,          LPWSAOVERLAPPED_COMPLETION_ROUTINE          lpCompletionRoutine )
    {

    //首先判断是什么类型

    if (lpOverlapped==NULL) //是阻塞式的,直接在原函数返回后处理即可

    if ((lpOverlapped!=NULL) && (lpCompletionRoutine!=NULL)) //我用我自己的函数替换lpCompletionRoutine,也正确的得到了数据

    if ((lpOverlapped!=NULL) && (lpOverlapped->hEvent!=NULL)) //这是重叠,我处理后,通过WSAGetOverlappedResult 能得到正确的数据

    if ((lpOverlapped!=NULL) && (lpOverlapped->hEvent==NULL) && (lpCompletionRoutine==NULL)) //这是完成端口,我处理后,通过GetQueuedCompletionStatus 也能得到正确的数据。

    我的这个程序在hook Chrome、Firebox、IE一些游戏等等不同方式的程序时,表现良好。

    当我用在 Office 2003中的 Word2003时,出现了问题;

    我通过中断调试的方法进去后发现。

    int WSAAPI Mywsarecva(SOCKET s, LPWSABUF lpBuffers,         DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,          LPINT lpFlags, LPWSAOVERLAPPED lpOverlapped,          LPWSAOVERLAPPED_COMPLETION_ROUTINE          lpCompletionRoutine )
    {

    //在没有调用真正的WSARecv之前 Word传递的参数如下

    lpFlags=32 // 这个我感到奇怪,因为绝大多数程序,这个参数都是0

    lpOverlapped //这个结构下所有成员值都是0

    lpCompletionRoutine=0

    //按照msdn的说法,这种情况就是完成端口了,需要GetQueuedCompletionStatus来获得通知,然后在处理WSABUF。

    所以,我在等我Hook GetQueuedCompletionStatus响应,奇怪的是GetQueuedCompletionStatus并没有响应。包括WSAGetOverlappedResult也没有响应。 说明:他们在hook其它目标程序时反应良好,所以应该不是hook的问题。

    再通过中断发现。

    int ret=((Mywsarecv)Mywsarecv1)(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);//调用真正的程序。

    返回结果。

    ret有可能是0

    如果是0,那么lpBuffers就是数据了,lpNumberOfBytesRecvd就是长度

    lpOverlapped->InternalHigh==lpNumberOfBytesRecvd 也是长度

    更多情况

    ret==-1,通过 WSAGetLastError==WSA_IO_PENDING

    lpOverlapped->Internal=259

    //就是这种情况,后面即没有GetQueuedCompletionStatus 也没有 WSAGetOverlappedResult。 所以我不知道hook什么函数来截获操作完成的通知了。

    word.exe 它是通过什么函数来获得通知的呢?


    2014年6月12日 5:27
  • 你好,最近也是在做hook WSARECV和WSARECVFROM这两个函数,但是在HOOK  WSAGetOverlappedResult的时候经常出错,能否把你Mywsarecva中的代码贴出来共享下, 万分感谢!
    2014年8月20日 2:49
  • Try to hook GetOverlappedResult. I found some applications will use this API instead of WSAGetOverlappedResult.
    2015年2月25日 6:35