锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

passthru 2010-11-12

时间:2022-10-16 01:00:00 二极管pdlc05

最近用passthru简单改,对tcp和udp简单加密的数据包。贴上计算验证和代码 //计算校验和 USHORTchecksum(USHORT*buffer,intsize) { unsignedlongcksum=0; while(size>1) { cksum =*buffer ; size-=sizeof(USHORT); } if(size) { cksum =*(UCHAR*)buffer; } //将32位数转换为16 while(cksum>>16) { cksum=(cksum>>16) (cksum&0xffff); } return(USHORT)(~cksum); } ULONGntohl(INULONGdata) { _asm { movecx,data moveax,ecx movedx,ecx shleax,10h andedx,0FF00h oreax,edx movedx,ecx shredx,10h andecx,0FF0000h oredx,ecx shleax,8 shredx,8 oreax,edx } } USHORTntohs(USHORTdata) { USHORTsRet; _asm { movcx,data movah,cl moval,ch movsRet,ax } returnsRet; } //------------------------------------------------------------------------- //PacketCheckSum //计算数据包的据包 //参数:packet-待处理数据(包装数据的指针) //------------------------------------------------------------------------- voidPacketCheckSum(PUCHARpacket) { Dlc_Header*pdlc_header=NULL;//以太头指针 Ip_Header*pip_header=NULL;//IP头指针 USHORTattachsize=0;///传输层协议头和附加数据的总长度 pdlc_header=(Dlc_Header*)packet;//判断ethertype,如果不是IP不处理包则 if(pdlc_header->ethertype!=0x0008)//不是IP协议直接返回 { return; } pip_header=(Ip_Header*)(packet 14); //TCP包 if(0x06==pip_header->proto) { Tcp_Header*ptcp_header=NULL;//TCP头指针 Tcp_Psd_Header*ptcp_psd_header=NULL; ptcp_header=(Tcp_Header*)(packet 14 ((pip_header->ver_len)&15)*4); attachsize=ntohs(pip_header->total_len)-(((pip_header->ver_len)&15)*4); ptcp_psd_header=(Tcp_Psd_Header*)ExAllocatePoolWithTag(NonPagedPool,attachsize sizeof(Tcp_Psd_Header),'x70'); if(!ptcp_psd_header) { DbgPrint("计算验证和失败,内存不足\n"); return; } RtlZeroMemory(ptcp_psd_header,attachsize sizeof(Tcp_Psd_Header));//填充伪TCP头0 ptcp_psd_header->destip=pip_header->destIP; ptcp_psd_header->sourceip=pip_header->sourceIP; ptcp_psd_header->mbz=0; ptcp_psd_header->ptcl=0x06; ptcp_psd_header->tcpl=ntohs(attachsize);//计算TCP校验和 ptcp_header->chksum=0; RtlCopyMemory((unsignedchar*)ptcp_psd_header sizeof(Tcp_Psd_Header),(unsignedchar*)ptcp_header,attachsize); ptcp_header->chksum=checksum((unsignedshort*)ptcp_psd_header, attachsize sizeof(Tcp_Psd_Header)); //计算ip头的校验和 pip_header->checksum=0; pip_header->checksum=checksum((unsignedshort*)pip_header,20); &nbs;  //计算完成释放内存        ExFreePool(ptcp_psd_header);        return;     }     //UDP包     if(0x11==pip_header->proto)     {        Udp_Header *pudp_header=NULL; //UDP头指针         Udp_Psd_Header *pudp_psd_header=NULL;        pudp_header=(Udp_Header *)(packet+14+((pip_header->ver_len)&15)*4);         attachsize=ntohs(pip_header->total_len)-(((pip_header->ver_len)&15)*4);        pudp_psd_header=(Udp_Psd_Header *)ExAllocatePoolWithTag(NonPagedPool,attachsize+sizeof(Udp_Psd_Header),'x70');        if(!pudp_psd_header)        {         DbgPrint("计算校验和失败,内存不足 \n");         return;        }        RtlZeroMemory(pudp_psd_header,attachsize+sizeof(Udp_Psd_Header));   //填充伪UDP头0        pudp_psd_header->destip=pip_header->destIP;        pudp_psd_header->sourceip=pip_header->sourceIP;        pudp_psd_header->mbz=0;        pudp_psd_header->ptcl=0x11;        pudp_psd_header->udpl=ntohs(attachsize);        //计算UDP校验和        pudp_header->chksum=0;        RtlCopyMemory((unsigned char *)pudp_psd_header+sizeof(Udp_Psd_Header),(unsigned char *)pudp_header,attachsize);        pudp_header->chksum=checksum((unsigned short *)pudp_psd_header,attachsize+sizeof(Udp_Psd_Header));        //计算ip头的校验和        pip_header->checksum=0;        pip_header->checksum=checksum((unsigned short *)pip_header,20);         //计算完成释放内存        ExFreePool(pudp_psd_header);        return;     }     return; }

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章