拦截网络数据包卡死的问题

toma2008 2017-02-23 06:58:24
网上有个使用HOOK API拦截网络数据包的,有点问题,修改下就能使用
但是对进程拦截了发送的数据包,进程就卡死了,因为进程在等待接收数据包

1,拦截发送数据包:将发送的地址指向本程序,根据条件拦截,代码如下

int WINAPI hook_send(SOCKET s, const char FAR *buf, int len, int flags)
{
// 申请指定长度的共享内存空间
CShareMemory sm("IPPACK_SEND", sizeof(CMessageData) + len, TRUE);
// 取得指向共享内存的指针
CMessageData *pData = (CMessageData*)sm.GetBuffer();

// 设置参数
pData->dwThreadId = ::GetCurrentThreadId();
pData->socket = s;
pData->nDataLength = len;
memcpy(pData->data(), buf, pData->nDataLength);

//根据条件在这里拦截

// 调用原来的函数,发送数据
g_send.Unhook();
int nRet = ::send(pData->socket, pData->data(), pData->nDataLength, flags);
g_send.Rehook();

return nRet;
}


2,接收网络数据包,代码如下

int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + len, TRUE);
CMessageData *pData = (CMessageData*)sm.GetBuffer();

//在这里修改接收的网络数据包

// 调用原来的函数,接受数据,设置参数
g_recv.Unhook();
int nRet = ::recv(s, pData->data(), len, flags);
g_recv.Rehook();

pData->dwThreadId = ::GetCurrentThreadId();
pData->socket = s;
pData->nDataLength = nRet;

//

// 返回数据
memcpy(buf, pData->data(), pData->nDataLength);

return nRet;
}



不知怎么弄,不让目标进程不在等待接收网络数据包,就是不让进程卡死???
...全文
789 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-11
  • 打赏
  • 举报
回复
参考wireshark源代码相关片断。
toma2008 2018-04-11
  • 打赏
  • 举报
回复
有人看到 吗

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧