iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0

Python socket發送封包有很多種方式和API,例如send、sendto、sendall等等,如果你的socket是TCP的socket,那麼在接收到client的封包要回傳,只需要一行程式,參數放字串就能搞定了!
sock.send(“Hello world!”)
如果是UDP也很簡單,但是UDP是無連結的協議,所以需要加ip和port
sock.sendto(“Hello world!”, (addr, port))

那我們這個系列的socket是什麼樣的socket呢?給大家複習一下
s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
是最原始的socket!雖然他發送和tcp一樣,也是s.send(string),但是裡面的string函數就非常複雜啦,必須從最上層一路加header到鏈接層,最重要的是,如果經過路由器的話,第三層IP層的checksum還要自己計算!每個路由器都會計算checksum以保證封包不會在傳輸過程中出現錯誤,但是checksum的計算方式過於簡單,難免還是有”bug”,這將在下一節提到,這一節,先給大家介紹如何建構發送出的packet

一個packet長這樣
{Header}{Header}{Header}{Data}
Data隨意放就好,看你的應用的資料格式,主要是怎麼建構header,因為header的原始格式是C裡的struct的byte array
其實也很簡單,如果拆解一個header是這樣的
a, b ,c d = struct.unpack(“BBHH”, header)
那把他架構回去就是這樣
header = struct(“BBHH”, a, b ,c ,d)
建構完多個header,只要把這些連接在一起就能發送了!路由器和交換機就能根據IP和MAC找到目的地電腦並解析封包
s.send(header1 + header2 + header3 + data)

系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)


上一篇
Day18 題外話 - 如何發起DNS spoofing
下一篇
Day20 Checksum如何保證封包正確以及潛在危害
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言