阅读:1176回复:0
如何更改KNdisPacket中的数据?
NDIS_STATUS PacketFilterAdapter::OnSend(const KNdisPacket& Original, KNdisPacket& Repackaged)
{ //复制所有数据到m_Buf unsigned char m_Buf[1514]; unsigned long n_buflen=0; KNdisBuffer n_buf=Original.QueryFirstBuffer(); while(n_buf.IsValid() && n_buflen<1514) { unsigned long blen=n_buf.Length(); if(blen>(1514-n_buflen)) blen=1514-n_buflen; memcpy(&m_Buf[n_buflen],n_buf.Address(),blen); n_buflen+=blen; n_buf=n_buf.GetNext(); } //非TCP数据,过 if(n_buflen<sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader)) { Repackaged.CloneDown(Original); return Status; } PETHeader pH=(PETHeader)m_Buf; //非IP协议,过 if(pH->type!=0x8) { Repackaged.CloneDown(Original); return Status; } PIPHeader pIH=(PIPHeader)&m_Buf[sizeof(_ETHeader)]; //非TCP协议,过 if(pIH->ipProtocol!=6) { Repackaged.CloneDown(Original); return Status; } bool findbd=false; for(unsigned long pindex=sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader);pindex<n_buflen-4;pindex++) { if(0==_strnicmp("baidu",(char*)&m_Buf[pindex],5)) { m_Buf[pindex]='a'; m_Buf[pindex+1]='b'; m_Buf[pindex+2]='c; m_Buf[pindex+3]='d'; m_Buf[pindex+4]='e'; pindex+=4; findbd=true; } } //不包含baidu字样,过 if(false==findbd) { Repackaged.CloneDown(Original); return Status; } //计算效验和 ChecksumTCP((PIPHeader)&m_Buf[sizeof(_ETHeader)],(PTCPHeader)&m_Buf[sizeof(_ETHeader)+sizeof(_IPHeader)],(char*)&m_Buf[sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader)],n_buflen-(sizeof(_ETHeader)+sizeof(_IPHeader)+sizeof(_TCPHeader))); //现在的m_Buf应该是个完整的网络数据包,下面怎么写呢? } |
|