2013-06-03 23 views
7

Chcę przechwytywać pakiety UDP, które są przeznaczone do lokalnego portu, wyrażenie filtrujące jest takie jak udp port 20000. Zauważam, że jeśli istnieje fragmentacja IP w pakiecie UDP, libpcap może przechwycić tylko pierwszy fragment IP. Przypuszczam, że powodem jest to, że drugi fragment IP nie jest z nagłówkiem UDP (myślę, że jest taki sam dla TCP), więc libpcap nie może ich przechwycić przy użyciu filtru express udp port 20000.libpcap nie może przechwytywać fragmentów IP

Czy są jakieś obejścia tego problemu? lub dowolne inne biblioteki, które mogą przechwytywać pakiety przeznaczone dla określonego portu lokalnego?

dziękuję!

+0

Jeśli pakiet UDP jest pofragmentowany, a fragmenty nie identyfikują swojego źródła/miejsca docelowego, to w jaki sposób w nazwie butlonu Zeusa są kierowane do właściwego hosta i aplikacji? –

+0

Drugi fragment jest z nagłówkiem IP, ale bez nagłówka UDP. Stos IP/TCP będzie montował pierwszy i drugi fragment IP, zanim dostarczy cały pakiet UDP do aplikacji. Ale wydaje mi się, że libpcap nie może rozpoznać drugiego fragmentu IP. – misteryes

+0

W jaki sposób stos TCP/IP wie, że drugi fragment należy do tego samego gniazda co pierwszy bez nagłówka UDP? Być może sam będziesz musiał dokonać ponownego montażu - co naprawdę nie powinno być trudne. –

Odpowiedz

7

Myślę, że powodem jest drugi fragment IP nie są z nagłówka UDP (myślę, że to jest taki sam dla TCP), więc libpcap nie może uchwycić je za pomocą filtra wyrazić port UDP 20000.

Tak, zgadza się.

Możesz spróbować udp port 20000 or (ip[6:2] & 0x1fff) != 0, która będzie przechwytywać pakiety do lub z portów 20000 i fragmentów IP innych niż pierwszy fragment; to nie jest idealne, ale to wszystko, co możesz zrobić z filtrami libpcap, biorąc pod uwagę, że mechanizm filtru, którego używa (który jest częścią jądra systemu operacyjnego) nie utrzymuje historii między pakietami, a zatem nie ma możliwości, aby dowiedzieć się, że pakiet z dany identyfikator IP jest częścią tego samego fragmentu, co inny pakiet o tym samym identyfikatorze IP, przesunięcie fragmentu 0 i nagłówek UDP z portem 20000.

(Zwróć uwagę, że przynajmniej niektóre wersje Linuksa będą transmitować fragmenty datagramu IP w kolejności odwrotnej - aby umożliwić odbiorcy zobaczenie ostatniego fragmentu jako pierwszego, a co za tym idzie, aby móc częściej poprawnie oszacować rozmiar ponownie złożonego pakietu, co spowodowałoby, że nawet więcej przechwycić wszystkie fragmenty pakietów IP z filtrem, który sprawdza pola w nagłówku TCP lub UDP.)