[ Pobierz całość w formacie PDF ]
.Nie jest to z pewno ściąnajwygodniejsze rozwiązanie.Na razie nie potrafimy uzyskać tego adresu z wnętrza programu.API do obsługiinterfejsów sieciowych poznamy w swoim czasie.Prosta funkcja, która zamienia adres MAC podany w postaci 6 (ETH_ALEN) warto ści typu char na ciągliczb szesnastkowych w postaci xx:xx:xx:xx:xx:xx.80 http://debian.esko.plZamieniany adres IP z linii komend podany w postaci xxx.xxx.xxx.xxx na adres w postaci liczby 32 -bitowej.Przyda się potem.Kopiujemy makra do odpowiednich zmiennych.Tworzymy gniazdo PF_PACKET typu SOCK_RAW, czyli deklarujemy chęć własnoręcznej obsługicałych ramek.W miejsce protokołu wstawili śmy ETH_P_ARP aby do gniazda były dostarczane tylko ramkizawierające dane protokołu ARP.Konieczna jest zamiana numeru protokołu na format sieciowy ( htons()).Innymiczęsto wykorzystywanymi protokołami s ą ETH_P_IP (IP) i ETH_P_ALL (wszystkie ramki niezależnie odprzenoszonego protokołu wyższej warstwy).Wszystkie dostępne wartośći znajdują się w pliku linux/if_ether.h.Przystępujemy do wypełniania nagłówków.Zaczynamy od samego dołu - od nagłówka ethernetowego(linux/if_ether.h):Nigdy nie zaszkodzi na początek wyczyścić całą wypełnianą strukturę.Następnie w pole h_destwstawiamy adres broadcast, a w pole h_source adres lokalnego interfejsu sieciowego.Dlaczego adres zródłowyjest taki a nie inny to powinno być jasne.W ątpliwości mogą się rodzić w przypadku adresu docelowego.Musimywiedzieć, w jaki sposób działa w ogóle protokół ARP.Otó ż zapytania ARP wysyłane są pod ethernetowy adresbroadcast równy ff:ff:ff:ff:ff:ff (czyli do wszystkich komputerów w sieci) poniewa ż w chwili ich wysyłania nieznamy adresu MAC komputera docelowego - dopiero po otrzymaniu odpowiedzi na zapytanie ARP poznamy tenadres.Trzecie pole nagłówka ethernetowego zawiera numer przenoszonego protokołu wy ższej warstwy - tutaj jestto ARP.Po stworzeniu nagłówka wstawiamy g o na początek bufora przeznaczonego na cał ą ramkę (pktbuf).Możeby teraz zająć się stworzeniem następnego nagłówka (ARP):81 http://debian.esko.plStruktura nagłówka ARP jest zdefiniowana tak ( linux/if_arp.h):Patrząc na kod programu widzimy, że pole ar_hrd wypełniamy wartością ARPHRD_ETHER(linux/if_arp.h) - oznacza to, że będziemy dokonywać konwersji NA adres ethernetowy.Kolejna linijka ustawiaar_pro na ETH_P_IP - będziemy konwertować Z adresu IP.Dwa kolejne pola (ar_hln, ar_pln) oznaczaj ą kolejnodługość adresu fizycznego (MAC) i sieciowego (IP).Nast ępnie polu ar_op nadajemy warto śćARPOP_REQUEST.Istnieje kilka różnych operacji ARP (linux/if_arp.h).My zamierzamy zamienić IP na MAC,a do tego używa się ARPOP_REQUEST.Pozostały jeszcze cztery pola.yródłowy adres MAC to nasz adres.yródłowy adres IP nie ma tu znaczenia dlatego go z erujemy.Docelowego adresu MAC nie znamy - to polezostanie uzupełnione przez komputer, który odpowie na zapytanie ARP.Na koniec docelowy adres IP, czyliadres, o którego konwersję zabiegamy.Pozostało już tylko dokleić nagłówek ARP zaraz za nagłówkiemethernetowym (w buforze pktbuf).Poświęćmy jeszcze chwilę na omówienie samego protokołu ARP.W sieć zostanie wysłana ramkazaadresowana do wszystkich komputerów.Ka żdy z komputerów odbiera tą ramkę i patrzy, co jest w środku.Znajduje tam zapytanie ARP (ARPOP_REQUEST).Sprawdza więc, czy docelowy adres IP (adr_tip) jest jegowłasnym adresem.Jeśli stwierdzi, że tak jest to zamienia miejscami pola: ar_shaar_tha oraz ar_sipar_tip aar_op ustawia na ARPOP_REPLY (odpowiedz ARP).Następnie tak zmieniony paket opakowuje w ramkęethernetową i wysyła pod adres ar_tha.Kiedy komputer inicjuj ący całą tą operację otrzyma odpowiedz ARP,zagląda do pola ar_sha (bądz do adresu zródłowego w nagłówku ethernetowym) gdzie znajduje si ę adres, o któryprosił.Możemy teraz wysłać ramkę w sieć:Jak zawsze przed użyciem sendto() musimy wypełnić strukturę opisującą adres zdalnego komputera.Wprzypadku PF_PACKET struktura ta wygląda tak (linux/if_packet.h):82 http://debian.esko.plWystarczy, że wypełnimy tylko trzy pola: sll_family, sll_protocol i sll_ifindex.Reszta informacjipotrzebna do wysłania ramki znajduje si ę w buforze pktbuf.Należy pamiętać o odpowiednim dobraniu trzeciegoparametru dla funkcji sendto() (długość bufora).Jest on równy długości nagłówka ethernetowego + długośćnagłówka ARP + długość samego zapytania ARP [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • igraszki.htw.pl