hook WSARecv要注意的问题

转载 2012年07月27日 20:29:20

如果直接在hook的函数中直接调用原始地址的话完全没有问题:

int WSAAPI hooked_WSARecv_ws232(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
{
return ((LPFN_WSARECV)(WSARecvHookerWS232.GetRawFunction()))(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine );
}

但是如果是在调用原函数后还进行了getsockname或者getpeername操作的话将导致网络操作失败。

这里如果需要截获实际接收的数据的话,当村的通过这个函数是很片面的,需要分几种情况说明:

1、如果lpOverlapped为NULL,那么是阻塞式的,直接在原函数返回后处理即可
2、如果lpOverlapped不为NULL,且lpCompletionRoutine不为NULL,那么需要使用自己的函数替换lpCompletionRoutine;并在调用后执行调用用户原函数。因为这时是完成例程通知。
3、如果lpOverlapped不为NULL,且lpCompletionRoutine为NULL,并且lpOverlapped的hEvent不为NULL,那么需要hook WSAGetOverlappedResult。因为这时是事件通知。
4、如果lpOverlapped不为NULL,且lpCompletionRoutine为NULL,并且lpOverlapped的hEvent为NULL,那么需要hook GetQueuedCompletionStatus,因为这时是完成端口的方式。

这里还有一个需要注意的地方:如果一个api hook的DLL强行卸载的话会导致调用堆栈出现返回地址错误。 比如GetQueuedCompletionStatus这样的函数, 在进行卸载时, 基本可以肯定程序在原始函数中阻塞,且返回地址为dll模块的地址, 如果这时候卸载HOOK和dll的话,将会导致该函数执行完成后跳到原来dll模块的函数地址, 这时内存已经清空,从而出现访问出错的异常。因此我们需要进行是否函数当前正在等待返回的判断。 如果还有在执行的,我们需要先等待他们返回。最好的方式是设计一个引用计数reference。

当然,除非必要,否则建议不要hook可能阻塞很久的函数,尤其是像GetQueuedCompletionStatus这样的函数,因为系统中很多情况下都会调用该函数,那么在卸载的时候基本可以肯定有两种情况:一是强行卸载,程序必死无疑;二是等待返回,这种情况也基本可以肯定是hook模块也不要想着卸载掉了 ;)

 

//其他参考:

1.http://www.cppblog.com/twzheng/archive/2007/04/16/21991.html;


hook send recv wsasend wsarecv 封包工具源码

  • 2013年02月16日 16:09
  • 1005KB
  • 下载

WSARecv

http://www.cppblog.com/yuyunliuhen/archive/2010/03/20/110170.aspx WSARecv Function 从连接的SOCKET中接收数...
  • Witch_Soya
  • Witch_Soya
  • 2012年05月08日 08:11
  • 5886

IOCP (关于WSASend,WSARecv调用)

IOCP (关于WSASend,WSARecv调用)
  • thebluebluesky
  • thebluebluesky
  • 2010年12月17日 12:35
  • 4285

WSARecv 函数

原文:http://www.cppblog.com/sleepwom/archive/2009/01/31/72724.html WSARecv Function The WSARecv func...
  • yfh1985sdq
  • yfh1985sdq
  • 2010年10月19日 10:15
  • 3850

socket 封包和解包

对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就是封包和拆包.下面就针对这个问题谈谈我的想法,抛砖引玉.若有不对,不妥之处,恳求大家指正.在此先谢过大家了.   一.为什么基于TCP的通...
  • dai_jing
  • dai_jing
  • 2014年04月18日 19:48
  • 13606

Hook Socket API之后改变http报文头数据篡改send内容

socket库中的send和recv函数在被自定义的hook函数监视劫持后,想把send发送过程的http报文头里目标网站篡改,虽然把host:的域名替换了,但是结果浏览器显示的效果是请求被服务器禁止...
  • xexiyong
  • xexiyong
  • 2013年08月10日 09:25
  • 6729

零字节WSASend,WSARecv

以下是Windows平台下两个函数的声明: int WSASend(   __in          SOCKET s,   __in          LPWSABUF lpBuf...
  • huangjm_13
  • huangjm_13
  • 2016年03月30日 16:00
  • 951

hook WSARecv要注意的问题

如果直接在hook的函数中直接调用原始地址的话完全没有问题:int WSAAPI hooked_WSARecv_ws232(SOCKET s,LPWSABUF lpBuffers,DWORD dwBu...
  • chinafe
  • chinafe
  • 2012年07月27日 20:29
  • 3740

WSARecv

在重叠模型中,接收数据就要靠它了,它的参数也比recv要多,因为要用刀重叠结构嘛,它是这样定义的:  int WSARecv(   SOCKET s, // 当然是投递这个操作的套接字   LPWSA...
  • jimaliu
  • jimaliu
  • 2009年11月30日 22:01
  • 299

使用完成端口投递WSARecv出现错误

今天使用刚学完成端口实现
  • bobopeng
  • bobopeng
  • 2014年07月26日 01:22
  • 659
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hook WSARecv要注意的问题
举报原因:
原因补充:

(最多只允许输入30个字)