




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#截获本机数据包方法发表人:jiamao发表于:2010-04-06标签:C# socket 截包首先实例化一个socket:用来接收所有的数据C# 代码1. Sockets=newSocket(Sytem.Net.Sockets.AddressFamily.InterNetwork,System.Net.Sockets.SocketType.Raw, 2. System.Net.Sockets.ProtocolType.IP); 3. 4. s.Bind(newSystem.Net.IPEndPoint(IPAddress.Parse(Dns.GetHostAddresses(Dns.GetHostName()0.ToString(),0); 5. s.SetSocketOptionSystem.Net.Sockets.SocketOptionLevel.IP,System.Net.Sockets.SocketOptionName.HeaderIncluded,1); 6. s.IOControl(unchecked(int)0x98000001),newbyte41,0,0,0,newbyte4); s就可以接收到本机的所有数据包 分析数据包类型 ,当接收到数据包后。可以用下面的例来分析只要new一个ippacket(ref byte)实例就可以判断它的数据类例等信息C# 代码publicclassIPPacket/RFC791 publicbyteVersion; publicbyteHeaderLength; publicbyteTypeOfService; publicushortTotalLength; publicushortIdentification; publicbyteFlags; publicushortFragmentOffset; publicbyteTimeToLive; publicbyteProtocol; publicushortHeaderChecksum; publicSystem.Net.IPAddressSourceAddress; publicSystem.Net.IPAddressDestinationAddress; publicbytePacketData; publicICMPPacketICMP; publicTCPPacketTCP; publicUDPPacketUDP; publicIPPacket():base() publicIPPacket(refbytePacket) :base() try Version=(byte)(Packet04); HeaderLength=(byte)(Packet0&0x0F)*4); TypeOfService=Packet1; TotalLength=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,2); Identification=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,4); Flags=(byte)(Packet6&0xE0)5); FragmentOffset=(ushort)(System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,6)&0x1FFF); TimeToLive=Packet8; Protocol=Packet9; HeaderChecksum=(ushort)(System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,10); SourceAddress=newSystem.Net.IPAddress(System.BitConverter.ToInt32(Packet,12)&0x00000000FFFFFFFF); DestinationAddress=newSystem.Net.IPAddress(System.BitConverter.ToInt32(Packet,16)&0x00000000FFFFFFFF); PacketData=newbyteTotalLength-HeaderLength; System.Buffer.BlockCopy(Packet,HeaderLength,PacketData,0,PacketData.Length); catch switch(Protocol) case1:ICMP=newICMPPacket(refPacketData);break; case6:TCP=newTCPPacket(refPacketData);break; case17:UDP=newUDPPacket(refPacketData);break; publicbyteGetBytes() if(ICMP!=null)Protocol=1;PacketData=ICMP.GetBytes(); if(TCP!=null)Protocol=6;PacketData=TCP.GetBytes(refSourceAddress,refDestinationAddress); if(UDP!=null)Protocol=17;PacketData=UDP.GetBytes(refSourceAddress,refDestinationAddress); if(PacketData=null)PacketData=newbyte0; if(Version=0)Version=4; if(HeaderLength=0)HeaderLength=20; TotalLength=(ushort)(HeaderLength+PacketData.Length); bytePacket=newbyteTotalLength; if(TimeToLive=0)TimeToLive=128; Packet0=(byte)(Version&0x0F)4)|(HeaderLength/4)&0x0F); Packet1=TypeOfService; System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)TotalLength),0,Packet,2,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)Identification),0,Packet,4,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)(FragmentOffset&0x1F)|(Flags&0x03)13),0,Packet,6,2); Packet8=TimeToLive; Packet9=Protocol; System.Buffer.BlockCopy(System.BitConverter.GetBytes(short)0),0,Packet,10,2); System.Buffer.BlockCopy(SourceAddress.GetAddressBytes(),0,Packet,12,4); System.Buffer.BlockCopy(DestinationAddress.GetAddressBytes(),0,Packet,16,4); System.Buffer.BlockCopy(PacketData,0,Packet,HeaderLength,PacketData.Length); HeaderChecksum=GetChecksum(refPacket,0,HeaderLength-1); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)HeaderChecksum),0,Packet,10,2); returnPacket; publicstaticushortGetChecksum(refbytePacket,intstart,intend) uintCheckSum=0; inti; for(i=start;i16!=0)CheckSum=(CheckSum&0xFFFF)+(CheckSum16); return(ushort)CheckSum; publicclassTCPPacket/rfc793 publicushortSourcePort; publicushortDestinationPort; publicuintSequenceNumber; publicuintAcknowledgmentNumber; publicbyteDataOffset; publicbyteControlBits; publicushortWindow; publicushortChecksum; publicushortUrgentPointer; publicbyteOptions; publicbytePacketData; publicTCPPacket():base() publicTCPPacket(refbytePacket) :base() try SourcePort=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,0); DestinationPort=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,2); SequenceNumber=(uint)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,4); AcknowledgmentNumber=(uint)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,8); DataOffset=(byte)(Packet124)*4); ControlBits=(byte)(Packet13&0x3F); Window=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,14); Checksum=(ushort)(System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,16); UrgentPointer=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,18); Options=newbyteDataOffset-20; System.Buffer.BlockCopy(Packet,20,Options,0,Options.Length); PacketData=newbytePacket.Length-DataOffset; System.Buffer.BlockCopy(Packet,DataOffset,PacketData,0,Packet.Length-DataOffset); catch publicbyteGetBytes(refSystem.Net.IPAddressSourceAddress,refSystem.Net.IPAddressDestinationAddress) if(PacketData=null)PacketData=newbyte0; if(Options=null)Options=newbyte0; intOptionsLength=(int)(Options.Length+3)/4)*4; DataOffset=(byte)(20+OptionsLength); bytePacket=newbyte20+OptionsLength+PacketData.Length; System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)SourcePort),0,Packet,0,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)DestinationPort),0,Packet,2,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(int)SequenceNumber),0,Packet,4,4); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(int)AcknowledgmentNumber),0,Packet,8,4); Packet12=(byte)(Packet12&0x0F)|(DataOffset&0x0F)Options.Length)System.Buffer.BlockCopy(System.BitConverter.GetBytes(long)0),0,Packet,20+Options.Length,OptionsLength-Options.Length); System.Buffer.BlockCopy(PacketData,0,Packet,DataOffset,PacketData.Length); Checksum=GetChecksum(refPacket,0,DataOffset-1,refSourceAddress,refDestinationAddress); System.Buffer.BlockCopy(System.BitConverter.GetBytes(short)Checksum),0,Packet,16,2); returnPacketData; publicushortGetChecksum(refbytePacket,intstart,intend,refSystem.Net.IPAddressSourceAddress,refSystem.Net.IPAddressDestinationAddress) bytePseudoPacket; PseudoPacket=newbyte12+Packet.Length; System.Buffer.BlockCopy(SourceAddress.GetAddressBytes(),0,PseudoPacket,0,4); System.Buffer.BlockCopy(DestinationAddress.GetAddressBytes(),0,PseudoPacket,4,4); PseudoPacket8=0; PseudoPacket9=6; System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)Packet.Length),0,PseudoPacket,10,2); System.Buffer.BlockCopy(Packet,0,PseudoPacket,12,Packet.Length); returnIPPacket.GetChecksum(refPseudoPacket,0,PseudoPacket.Length-1); publicclassUDPPacket/rfc768 publicushortSourcePort; publicushortDestinationPort; publicushortLength; publicushortChecksum; publicbytePacketData; publicUDPPacket():base() publicUDPPacket(refbytePacket) :base() try SourcePort=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,0); DestinationPort=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,2); Length=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,4); Checksum=(ushort)System.Net.IPAddress.NetworkToHostOrder(System.BitConverter.ToInt16(Packet,6); PacketData=newbytePacket.Length-8; System.Buffer.BlockCopy(Packet,8,PacketData,0,Packet.Length-8); catch publicbyteGetBytes(refSystem.Net.IPAddressSourceAddress,refSystem.Net.IPAddressDestinationAddress) if(PacketData=null)PacketData=newbyte0; bytePacket=newbyte8+PacketData.Length; System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)SourcePort),0,Packet,0,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)DestinationPort),0,Packet,2,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)Length),0,Packet,4,2); System.Buffer.BlockCopy(System.BitConverter.GetBytes(short)0),0,Packet,6,2); System.Buffer.BlockCopy(PacketData,0,Packet,8,PacketData.Length); Checksum=GetChecksum(refPacket,0,8-1,refSourceAddress,refDestinationAddress); System.Buffer.BlockCopy(System.BitConverter.GetBytes(short)Checksum),0,Packet,6,2); returnPacketData; publicushortGetChecksum(refbytePacket,intstart,intend,refSystem.Net.IPAddressSourceAddress,refSystem.Net.IPAddressDestinationAddress) bytePseudoPacket; PseudoPacket=newbyte12+Packet.Length; System.Buffer.BlockCopy(SourceAddress.GetAddressBytes(),0,PseudoPacket,0,4); System.Buffer.BlockCopy(DestinationAddress.GetAddressBytes(),0,PseudoPacket,4,4); PseudoPacket8=0; PseudoPacket9=17; System.Buffer.BlockCopy(System.BitConverter.GetBytes(System.Net.IPAddress.HostToNetworkOrder(short)Packet.Length),0,PseudoPacket,10,2); System.Buffer.BlockCopy(Packet,0,PseudoPacket,12,Packet.Length); returnIPPacket.GetChecksum(refPseudoPacket,0,PseudoPacket.Length-1); publicclassICMPPacket/rfc792 publicbyteType; publicbyteCode; publicushortChecksum; publicbytePacketData; publicICMPMessageMessage; publicICMPPacket():base() publicICMPPacket(refbytePacket):base() try Type=(byte)Packet0; Code=(byte)Packet1; Checksum=(ushort)System.BitConverter.ToInt16(Packet,2); PacketData=newbytePacket.Length-4; System.Buffer.BlockCopy(Packet,4,PacketData,0,Packet.Length-4); catch switch(Type) case0:Message=newICMPEchoReply(refPacketData);break; case3:Message=newICMPDestinationUnreachable(refPacketData);break; case4:Message=newICMPSourceQuench(refPacketData);break; case5:Message=newICMPRedirect(refPacketData);break; case8:Message=newICMPEcho(refPacketData);break; case11:Message=newICMPTimeExceeded(refPacketData);break; case12:Message=newICMPParameterProblem(refPacketData);break; case13:Message=newICMPTimestamp(refPacketData);break; case14:Message=newICMPTimestampReply(refPacketData);break; case15:Message=newICMPInformationRequest(refPacketData);break; case16:Message=newICMPInformationReply(refPacketData);break; publicbyteGetBytes() if(Message!=null)PacketData=Message.GetBytes(); if(MessageisICMPEchoReply)Type=0;else if(MessageisICMPDestinationUnreachable)Type=3;else if(MessageisICMPSourceQuench)Type=4;else if(MessageisICMPRedirect)Type=5;else if(MessageisICMPEcho)Type=8;else if(MessageisICMPTimeExceeded)Type=11;else if(MessageisICMPParameterProblem)Type=12;else if(MessageisICMPTimestamp)Type=13;else if(MessageisICMPTimestampReply)Type=14;else if(MessageisICMPInformationRe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 收购粮食行业知识培训课件
- 收获真正的友谊
- 福建省泉州市德化县2025年中考适应性考试数学试题含解析
- 支部应急知识培训课件稿
- 支气管扩张并咯血课件
- 攀枝花消防安全知识培训课件
- 2026届沧州市高三语文上学期开学测试卷附答案解析
- 播音主持课件自我介绍
- 2024年电梯维修检测员资格基础知识考试题与答案
- 2024年高速道路清障与协作交通顺畅人员安全技能知识试题库及答案
- 产品线库存管理与补货预测系统
- 2025年高考(山东卷)历史真题及答案
- 妇女维权法律知识讲座
- 2025年内蒙古自治区中考语文真题含答案
- 2025版危险货物道路运输综合预案(电石)
- 妇产科学-第十二章-正常分娩课件
- 腓肠神经皮瓣课件
- 1【L】系列离心式冷水机组技术手册
- 广雅分班测英语试题
- 年三菱帕杰罗pajerosport劲畅原厂维修手册
- 医院压力性损伤处理流程
评论
0/150
提交评论