VB.netでパケットキャプチャーを作ってみる
[C#] System.Net.Sockets.Socketを使ってパケットモニタ (3)
こちらのサイトを参考にしました
目的
・開いたサイトのアドレスとかもリアルタイムで分かるのでコメントビューアに使いたかった
・通信内容が直で分かるので、ニコ生のゲットプレーヤーステータスが暗号化されてても接続できるようにする
です。
これが書いたソースです。
Private Sub Test()
Dim ip As String = "192.168.11.2"
Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
socket.Bind(New IPEndPoint(IPAddress.Parse(ip), 0))
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AcceptConnection, True)
socket.IOControl(IOControlCode.ReceiveAll, New Byte() {1, 0, 0, 0}, New Byte() {0, 0, 0, 0})
Dim buffer As Byte() = New Byte(4096) {}
Dim k As Integer
Do
socket.Receive(buffer)
Dim message As String = Encoding.UTF8.GetString(buffer)
'Console.WriteLine(message) '←何故かココでプログラムが止まってしまう。原因教えて下さい
'送信元IP
Dim source As String = String.Format("{0}.{1}.{2}.{3}", buffer(12), buffer(13), buffer(14), buffer(15))
'送信先IP
Dim destination As String = String.Format("{0}.{1}.{2}.{3}", buffer(16), buffer(17), buffer(18), buffer(19))
If message.Contains("<chat") = True AndAlso source.Contains(ip) = False Then
'For Each item As String In buffer
' Console.WriteLine(item)
'Next
Dim dstPort10 As String = Convert.ToString(buffer(22), 16) & Convert.ToString(buffer(23), 16)
Dim srcPort10 As String = Convert.ToString(buffer(20), 16) & Convert.ToString(buffer(21), 16)
Dim dstPort As Integer = Convert.ToInt32(dstPort10, 16)
Dim srcPort As Integer = Convert.ToInt32(srcPort10, 16)
Dim match = System.Text.RegularExpressions.Regex.Match(message, "thread=""(?<thread>[0-9]+)""")
Dim thread As Integer = CInt(match.Groups("thread").Value)
Console.WriteLine()
Console.WriteLine(k)
Console.WriteLine("送信元{0} - 送信先{1}", source, destination)
Console.WriteLine("ポート{0} - {1}", srcPort, dstPort)
Console.WriteLine("スレッド{0}", thread)
k = k + 1
End If
Loop
End Sub
はいこれが、パケットキャプチャーのソースです。
以下説明
自分のIP
Dim ip As String = "192.168.11.2"
messageの中にはパケットのバイナリ?をUTF-8でエンコードした物が一応入ってます。
Dim message As String = Encoding.UTF8.GetString(buffer)
'Console.WriteLine(message) '←何故かココでプログラムが止まってしまう。原因教えて下さい
bufferの中にパケットの16進数(バイナリ?)を10進数に直した1バイトが入ってます。
(写真1)
12,13,14,15 送信元
16,17,18,19 送信先アドレス
が.区切り?で入ってるのでIPの形に直して入れます。
(写真2)
'送信元IP
Dim source As String = String.Format("{0}.{1}.{2}.{3}", buffer(12), buffer(13), buffer(14), buffer(15))
'送信先IP
Dim destination As String = String.Format("{0}.{1}.{2}.{3}", buffer(16), buffer(17), buffer(18), buffer(19))
messageの中にコメントで使われる形式の”
っとなっているので、threadの値を正規表現で取ります。
Dim match = System.Text.RegularExpressions.Regex.Match(message, "thread=""(?<thread>[0-9]+)""")
Dim thread As Integer = CInt(match.Groups("thread").Value)
以上です。ありがとうございました。