2010年2月25日 星期四

c raw socket in linux

在linux下利用c來偽造封包,並不是表面上拿到原始碼就可以執行那麼簡單。

要達到這個目的,linux提供了raw socket方式。使用者需要自己定義ip header的內容。如果要進一步偽造更上層的tcp與udp封包,就需要自己定義tcp header或是udp header。mac層無法使用raw socket偽造。

tenouk網站中有詳盡的linux socket programming可以參考,當然也包括了raw socket部分。需要注意的是,在tcp與udp的raw socket範例,它們採用了自己定義的ip header以及tcp header與udp header。而裡面的structure,在ubuntu 9.11上測試是錯誤的,必須要自己參考系統的ip.h及tcp.h與udp.h。IP Header Data Structure這篇文章有說到關於不同系統,它的header上其實是有差異的。當然為了節省麻煩與跨平台可攜,還是建議採用系統的header比較方便。cprogrammming有一篇是關於使用系統header的討論。

編譯過後,執行需要root權限才能送出封包。而在destination上要注意的是,如果該host不存在,通常系統會先發出arp封包詢問。如果詢問無結果,由於系統無法填入mac位址,就不能送出。而source則無此限制。

參考資料:
[1] A brief programming tutorial in C for raw sockets
[2] Advanced TCP/IP - THE RAW SOCKET PROGRAM EXAMPLES
[3] SOCKET PART 10 - MORE TCP & UDP CLIENT & SERVER PROGRAM EXAMPLES
[4] Linux raw socket programming- cprogramming.com

沒有留言: