Сайт Черникова Игоря Владимировича
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Форум » Форум » Прокси на VB.Net (Давайте совместными усилиями напишем Proxy Server на VB.Net)
Прокси на VB.Net
arhimed-676494Дата: Четверг, 20.02.2014, 14:45 | Сообщение # 1
Рядовой
Группа: Администраторы
Сообщений: 2
Репутация: 0
Статус: 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
 
arhimed-676494Дата: Четверг, 20.02.2014, 14:58 | Сообщение # 2
Рядовой
Группа: Администраторы
Сообщений: 2
Репутация: 0
Статус: Offline
Цитата arhimed-676494 ()
Client.SendTo(Send_Bytes, New System.Net.IPEndPoint(IPAddress.Parse(IP_Headers.IP_Source), Port))
Эта строка должна отсылать пакет IP/TCP, но почему-то ничего не происходит. Жду ваших советов.
 
Форум » Форум » Форум » Прокси на VB.Net (Давайте совместными усилиями напишем Proxy Server на VB.Net)
Страница 1 из 11
Поиск:

Copyright MyCorp © 2017
Сделать бесплатный сайт с uCoz