2014-02-09 54 views
4

我想用C使用TCP/IP協議做一個自定義數據包。當我說定製時,我的意思是能夠改變數據包中的任何值;例如:MAC地址,IP地址等。如何在c中創建自定義數據包?

我試過四處搜尋,但找不到任何實際指導我或給我例子源代碼的東西。

如何創建自定義數據包或在哪裏尋找指導?

+0

您使用哪種網絡協議? –

+0

@JKB,OP表示他使用TCP/IP協議。 –

+0

是的,我知道OP狀態TCP/IP,但這意味着lwip(開​​源)或inteenich(付費)或其他? –

回答

3

一個相對容易的工具,便攜式是libpcap。對於接收原始數據包而言,它更爲人所知(事實上,首先你可以比較收到的數據包與手工製作的數據包,但事實上它最好),但已知的pcap_sendpacket實際上會發送一個原始數據包。

如果要從頭開始自己做,打開一個套接字與AF_PACKETSOCK_RAW(這是爲Linux,其他操作系統的可能會有所不同) - 例如見http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/,並在https://gist.github.com/austinmarton/1922600完整的代碼。請注意,您需要成爲root用戶(或者更準確地說具有適當的功能)來執行此操作。

另請注意,如果您嘗試發送原始tcp/udp數據包,您將遇到的一個問題是禁用網絡堆棧自動處理答覆(將其視爲發往現有IP地址或嘗試轉發它)。

+0

我在Linux上並擁有root訪問權限,但是如何禁用網絡堆棧自動處理回覆或使數據包跳過它,以便它不必更改其IP? – olivier009

+1

這是不平凡的。可能最簡單的方法是使用未分配給系統的IP地址,然後執行自己的'arp'或設置手動arp條目。您可能需要打開ip forwarding,然後讓'iptables'在'FORWARD'鏈中丟棄數據包('libpcap'應該仍然可以接收它們),以防止它發送ICMP主機不可達。 – abligh

+0

如果您絕對必須使用與服務器操作系統相同的IP地址,則問題是要查找哪些TCP端口是空閒的 - 實質上您希望兩個TCP堆棧共享相同的IP。我通過使用NAT和一個隧道接口完成了一次,所以我的連接來自隧道的遠端(即用戶空間),然後僞裝(使用NAT)作爲真實IP地址。這很費勁地得到正確。 – abligh

1

做這種事情並不像你想象的那麼簡單。使用普通套接字API來控制IP層上方的數據相對容易,但控制下面的數據會更復雜一些。由於內核自身管理網絡連接,大多數操作系統都難以改變底層的協議信息,並且不希望你搞砸。除此之外,還有其他平臺差異,網絡控制等可能會對您造成嚴重破壞。

你應該看看一些在那裏做的庫。一些例子:

如果你的目標是欺騙數據包,您應該基於網絡的欺騙緩解技術讀了太多(例如過濾外出到防止僞造的數據包退出網絡)。

+0

相信我我已經爲它做好了準備,並且非常感謝圖書館,但是你還有什麼其他圖書館? – olivier009

+0

這樣做有很多移動部件。我推薦這些庫的原因是因爲他們爲你處理其中的很多。如果你對它們的工作方式感興趣,我建議閱讀源代碼。 – jduck

+0

好的謝謝你的分配。 – olivier009

相關問題