我正在嘗試模擬特定軟體的 UDP 輸出(音頻播放器的非常簡單的遙控器)。捕獲其輸出tcpdump -X沒有問題,并產生如下資料包:
Turn the device off...
18:30:03.623499 IP x.x.x.1.27490 > x.x.x.2.23500: UDP, length 32
0x0000: 4500 003c 42e6 0000 8011 92ee 0a02 2810 E..<B.........(.
0x0010: 0a02 28c9 6b62 5bcc 0028 b213 0500 007f ..(.kb[..(......
0x0020: 0100 0000 1800 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0100 0000 0200 0000 ............
Turn the device on...
18:30:06.222808 IP x.x.x.1.27490 > x.x.x.2.23500: UDP, length 32
0x0000: 4500 003c 42e7 0000 8011 92ed 0a02 2810 E..<B.........(.
0x0010: 0a02 28c9 6b62 5bcc 0028 b213 0500 007f ..(.kb[..(......
0x0020: 0100 0000 1800 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0200 0000 0100 0000 ............
現在我正在嘗試在 Perl 中重現這些資料包,因此我可以通過 IO::Socket::INET 發送它們并讓它們看起來與上面的相同。
我一直在玩 Perlpack函式,但恐怕我對我所看到的內容的理解不足以制作一個作業模板。
我什至在正確的軌道上嗎?
uj5u.com熱心網友回復:
要關閉設備,請使用 UDP 將以下字串發送到 10.2.40.201:23500:
"\x05\x00\x00\x7f"."\x01\x00\x00\x00"."\x18\x00\x00\x00"."\x00\x00\x00\x00".
"\x00\x00\x00\x00"."\x00\x00\x00\x00"."\x01\x00\x00\x00"."\x02\x00\x00\x00"
打開它,
"\x05\x00\x00\x7f"."\x01\x00\x00\x00"."\x18\x00\x00\x00"."\x00\x00\x00\x00".
"\x00\x00\x00\x00"."\x00\x00\x00\x00"."\x02\x00\x00\x00"."\x01\x00\x00\x00"
IP包結構 UDP包結構
第一個位元組告訴我們重要的資訊。
45
- 版本:4(IPv4)
- IHL:5(IP 標頭長 20 個位元組,包括該位元組。)
現在我們知道標題有多長了。
00 00 3c 42 e6 00 00 80 11 92 ee 0a 02 28 10 0a 02 28 c9
- DSCP: 0
- ECN: 0
- 總長度:0x003c (60)
- 標識:0x42e6
- 標志:0
- 片段偏移量:0
- TTL:0x80 (128)
- 協議:0x11 (UDP)
- 標頭校驗和:0x92ee
- 源 IP:0x0a022810 (10.2.40.16)
- 目標 IP:0x0a0228c9 (10.2.40.201)
這是一個未分段的資料包,所以它是完整的資料包。
接下來的 60 - 20 = 40 位元組是 IP 資料包有效負載。
它是一個 UDP 資料包,因此接下來的 8 個位元組構成 UDP 資料包頭。
6b 62 5b cc 00 28 b2 13
- 源埠:0x6b62 (27490)
- 目標埠:0x5bcc (23500)
- 長度(不包括 IP 標頭):0x0028 (40)
- 校驗和:0xb213
接下來的 40 - 8 = 32 位元組是 UDP 資料包有效負載。
05 00 00 7f 01 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00
要發送此訊息,您可以使用 UDP 將以下字串發送到 10.2.40.201:23500:
"\x05\x00\x00\x7f"."\x01\x00\x00\x00"."\x18\x00\x00\x00"."\x00\x00\x00\x00".
"\x00\x00\x00\x00"."\x00\x00\x00\x00"."\x01\x00\x00\x00"."\x02\x00\x00\x00"
在這里,為了便于閱讀,我將字串分成了四個位元組。你如何構建字串是無關緊要的。您可以使用pack一百萬種不同的方式來生成這個字串,但是如果不知道協議,就無法知道哪個是重要的。
現在,您要求復制資料包,但這肯定是不必要的。您只需要發送相同的訊息。標題會有差異。您可能能夠控制其中的一些(例如,通過將套接字系結到 10.2.40.16:27490)。但其他人可能更難。TTL 欄位隨著資料包在網路中移動而減小。資料包可能會被分段(分成稱為片段的較小資料包)。等等。但這些都不應該是相關的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530932.html
標籤:perl二进制UDP
