阅读:980回复:0
请大虾看看我的UDP数据包为什么丢了。和NDIS有关。
我用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数据包类型, 这是怎么回师? 请大虾帮忙看看。 |
|