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

请大虾看看我的UDP数据包为什么丢了。和NDIS有关。

楼主#
更多 发布于:2003-10-19 16:47
我用ndis hook了几个关键的收发函数。
我的思路是这样的。
机器一启动,不能上网。所有的数据包在我自己的收发函数里直接调用return,也就是不转给系统的函数处理。

但是我想预留一个后门,比如说udp的6666端口的数据包还是可以转发。

我的一个函数如下:
int JudgePacket(
IN PNDIS_PACKET packet
)
{
PNDIS_BUFFER  FirstBuffer, Buffer;
UINT TotalPacketLength;
WORD EthernetFrameType;
int HeaderLength;
PIP_HEADER pIpHeader;
PETHERNET_FRAME pEthernetFrame;
void* pBiosBuffer;
PICMP_HEADER pIcmpHeader;
PTCP_HEADER pTcpHeader;
PUDP_HEADER pUdpHeader;

UINT PhysicalBufferCount;
UINT BufferCount;
PVOID VirtualAddress;
int Length = 0;

dprintf((\"JudgePacket\\n\"));

//
// 得到第一个NDIS_BUFFER
//
TotalPacketLength = 0;
NdisQueryPacket(packet
, &PhysicalBufferCount
, &BufferCount
, &FirstBuffer
, &TotalPacketLength
);

if(FirstBuffer == NULL)
return 0;

Buffer = FirstBuffer;

// 解析Ethernet Frame
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;
}  

而JudgePacket是hook的ProtocolCharacteristics->ReceiveHandler。

按道理说,我的UDP数据包应该此时可以监视到。
但我用PAP监视时,没有发现该UDP数据包。

而且很奇怪的是,我用softice跟踪这个包是发现,
EthernetFrameType 是0x1B88,根本就不是UDP数据包类型,
这是怎么回师?

请大虾帮忙看看。
游客

返回顶部