1

我需要更有經驗的網絡程序員對GNU/Linux系統上有關數據包注入的一些意見/建議。我正在開發一個用於數據包注入和嗅探的開源C++庫。圖書館是libcrafter。在頁面上有幾個例子來看看圖書館是如何工作的。Libnet vs Raw Sockets用於數據包注入

我有一個困境,並希望你的想法。目前,圖書館「提供」兩種方式在網上寫封包。首先,數據包被構建:

pck.Send("eth0"); 

2)或使用RawSocketSend()函數(這是一個 「實驗」:

Packet pck = IP()/UDP()/DNS(); 

1),然後與發送()函數所發送函數,我用於基準測試但可用於用戶):

pck.RawSocketSend(sd); 

其中sd是套接字描述符。如果數據包具有鏈路層協議(如以太網),sd應該是PACKET套接字描述符。如果不是,應該是一個RAW套接字描述符。

使用Send()方法發送數據包的標準方法和記錄方式。目前,Send()方法使用libnet在線路上寫入數據包。

事情是Send()函數比RawSocketSend()慢得多......我經常要做很多棘手和煩人的事情來適應libcrafter處理協議字段的方式使用libnet_build *函數(這會導致性能損失)。每次我實現一個協議時,我必須看看libnet文檔,並使開發過程非常繁瑣和緩慢。所以,我正在考慮停止使用libnet進行數據包注入,並在Send()函數中直接使用RAW/PACKET套接字。

Libcrafter旨在爲用戶以透明的方式處理所有繁瑣的數據包製作工作(校驗和計算,字節排序,標題長度等)。使用RAW/PACKET套接字(RawSocketSend函數),最流行的GNU/Linux系統(Ubuntu,Fedora,Debian)一切正常。

我使用libnet的唯一原因是可移植性問題。但我沒有知識或意圖將libcrafter移植到其他系統,而不是GNU/Linux系統。

我的問題是:

  1. 是謹慎和安全上的數據包注入庫爲GNU/Linux使用RAW /包插座?
  2. 如果我決定停止使用libnet,你知道一些我應該考慮的有關GNU/Linux發行版之間RAW/PACKET套接字可移植性的問題嗎?
  3. 未來版本的內核中RAW/PACKET套接字接口可能會改變嗎?

非常感謝你:-)

回答

1

開源美麗的事情是,你實際上可以瀏覽源代碼,所以我檢查: http://code.google.com/p/libcrafter/source/browse/libcrafter/crafter/Packet.cpp

,看到包::發送效率不高:它會執行太多系統調用(每次將設備名稱與實際接口匹配),並調用libnet函數,我猜測每次都會打開一個套接字併發送數據包。無論如何,發送數據包的開銷太大。

發送它原始,我沒有看到功能代碼,但我想它只是使用send()。如果我是你,如果我對sendRawPacket()函數不滿意,我只是使用行套接字發送它,我已經看到該包提供了getRawBuffer()函數。

有關原始插座的更多信息: http://www.tenouk.com/Module43a.html並嘗試谷歌。

對於你的問題:

1)我不明白什麼叫「安全」呢?一般的答案是「是的,仔細」

2)關於portabilty,使用原始套接字是POSIX標準的一部分,所以它可以在任何linux dist上運行,也可能在windows上運行。我不知道libcraft是否可以移植到windows,但它應該在任何linux dist上運行。如果沒有,你可以貢獻給圖書館,並使其便攜。

3)我無法回答關於未來的問題。再一次,POSIX標準在很多年裏沒有多少變化,未來可能會改變。我不是先知,但我不認爲它在不久的將來會改變。

蓋伊

+0

謝謝你的答案,我不知道這個問題是否清楚,但我是libcrafter的開發者,而不是用戶。我想要做的是改變發送函數的下一個版本,以寫入原始套接字而不是使用libnet,出於性能的原因...我的開發系統是Ubuntu,而「安全」我的意思是如果我可以安全地假設在ubuntu中運行良好的東西(字節排序,使用setsockopt時的行爲等)將在其他發行版中這樣做。正如你所說,如果其他系統符合POSIX標準,一切都應該沒問題,對吧? – LarryPel

+0

是的,因爲以上所有都是系統調用,所以實際的過程是在內核級完成的。由於它支持POSIX,所以不應該改變。 無論如何,你可以隨時檢查其他分區。在虛擬機中 - 檢查Linux KVM –