arhimed-676494 | Дата: Четверг, 20.02.2014, 14:45 | Сообщение # 1 |
Рядовой
Группа: Администраторы
Сообщений: 2
Статус: Offline
| Создайте форму и назовите её Fr_Proxy На эту форму положите TreeView и назовите его TV1
Public Class Fr_Proxy Private IP_Byte As Byte() Private IP As String = String.Empty Private Client As Socket
Private Sub Fr_Proxy_Load(sender As Object, e As System.EventArgs) Handles Me.Load Me.Visible = True Listener() End Sub
Public Sub Listener() Dim port As Int32 = 8080 Dim strHostName As String = Dns.GetHostName ' Получаем имя компьютера Dim Host_Name As IPHostEntry = Dns.GetHostEntry(strHostName) ' Ищем хост по имени Dim Nomer As Long = 0
For Each ipaddress As IPAddress In Host_Name.AddressList ' Перечисляем IP адреса If InStr(ipaddress.ToString(), ":") = 0 Then IP = ipaddress.ToString End If Next
Dim IPadr As IPAddress = IPAddress.Parse(IP) Dim sEndPoint As IPEndPoint = New System.Net.IPEndPoint(IPadr, port) Client = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP) Client.Bind(sEndPoint) Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, True) 'применяется только к пакетам IP, устанавливаем "Включать заголовок"
Dim byTrue As Byte() = {0, 0, 0, 0} '{1, 0, 0, 0} Dim byOut(3) As Byte Dim bytesRec As Integer
Client.IOControl(IOControlCode.ReceiveAll, byTrue, byOut)
Do If Client.Available > 0 Then Nomer += 1
ReDim IP_Byte(Client.Available - 1) bytesRec = Client.Receive(IP_Byte, SocketFlags.None) IP_Parser(IP_Byte, bytesRec, Nomer) End If
Application.DoEvents() If Me.Visible = False Then Exit Do Loop
End End Sub
'заголовки IP полей Public Structure Struct_IP_Headers Public Version As Byte '4 бит версия Public HeaderLength As Byte '4 бит длина заголовка
' 0 - 2 (Precedence) приоритет данного IP-сегмента, ' 3 - (delay) требование ко времени задержки передачи IP-сегмента (0 — нормальная, 1 — низкая задержка) ' 4 - (throughput) требование к пропускной способности маршрута, по которому должен отправляться IP-сегмент (0 — низкая, 1 — высокая пропускная способность) ' 5 - (reliability) требование к надежности передачи IP-сегмента (0 — нормальная, 1 — высокая надежность) ' 6 - 7 (ECN) явное сообщение о задержке (управление IP-потоком). Public Differential As Byte '8 бит Public Precedence As Byte Public Delay As Byte Public ThroughPut As Byte Public Reliability As Byte Public ECN As Byte
Public TotalLength As UShort '16 бит общая длина пакета Public Identification As UShort '16 бит для идентификации
Public FlagsAndOffset As UShort '8 бит для флагов и осколков. 1 означает смещение 64 бита Public Flag1 As Byte 'Первый бит флагов (всегда равен нулю) Public Flag2 As Byte 'Второй бит флагов DF (don’t fragment) определяет можно ли фрагментировать пакет Public Flag3 As Byte 'Третий бит флагов MF (more fragments) является ли этот пакет последним
Public TTL As Byte '8 бит для TTL (Time To Live) Public Protocol As Byte '8 бит для основной протокол Public CheckSum As Integer 'Шестнадцать бит для контрольную сумму заголовка Public IP_Source As String '4 байта (32 бит) IP-адреса источника Public IP_Destination As String '4 байта (32 бит) IP адрес назначения Public Options As Integer '4 байта (32 бит) IP адрес назначения Public Copy_Options As Byte '1 бит опция копируется во фрагменты при фрагментации Public Class_Options As Byte '2 бита Поле класса опций может принимать 4 значения: 0 – управление; 1 – зарезервирован; 2 – отладка и измерения; 3 – зарезервирован. Public Namber_Options As Byte '5 бит. Номер опции End Structure Dim IP_Headers As Struct_IP_Headers
Private Sub IP_Parser(ByRef IP_Byte As Byte(), ByRef nReceived As Integer, ByRef N As Long)
IP_Headers.Version = IP_Byte(0) >> 4 IP_Headers.HeaderLength = ((IP_Byte(0) << 4) >> 4) * 4 'Умножаем на четыре, чтобы получить точную длину IP заголовка. Т.к. длина указывается в 32-битных словах
'1 байт(8 бит) дифференцированные услуги задает приоритетность пакета IP_Byte(1) IP_Headers.Differential = IP_Byte(1) IP_Headers.Precedence = IP_Byte(1) >> 5 IP_Headers.Delay = (IP_Byte(1) << 3) >> 7 IP_Headers.ThroughPut = (IP_Byte(1) << 4) >> 7 IP_Headers.Reliability = (IP_Byte(1) << 5) >> 7 IP_Headers.ECN = (IP_Byte(1) << 6) >> 6
'2 байта (16 бит) общая длина IP пакета IP_Byte(2) IP_Byte(3) IP_Headers.TotalLength = IP_Byte(3) + IP_Byte(2) * 256
'2 байта (16 бит) идентификации. Все фрагменты IP пакета должны иметь одинаковое значение этого поля.IP_Byte(4) IP_Byte(5) IP_Headers.Identification = IP_Byte(5) + IP_Byte(4) * 256
'2 байта (16 бит) содержат флаги и фрагментации смещение IP_Byte(6) IP_Byte(7) 'Флаги IP_Headers.Flag1 = IP_Byte(6) >> 7 IP_Headers.Flag2 = (IP_Byte(6) << 1) >> 7 IP_Headers.Flag3 = (IP_Byte(6) << 2) >> 7
'Смещение 'IP_Headers.FlagsAndOffset = IP_Byte(7) + IP_Byte(6) * 256 'IP_Headers.FlagsAndOffset = (((IP_Byte(7) + IP_Byte(6) * 256) << 3) >> 3) * 8 'задается количеством восьмибайтовых блоков, поэтому умножаем на 8 IP_Headers.FlagsAndOffset = (IP_Byte(7) + ((IP_Byte(6) << 3) >> 3) * 256) * 8
'1 байт(8 бит) значение TTL IP_Byte(8) IP_Headers.TTL = IP_Byte(8)
'1 байт(8 бит). Протокол заключенный в пакет IP_Byte(9) IP_Headers.Protocol = IP_Byte(9)
'2 байта (16 бит) контрольная сумма заголовка IP_Byte(10) IP_Byte(11) IP_Headers.CheckSum = IP_Byte(11) + IP_Byte(10) * 256
'4 байта (32 бит) IP-адреса источника (SOURCE) IP_Byte(12-15) IP_Headers.IP_Source = IP_Byte(12).ToString + "." + IP_Byte(13).ToString + "." + IP_Byte(14).ToString + "." + IP_Byte(15).ToString
'4 байта (32 бит) IP адрес назначения (DESTINATION) IP_Byte(16-19) IP_Headers.IP_Destination = IP_Byte(16).ToString + "." + IP_Byte(17).ToString + "." + IP_Byte(18).ToString + "." + IP_Byte(19).ToString
'4 байта (32 бит) Параметры If IP_Headers.HeaderLength > 20 Then IP_Headers.Options = IP_Headers.HeaderLength - 19 IP_Headers.Copy_Options = IP_Byte(20) >> 7 IP_Headers.Class_Options = (IP_Byte(20) << 1) >> 6 IP_Headers.Namber_Options = (IP_Byte(20) << 3) >> 3 Else IP_Headers.Options = 0 End If
'Копировать данные, переносимые дейтаграммы в другой массив, так что в соответствии с протоколом перевозимого в IP-датаграммы Dim IPData(IP_Headers.TotalLength - IP_Headers.HeaderLength - 1) As Byte Array.Copy(IP_Byte, IP_Headers.HeaderLength, IPData, 0, IP_Headers.TotalLength - IP_Headers.HeaderLength) 'начать копирование с конца заголовка
TV1.Nodes.Add(N, N.ToString) With TV1.Nodes(N.ToString).Nodes .Add(0, "Версия IP : " + IP_Headers.Version.ToString) .Add(1, "Длина IP заголовка : " + IP_Headers.HeaderLength.ToString) .Add(2, "Приоритет: " + IP_Headers.Differential.ToString) TV1.Nodes(N.ToString).Nodes(2).Nodes.Add(0, "Приоритет IP-сегмента: " + IP_Headers.Precedence.ToString) TV1.Nodes(N.ToString).Nodes(2).Nodes.Add(1, "Задержка IP-сегмента: " + IP_Headers.Delay.ToString + " (0 — нормальная, 1 — низкая)") TV1.Nodes(N.ToString).Nodes(2).Nodes.Add(2, "Пропускная способность: " + IP_Headers.ThroughPut.ToString + " (0 — низкая, 1 — высокая)") TV1.Nodes(N.ToString).Nodes(2).Nodes.Add(3, "Надёжность передачи: " + IP_Headers.Reliability.ToString + " (0 — нормальная, 1 — высокая)") TV1.Nodes(N.ToString).Nodes(2).Nodes.Add(4, "Явное сообщение о задержке: " + IP_Headers.ECN.ToString + " (управление IP-потоком)")
.Add(3, "Длина всего пакета: " + IP_Headers.TotalLength.ToString) .Add(4, "Последовательность фрагментов (Identification): " + IP_Headers.Identification.ToString)
.Add(5, "Флаги. " + IIf(IP_Headers.Flag2 = 1, "Фрагментация запрещена. ", String.Empty) + IIf(IP_Headers.Flag3 = 1, "Последний пакет.", String.Empty)) 'TV1.Nodes(N.ToString).Nodes(5).Nodes.Add(0, "Флаг1: " + IP_Headers.Flag1.ToString + " Всегда равен 0") 'TV1.Nodes(N.ToString).Nodes(5).Nodes.Add(1, "Флаг2: " + IP_Headers.Flag2.ToString + " Фрагментация запрещена") 'TV1.Nodes(N.ToString).Nodes(5).Nodes.Add(2, "Флаг3: " + IP_Headers.Flag3.ToString + " Последний пакет = 1")
.Add(6, "Смещение: " + IP_Headers.FlagsAndOffset.ToString) .Add(7, "Время жизни пакета: " + IP_Headers.TTL.ToString)
Dim Protocol As String Select Case IP_Headers.Protocol Case 1 Protocol = "1. ICMP() Протокол контрольных сообщений" Case 2 Protocol = "2. IGMP() Протокол управления группой хостов" Case 4 Protocol = "4. IP поверх IP (инкапсуляция)" Case 6 Protocol = "6. TCP" Case 8 Protocol = "8. EGP() Протокол внешней маршрутизации (устарел)" Case 9 Protocol = "9. IGP() Протокол внутренней маршрутизации (устарел)" Case 17 Protocol = "17. UDP" Case 46 Protocol = "46. RSVP() Протокол резервирования ресурсов при мультикастинге" Case 88 Protocol = "88. IGRP() Протокол внутренней маршрутизации от фирмы cisco" Case 89 Protocol = "89. OSPF() Протокол внутренней маршрутизации" Case Else Protocol = "Неизвестный протокол" End Select .Add(8, "Протокол: " + Protocol)
.Add(9, "Контрольная сумма: " + IP_Headers.CheckSum.ToString) .Add(10, "IP источника: " + IP_Headers.IP_Source) .Add(11, "IP получателя: " + IP_Headers.IP_Destination) .Add(12, "Параметры: " + IP_Headers.Options.ToString) .Add(13, "Данные " + Protocol + ": " + IPData.Length.ToString) End With
Dim IP_Data_Send() As Byte = IP_Send()
Select Case IP_Headers.Protocol Case 1 'ICMP() Протокол контрольных сообщений Case 2 'IGMP() Протокол управления группой хостов Case 4 'IP поверх IP (инкапсуляция) Case 6 'TCP TCP_Parser(IPData, N) TV1.Nodes(N.ToString).ForeColor = Color.CadetBlue Dim TCP_Data_Send() As Byte = TCP_Send(IPData) 'Считаем всю длину IP пакета в байтах IP_Data_Send(2) = (CUShort(IP_Data_Send.Length + TCP_Data_Send.Length)) >> 8 IP_Data_Send(3) = (CUShort(IP_Data_Send.Length + TCP_Data_Send.Length) << 8) >> 8 'Контрольная сумма IP пакета Dim IP_CheckSum As UShort = CreateChecksum(IP_Data_Send, IP_Data_Send.Length) 'Dim IP_CheckSum2 As UShort = Calculate(IP_Data_Send, IP_Data_Send.Length - 1) IP_Data_Send(10) = IP_CheckSum >> 8 IP_Data_Send(11) = (IP_CheckSum << 8) >> 8 Dim Send_Bytes(IP_Data_Send.Length + TCP_Data_Send.Length - 1) As Byte Array.Copy(IP_Data_Send, 0, Send_Bytes, 0, IP_Data_Send.Length) Array.Copy(TCP_Data_Send, 0, Send_Bytes, IP_Data_Send.Length, TCP_Data_Send.Length) 'Dim tmp As Integer
Client.SendTo(Send_Bytes, New System.Net.IPEndPoint(IPAddress.Parse(IP_Headers.IP_Source), Port))
Stop Case 8 'EGP() Протокол внешней маршрутизации (устарел) Case 9 'IGP() Протокол внутренней маршрутизации (устарел) Case 17 'UDP() UDP_Parser(IPData, N) TV1.Nodes(N.ToString).ForeColor = Color.DarkRed Case 46 'RSVP() Протокол резервирования ресурсов при мультикастинге Case 88 'IGRP() Протокол внутренней маршрутизации от фирмы cisco Case 89 'OSPF() Протокол внутренней маршрутизации End Select
End Sub
Private Function IP_Send() As Byte() Dim Data_Send(19) As Byte Dim IP_Total_Lenght As UShort 'Общая длина IP пакета
'----- Собираем IP заголовок -----
Data_Send(0) = 69 'Версия 4, Длина заголовка 20 байт. Data_Send(1) = 0 'Приоритетность пакета
'Требуется подсчитать вконце (вся длина IP пакета в байтах) Data_Send(2) = IP_Total_Lenght >> 8 Data_Send(3) = (IP_Total_Lenght << 8) >> 8
Data_Send(4) = 0 'Идентификатор фрагментов Data_Send(5) = 0 Data_Send(6) = 0 'Смещение фрагметов /8 Data_Send(7) = 0 Data_Send(8) = 50 'Количество маршрутизаторов кторое требуется пройти Data_Send(9) = IP_Byte(9) 'Протокол
'Требуется подсчитать вконце Data_Send(10) = 0 'контрольная сумма IP заголовка Data_Send(11) = 0
'IP-адреса источника и получателя меняем местами Data_Send(12) = IP_Byte(16) Data_Send(13) = IP_Byte(17) Data_Send(14) = IP_Byte(18) Data_Send(15) = IP_Byte(19) Data_Send(16) = IP_Byte(12) Data_Send(17) = IP_Byte(13) Data_Send(18) = IP_Byte(14) Data_Send(19) = IP_Byte(15)
Return Data_Send
End Function
'----- Собираем TCP заголовок ----- Private Function TCP_Send(TCP_Byte() As Byte) As Byte() Dim Data_Send(19) As Byte 'Меняем порты местами Data_Send(0) = TCP_Byte(2) Data_Send(1) = TCP_Byte(3) Data_Send(2) = TCP_Byte(0) Data_Send(3) = TCP_Byte(1)
If TCP_Headers.URG = 0 And TCP_Headers.ACK = 0 And TCP_Headers.PSH = 0 And TCP_Headers.RST = 0 And TCP_Headers.SYN = 1 And TCP_Headers.FIN = 0 Then 'SequenceNumber Data_Send(4) = 0 Data_Send(5) = 0 Data_Send(6) = 0 Data_Send(7) = 1 'AcknowledgementNumber Dim AcknowledgementNumber As UInteger = TCP_Headers.SequenceNumber + 1
Data_Send(8) = AcknowledgementNumber >> 24 Data_Send(9) = (AcknowledgementNumber << 8) >> 24 Data_Send(10) = (AcknowledgementNumber << 16) >> 24 Data_Send(11) = (AcknowledgementNumber << 24) >> 24
Data_Send(12) = (20 / 4) << 4 'Длина заголовка 20 байт Data_Send(13) = 18 'Флаги 10010 Data_Send(14) = TCP_Headers.WindowSize >> 8 'WindowSize Data_Send(15) = (TCP_Headers.WindowSize << 8) >> 8 'WindowSize 'Контрольная сумма. Вычислим после. Dim CS As UShort = CheckSumm(Data_Send) Data_Send(16) = CS >> 8 Data_Send(17) = (CS << 8) >> 8 Data_Send(18) = 0 'Конец важных данных. Data_Send(19) = 0 'Конец важных данных. End If
If TCP_Headers.URG = 0 And TCP_Headers.ACK = 1 And TCP_Headers.PSH = 0 And TCP_Headers.RST = 0 And TCP_Headers.SYN = 1 And TCP_Headers.FIN = 0 Then Stop End If
Return Data_Send End Function
Public Structure Struct_TCP_Headers Public PortSourceTCP As UShort '16 бит. Порт источника Public PortDestinationTCP As UShort '16 бит. Порт назначения Public SequenceNumber As UInteger '32 бита. Номер в последовательности Public AcknowledgementNumber As UInteger '32 бита. Номер подтверждения 'Public OffsetAndReserved As Byte '0 - 3 Смещение данных (Длина заголовка) и 4 - 7 зарезервированные поля Public Header_Length_TCP As Byte '0 - 3 Смещение данных (Длина заголовка) Public Flags As Byte '0 - 1 зарезервированные поля, 2 - 7 Флаги URG, ACK, PSH, RST, SYN, FIN Public URG As Byte 'Указатель важной информации Public ACK As Byte 'Номер подтверждения Public PSH As Byte 'инструктирует получателя протолкнуть данные, накопившиеся в приемном буфере, в приложение пользователя Public RST As Byte 'Оборвать соединения, сбросить буфер (очистка буфера) Public SYN As Byte 'Синхронизация номеров последовательности Public FIN As Byte 'завершение соединения Public WindowSize As UShort '16 бит. Размер окна (число, определяющее в байтах размер данных, которые отправитель готов принять) Public CheckSum As UShort '16 бит. Поле контрольной суммы — это 16-битное дополнение к сумме всех 16-битных слов заголовка(включая псевдозаголовок) и данных. Если сегмент, по которому вычисляется контрольная сумма, имеет длину не кратную 16-ти битам, то длина сегмента увеличивается до кратной 16-ти, за счет дополнения к нему справа нулевых битов заполнения. Биты заполнения (0) не передаются в сообщении и служат только для расчёта контрольной суммы. При расчёте контрольной суммы значение самого поля контрольной суммы принимается равным 0. Public Marker As UShort '16-битовое значение положительного смещения от порядкового номера в данном сегменте. Это поле указывает порядковый номер октета, которым заканчиваются важные (urgent) данные. Поле принимается во внимание только для пакетов с установленным флагом URG. Public Options() As String Public Option_Type() As Byte 'Тип опции Public Option_Lenght() As Byte 'Длина опции Public Option_Data() As String 'Данные опции End Structure
Dim TCP_Headers As New Struct_TCP_Headers
Private Sub TCP_Parser(IP_Data As Byte(), ByRef N As Long) TCP_Headers.PortSourceTCP = IP_Data(1) + IP_Data(0) * 256 '2 байта (16 бит) Порт источника TCP_Headers.PortDestinationTCP = IP_Data(3) + IP_Data(2) * 256 '2 байта (16 бит) Порт назначения TCP_Headers.SequenceNumber = IP_Data(7) + IP_Data(6) * 256 + IP_Data(5) * (256 ^ 2) + IP_Data(4) * (256 ^ 3) '4 байта (32 бит) Номер в последовательности TCP_Headers.AcknowledgementNumber = IP_Data(11) + IP_Data(10) * 256 + IP_Data(9) * (256 ^ 2) + IP_Data(8) * (256 ^ 3) '4 байта (32 бит) Номер подтверждения TCP_Headers.Header_Length_TCP = IP_Data(12) '1 байт(8 бит) 0-3 Смещение (Длина заголовка) и 4-7 зарезервированы. Вычисляем длину заголовка Dim TCP_Headers_Length = IP_Data(12) >> 4 TCP_Headers.Header_Length_TCP = TCP_Headers_Length * 4 TCP_Headers.Flags = IP_Data(13) '1 байт(8 бит) 0 - 1 зарезервированные поля, 3 - 7 Флаги URG, ACK, PSH, RST, SYN, FIN TCP_Headers.URG = (IP_Data(13) << 2) >> 7 '100000 TCP_Headers.ACK = (IP_Data(13) << 3) >> 7 '010000 TCP_Headers.PSH = (IP_Data(13) << 4) >> 7 '001000 TCP_Headers.RST = (IP_Data(13) << 5) >> 7 '000100 TCP_Headers.SYN = (IP_Data(13) << 6) >> 7 '000010 TCP_Headers.FIN = (IP_Data(13) << 7) >> 7 '000001 TCP_Headers.WindowSize = IP_Data(15) + IP_Data(14) * 256 '16 бит. Размер окна TCP_Headers.CheckSum = IP_Data(17) + IP_Data(16) * 256 '16 бит. Поле контрольной суммы TCP_Headers.Marker = IP_Data(19) + IP_Data(18) * 256 '16 бит. Конец важных данных.
If TCP_Headers.Header_Length_TCP > 20 Then TCP_Options(IP_Data, TCP_Headers) End If
Dim TCP_Data(IP_Data.Length - TCP_Headers.Header_Length_TCP - 1) As Byte Array.Copy(IP_Data, TCP_Headers.Header_Length_TCP, TCP_Data, 0, IP_Data.Length - TCP_Headers.Header_Length_TCP) 'начать копирование с конца заголовка Dim data As String = System.Text.Encoding.UTF8.GetString(TCP_Data, 0, TCP_Data.Length)
With TV1.Nodes(N.ToString).Nodes(13).Nodes .Add(0, "Порт источника: " + TCP_Headers.PortSourceTCP.ToString) ' + ". " + currentProcess.ProcessName + ". ID = " + currentProcess.Id.ToString) .Add(1, "Порт получателя: " + TCP_Headers.PortDestinationTCP.ToString) ' + ". " + currentProcess2.ProcessName + ". ID = " + currentProcess2.Id.ToString) .Add(2, "Номер в последовательности: " + TCP_Headers.SequenceNumber.ToString) .Add(3, "Номер подтверждения: " + TCP_Headers.AcknowledgementNumber.ToString) .Add(4, "Длина заголовка: " + TCP_Headers.Header_Length_TCP.ToString) .Add(5, "Flags: " + TCP_Headers.Flags.ToString + IIf(TCP_Headers.URG = 1, " Важная информация.", String.Empty) + IIf(TCP_Headers.ACK = 1, " Следующий номер правильный.", String.Empty) + IIf(TCP_Headers.PSH = 1, " Протолкнуть данные.", String.Empty) + IIf(TCP_Headers.RST = 1, " Оборвать соединение (пересоединиться).", String.Empty) + IIf(TCP_Headers.SYN = 1, " Синхронизация номеров очереди.", String.Empty) + IIf(TCP_Headers.FIN = 1, " Завершить соединение.", String.Empty)) With TV1.Nodes(N.ToString).Nodes(13).Nodes(5).Nodes .Add("URG = " + TCP_Headers.URG.ToString + " Указатель важной информации.") .Add("ACK = " + TCP_Headers.ACK.ToString + " Следующий номер правильный.") .Add("PSH = " + TCP_Headers.PSH.ToString + " Протолкнуть данные.") .Add("RST = " + TCP_Headers.RST.ToString + " Оборвать соединение (пересоединиться).") .Add("SYN = " + TCP_Headers.SYN.ToString + " Синхронизация номеров очереди.") .Add("FIN = " + TCP_Headers.FIN.ToString + " Завершить соединение.") End With .Add(6, "Ширина окна: " + TCP_Headers.WindowSize.ToString) .Add(7, "Контрольная сумма: " + TCP_Headers.CheckSum.ToString + ", " + CheckSumm(IP_Data).ToString) .Add(8, "Последний байт важных данных: " + TCP_Headers.Marker.ToString) .Add(9, "Опции: ")
If TCP_Headers.Header_Length_TCP > 20 Then For i = 0 To TCP_Headers.Options.Length - 1 With TV1.Nodes(N.ToString).Nodes(13).Nodes(9).Nodes .Add(i, "Опция: " + TCP_Headers.Options(i).ToString) .Add(i, "Тип: " + TCP_Headers.Option_Type(i).ToString) .Add(i, "Длина: " + TCP_Headers.Option_Lenght(i).ToString) .Add(i, "Данные: " + TCP_Headers.Option_Data(i).ToString) End With Next End If .Add(10, "Данные: " + data) End With End Sub
Private Sub TCP_Options(ByRef IP_Data() As Byte, ByRef TCP_Headers As Struct_TCP_Headers) 'Dim TCP_Headers As Struct_TCP_Headers Dim Option_Byte(TCP_Headers.Header_Length_TCP - 21) As Byte Array.Copy(IP_Data, 20, Option_Byte, 0, Option_Byte.Length)
Dim Flag As Byte = 0 'Dim Flag2 As Boolean = False Dim Number As Integer = 0 Dim Options As String = String.Empty Dim Type As Byte = 0 Dim Lenght As Byte = 0 Dim Datas As String = String.Empty
For i = 0 To Option_Byte.Length - 1 Select Case Flag Case 0 Number += 1 Lenght = 0 Datas = String.Empty Type = Option_Byte(i) Select Case Type Case 0 Options = "0. Конец списка опций" Flag = 0 Exit For Case 1 Options = "1. Нет опций" Flag = 0 Case 2 Options = "2. MSS. Максимальный размер сегмента. SYN = " + TCP_Headers.SYN.ToString Flag = 1 Case 3 Options = "3. WSOPT. Масштаб окна. SYN = " + TCP_Headers.SYN.ToString Flag = 1 Case 4 Options = "4. SACK permitted. Разрешены избирательные подтверждения. SYN = " + TCP_Headers.SYN.ToString Flag = 1 Case Else Options = Type.ToString Flag = 1 End Select Case 1 Lenght = Option_Byte(i) Flag = 2 Case 2 Select Case Lenght Case 3 Datas = Option_Byte(i).ToString Case 4 Datas = (Option_Byte(i) * 256 + Option_Byte(i + 1)).ToString End Select Datas += " " + System.Text.Encoding.UTF8.GetString(Option_Byte, i, Lenght - 2) i += Lenght - 3 Flag = 0 End Select
ReDim Preserve TCP_Headers.Options(Number - 1) ReDim Preserve TCP_Headers.Option_Type(Number - 1) ReDim Preserve TCP_Headers.Option_Lenght(Number - 1) ReDim Preserve TCP_Headers.Option_Data(Number - 1)
TCP_Headers.Options(Number - 1) = Options TCP_Headers.Option_Type(Number - 1) = Type TCP_Headers.Option_Lenght(Number - 1) = Lenght TCP_Headers.Option_Data(Number - 1) = Datas Next End Sub
Public Structure Struct_UDP_Headers Public PortSourceUDP As UShort '16 бит. Порт источника Public PortDestinationUDP As UShort '16 бит. Порт назначения Public Length_UDP As UShort '16 бит. Длина датаграммы Public Checksum_UDP As UShort '16 бит. Контрольная сумма End Structure
Private Sub UDP_Parser(IP_Data As Byte(), ByRef N As Long) Dim UDP_Data As New Struct_UDP_Headers Dim Datas As String = String.Empty
UDP_Data.PortSourceUDP = IP_Data(1) + IP_Data(0) * 256 '2 байта (16 бит) Порт источника UDP_Data.PortDestinationUDP = IP_Data(3) + IP_Data(2) * 256 '2 байта (16 бит) Порт назначения UDP_Data.Length_UDP = IP_Data(5) + IP_Data(4) * 256 '2 байта (16 бит) Длина датаграммы UDP_Data.Checksum_UDP = IP_Data(7) + IP_Data(6) * 256 '2 байта (16 бит) Контрольная сумма
Dim Data_UDP(IP_Data.Length - 9) As Byte If IP_Data.Length > 8 Then Array.Copy(IP_Data, 8, Data_UDP, 0, IP_Data.Length - 8) Datas = System.Text.Encoding.UTF8.GetString(Data_UDP, 0, Data_UDP.Length) End If
With TV1.Nodes(N.ToString).Nodes(13).Nodes .Add(0, "Порт источника: " + UDP_Data.PortSourceUDP.ToString) .Add(1, "Порт получателя: " + UDP_Data.PortDestinationUDP.ToString) .Add(2, "Длина датаграммы: " + UDP_Data.Length_UDP.ToString)
Dim UDP_Byte(11 + IP_Data.Length) As Byte Dim BV As BitVector32 = New BitVector32 Dim Hex1 As String Dim Hex2 As String
Array.Copy(IP_Byte, 12, UDP_Byte, 0, 8) 'IP адреса UDP_Byte(8) = 0 'Нулевые байты (резервные) UDP_Byte(9) = 17 'Протокол Dim x As UShort = IP_Data.Length 'IP_Headers.TotalLength - IP_Headers.HeaderLength UDP_Byte(10) = x >> 8 'Длина UDP в байтах UDP_Byte(11) = (x << 8) >> 8
Array.Copy(IP_Data, 0, UDP_Byte, 12, IP_Data.Length) 'Заголовок + данные протокола UDP UDP_Byte(18) = 0 'обнуляем контрольную сумму UDP_Byte(19) = 0
If UDP_Byte.Length Mod 2 Then ReDim Preserve UDP_Byte(UDP_Byte.Length) End If
For i = 0 To UDP_Byte.Length - 1 Step 2 Hex1 = Hex(UDP_Byte(i)) If Hex1.Length = 1 Then Hex1 = "0" + Hex1 If i = UDP_Byte.Length - 1 Then Hex2 = Hex(0) Else Hex2 = Hex(UDP_Byte(i + 1)) If Hex2.Length = 1 Then Hex2 = "0" + Hex2 BV = New BitVector32(BV.Data + CInt("&H" + Hex1 + Hex2))
If BV(2 ^ 16) Then BV(2 ^ 16) = False BV = New BitVector32(BV.Data + 1) End If
If BV(2 ^ 16) Then BV(2 ^ 16) = False BV = New BitVector32(BV.Data + 1) End If Next
For i = 0 To 15 BV(2 ^ i) = Not BV(2 ^ i) Next
.Add(3, "Контрольная сумма: " + UDP_Data.Checksum_UDP.ToString + ", " + BV.Data.ToString) .Add(4, "Данные: " + Datas) End With End Sub
Private Function CheckSumm(ByRef IP_Data() As Byte) As Integer Dim TCP_Byte(11 + IP_Data.Length) As Byte Dim BV As BitVector32 = New BitVector32 Dim Hex1 As String Dim Hex2 As String
Array.Copy(IP_Byte, 12, TCP_Byte, 0, 8) 'IP адреса TCP_Byte(8) = 0 'Нулевые байты (резервные) TCP_Byte(9) = 6 'Протокол Dim x As UShort = IP_Data.Length 'IP_Headers.TotalLength - IP_Headers.HeaderLength TCP_Byte(10) = x >> 8 'Длина TCP в байтах TCP_Byte(11) = (x << 8) >> 8
Array.Copy(IP_Data, 0, TCP_Byte, 12, IP_Data.Length) 'Заголовок + данные протокола TCP TCP_Byte(28) = 0 'обнуляем контрольную сумму TCP_Byte(29) = 0
If TCP_Byte.Length Mod 2 Then ReDim Preserve TCP_Byte(TCP_Byte.Length + 1) End If
For i = 0 To TCP_Byte.Length - 1 Step 2 Hex1 = Hex(TCP_Byte(i)) If Hex1.Length = 1 Then Hex1 = "0" + Hex1 If i = TCP_Byte.Length - 1 Then Hex2 = Hex(0) Else Hex2 = Hex(TCP_Byte(i + 1)) If Hex2.Length = 1 Then Hex2 = "0" + Hex2 BV = New BitVector32(BV.Data + CInt("&H" + Hex1 + Hex2))
If BV(2 ^ 16) Then BV(2 ^ 16) = False BV = New BitVector32(BV.Data + 1) End If
If BV(2 ^ 16) Then BV(2 ^ 16) = False BV = New BitVector32(BV.Data + 1) End If Next
For i = 0 To 15 BV(2 ^ i) = Not BV(2 ^ i) Next
Return BV.Data End Function
Private Function CreateChecksum(ByRef data() As Byte, ByVal Size As Integer) As Integer Dim chk As Integer = 0
For i = 0 To Size - 1 Step 2 chk += Convert.ToInt32(data(i) * &H100 + data(i + 1)) Next
chk = Convert.ToInt32((chk And &HFFFF&) + Fix(chk / &H10000&)) chk += Convert.ToInt32(Fix(chk / &H10000&))
Dim BV As BitVector32 = New BitVector32 BV = New BitVector32(chk) CreateChecksum = Convert.ToUInt16(chk Xor &HFFFF) End Function End Class
Создайте модуль и скопируйте в него этот код:
Imports System.IO
Module Module1 Public Const Const_0 As Integer = 0 Public Const Const_1 As Integer = 1 Public Const Const_2 As Integer = 2 Public Const Const_3 As Integer = 3 Public Const Const_4 As Integer = 4 Public Const Str_0 As String = "0" Public Const Str_00 As String = "00" Public Const Str_BroKen As String = "|" Public Const Str_Semicolon As String = ";" Public Const Str_CommaGap As String = ", "
Public Txt_In As String = String.Empty 'Public Txt_Out As String = String.Empty Public Port As String = Write_Config_ini("Port") Public IP As String Public BS As New BindingSource Public Table As DataTable = New DataTable("Table") Public Num As Long = Const_0
Public Function Write_Config_ini(ByVal Name As String) As String Dim StrimRid As New StreamReader(Application.StartupPath + "\Config.ini", System.Text.Encoding.GetEncoding(1251)) Dim Strings As String = StrimRid.ReadToEnd ' читать до конца файла , тоесть выводится все содержимое файла Dim i As Integer = Const_1
i = InStr(i, Strings, Name) If i = Const_0 Then Write_Config_ini = "" Else If InStr(i, Strings, vbCrLf) = Const_0 Then Write_Config_ini = Mid(Strings, i + Name.Length + Const_1) Else Write_Config_ini = Mid(Strings, i + Name.Length + Const_1, InStr(i, Strings, vbCrLf) - (i + Name.Length + Const_1)) End If End If StrimRid.Close() End Function
Public Sub Read_Config_ini(ByVal Name As String, ByVal Value As String) Dim StrimRid As New StreamReader(Application.StartupPath + "\Config.ini", System.Text.Encoding.GetEncoding(1251))
Dim Strings As String = StrimRid.ReadToEnd ' читать до конца файла , то есть выводится все содержимое файла Dim i As Integer = Const_1
StrimRid.Close() Dim StrimWrit As New StreamWriter(Application.StartupPath + "\Config.ini", False, System.Text.Encoding.GetEncoding(1251)) i = InStr(i, Strings, Name) If i = Const_0 Then Strings += Name + "=" + Value + vbCrLf Else Strings = Mid(Strings, Const_1, i + Len(Name)) + Value + Mid(Strings, InStr(i + Len(Name), Strings, vbCrLf)) End If
StrimWrit.Write(Strings) ' записиваем StrimWrit.Close() End Sub
End Module
|
|
| |