我正在制作网络嗅探器。我已经在我的主网络接口(192.168.2.11)上打开了一个原始套接字。代码并不是真的需要,但如果你需要它,我可以提供。然后,我从收到的数据包(应包含一个IP头,后跟一个UDP头,后面跟着一个数据报)创建一个MemoryStream
。我将此MemoryStream
转换为BinaryReader
,并使用以下过程来解析IP标头
Version and header length BinaryReader.ReadByte() 'As two nibbles make a byte
Type of service BinaryReader.ReadByte()
Total length BinaryReader.ReadInt16()
Identification BinaryReader.ReadInt16()
Flags and offset BinaryReader.ReadInt16() 'As 3 bits + 13 bits is 16
Time to live BinaryReader.ReadByte()
Protocol BinaryReader.ReadByte()
Checksum BinaryReader.ReadInt16()
Source address BinaryReader.ReadInt32()
Destination address BinaryReader.ReadInt32()
(对此数据进行了更多处理,但未对BinaryReader
进行更改)
然后我查询Version
字段以查看它是否为17(UDP),如果是,我继续执行下一步,否则我将丢弃该过程。
现在我检查Internet标头长度(IHL)是否为5(即5 * 32或160位,或20字节)。我这样做是为了确保我的程序不会在不必要的IP选项上跳闸。如果不是5,我将丢弃该过程。
IP头完全解析...现在使用完全相同的BinaryReader
,我尝试解析封装的UDP头。我正在使用的代码是
Out("Source port?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Destination port?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Length?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Checksum?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
但我总是得到一些荒谬的东西......这是我的控制台应用程序的输出
Source port?: -364
Destination port?: 53
Length?: 35
Checksum?: -7570
目的地看起来不错,53为DNS,然后长度看起来也不错,但来源?港口怎么可能是负面的?校验和可能被允许为负数,我不确定。我的代码出了什么问题?如果你需要IP头输出,它就在这里......
Version: 4 (0100)
Internet header length: 5
Words (32 bits): 5
Octets (8 bits): 20
Bits (1 bit): 160
Type of service: 0x00000000
Precedence: 000 (Routine)
Delay: 0 (Normal Delay)
Throughput: 0 (Normal Throughput)
Reliability: 0 (Normal Reliability)
Total length: 55
Identification: 2866
Flags: 0x00
Reserved: False
Don't Fragment: False
More Fragments: False
Fragment offset: 0
Time to live: 128
Protocol: 17 (UDP)
Header checksum: -21977
Source address: 184723648 (192.168.2.11)
Destination address: 16951488 (192.168.2.1)
Payload length (bits): 288
答案 0 :(得分:0)
似乎问题不是我的解析方法(我知道),它是原始套接字返回的数据。当我使用Wireshark提供的十六进制转储时,它很棒。