ARP scanner pomocí raw BSD socketů – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ARP scanner pomocí raw BSD socketů – C / C++ – Fórum – Programujte.comARP scanner pomocí raw BSD socketů – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Doomista+1
Stálý člen
17. 4. 2017   #1
-
0
-

Připojen obrázek. Ahoj, mám za úkol vytvořit ARP scanner, který s užitím raw BSD socketů oskenuje síť na zadaném interface a vyplivne informace o tom, kdo tam je. Podařilo se mi úspěšně sestavit a odeslat ARP dotaz, který posílám na broadcast. Pro sledování provozu používám příkaz tcpdump -netti <interface> -v "arp". Nicméně, jak je jasně vidět z obrázku níže, tak můj dotaz se odešle 2x, přestože funkci sendto() volám pouze jednou:

Stejně tak se 2x zašle i odpověď. Nicméně tu už můj program pomocí funkce rectfrom() nezachytí. Moje otázky jsou dvě: proč funkce sendto() odešle paket dvakrát a proč mi recvfrom nepřijímá odpovědi?

K obojímu mám své hypotézy, ale netuším, jestli jsou správné, ani co s nimi dělat. Při tvorbě paketu vyplňuji ethernetovou hlavičku, pak ARPovou hlavičku a pak zbytek zprávy dorovnám nulami, aby celý paket měl velikost 60 B. Když jsem ještě měl hlavičku sestavenou špatně a neprováděl padding a tcpdump mi akorát vypsal hexdump zprávy, protože ji neuměl dekódovat, tak bylo vidět, že první odeslaná zpráva měla míň, jak 60B a druhá už byla dorovnaná na 60B.

Ohledně přijímání mě napadá, zda mě náhodou nepředběhne operační systém a nezpracuje si zprávu sám.

Ještě připojím pár technických údajů:
Pro odesílání používám strukturu sockaddr_ll, ve které vyplňuji následující pole:

memset(&sa, 0, sizeof(sockaddr_ll));
sa.sll_family	= AF_PACKET;
sa.sll_ifindex	= idx.ifr_ifindex; // Index interface vyčtený přes ioctl
sa.sll_halen	= ETH_ALEN;
memcpy(sa.sll_addr, ADDR_MAC_BROADCAST, LEN_ADDR_MAC);
sa.sll_protocol	= htons(ETH_P_IP); // Zkoušel jsem i ETH_P_ARP, žádný rozdíl
sa.sll_hatype	= ARPHRD_ETHER;
sa.sll_pkttype	= PACKET_OTHERHOST;

Socket tvořím příkazem socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)

Referenční stroj je centos: Linux 3.10.0-327.36.1.el7.x86_64, který mám virtualizovaný pomocí VirtualBox. ARP skener zkouším na interface enp0s8, který je namapovaný na síť mezi hostem a virtuálkou.

Předem díky za všechnu pomoc

Nahlásit jako SPAM
IP: 213.175.51.–
Na vše stačí iostream...
gna
~ Anonymní uživatel
1891 příspěvků
17. 4. 2017   #2
-
+2
-
Zajímavé

Řekl bych, že to vidíš dvakrát, protože ten odeslaný broadcast pak přijde i tobě.

Při vytváření socketu dej ETH_P_ALL nebo ETH_P_ARP místo IPPROTO_RAW.

Nahlásit jako SPAM
IP: 213.211.51.–
Řešení
gna
~ Anonymní uživatel
1891 příspěvků
17. 4. 2017   #3
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

htons(ETH_P_ALL)

Nahlásit jako SPAM
IP: 213.211.51.–
Doomista+1
Stálý člen
17. 4. 2017   #4
-
0
-

#3 gna
To htons() tam bylo dost důležité. Už to funguje, díky moc :)

Nahlásit jako SPAM
IP: 78.102.108.–
Na vše stačí iostream...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 150 hostů

Podobná vlákna

ARP a Ping v C# — založil JirkaX

Camera Raw — založil Dvory59

Práce s raw souborem — založil Zajda

Scanner — založil Jakub

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý