insist
驱动牛犊
驱动牛犊
  • 注册日期2003-05-09
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1357回复:1

如何HOOK NDIS只让udp某端口的数据流入流出,其余数据包全部丢弃?

楼主#
更多 发布于:2003-10-19 18:47
我已实现所有数据包不被转发到系统调用函数中。

很奇怪的是,我的UDP数据包好象始终不被转发。

下面是我的程序:
NdisQueryBufferSafe(FirstBuffer, &VirtualAddress, &Length, HighPagePriority);
pEthernetFrame = (PETHERNET_FRAME)VirtualAddress;
EthernetFrameType = ntohs(pEthernetFrame->FrameType);

if(EthernetFrameType != ETHERNET_FRAME_TYPE_TCPIP)
return 0;

//
// 解析Ip Header
//
if((Length - ETHERNET_FRAME_LENGTH) >= IP_HEADER_LENGTH)
{
pIpHeader = (PIP_HEADER)((char*)pEthernetFrame + ETHERNET_FRAME_LENGTH);
Length = Length - ETHERNET_FRAME_LENGTH;
}
else
{
NdisGetNextBuffer(FirstBuffer, &Buffer);

if(Buffer == NULL)
return 0;

NdisQueryBufferSafe(Buffer, &VirtualAddress, &Length, HighPagePriority);

if(VirtualAddress == NULL || Length < IP_HEADER_LENGTH)
return 0;

pIpHeader = (PIP_HEADER)VirtualAddress;
}

HeaderLength = pIpHeader->HeaderLength * HEADER_LENGTH_MULTIPLE;

//dprintf((\"HeaderLength: %u\\n\", HeaderLength));
PrintIp(pIpHeader, Length);

if (pIpHeader->Protocol == PROTOCOL_UDP)
{
//
// 解析UDP Header
//
if((Length - HeaderLength) < UDP_HEADER_LENGTH)
{
NdisGetNextBuffer(Buffer, &Buffer);
if(Buffer == NULL) return 0;
NdisQueryBufferSafe(Buffer, &VirtualAddress, &Length, HighPagePriority);
if(VirtualAddress != NULL && Length >= UDP_HEADER_LENGTH)
{
pUdpHeader = (PUDP_HEADER)(VirtualAddress);
}
else
{
return 0;
}
}
else
{
pUdpHeader = (PUDP_HEADER)((DWORD)pIpHeader + HeaderLength);
}

PrintUdp(pUdpHeader);
if (((ntohs(pUdpHeader->SourcePort) == 6665)
||
(ntohs(pUdpHeader->SourcePort) == 6666))
&&
((ntohs(pUdpHeader->DestinationPort) == 6665)
||
(ntohs(pUdpHeader->DestinationPort) == 6666)))
{
return 1;
}
}

return 0;

返回 为 1则转发系统函数,为0则不转发。
我现在的问题是所有的数据包为什么都被丢弃了?
zhou
驱动牛犊
驱动牛犊
  • 注册日期2001-08-01
  • 最后登录2007-08-10
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-26 15:35
if (((ntohs(pUdpHeader->SourcePort) == 6665)
||
(ntohs(pUdpHeader->SourcePort) == 6666))
&&
((ntohs(pUdpHeader->DestinationPort) == 6665)
||
(ntohs(pUdpHeader->DestinationPort) == 6666)))
{
return 1;
}
改为
if (((ntohs(pUdpHeader->SourcePort) == 6665)
||
(ntohs(pUdpHeader->SourcePort) == 6666))
||
((ntohs(pUdpHeader->DestinationPort) == 6665)
||
(ntohs(pUdpHeader->DestinationPort) == 6666)))
{
return 1;
}
试试看
dancy2000
游客

返回顶部