uy - Internetni sozlash
Quruvchi bilan mahalliy tarmoq uchun Sniffer. Windows uchun oddiy sniffer yozish

Ushbu maqolada biz Windows OS uchun oddiy sniffer yaratishni ko'rib chiqamiz.
Kim qiziqsa, mushukka xush kelibsiz.

Kirish

Maqsad: IP protokoli orqali uzatiladigan tarmoq trafigini (Ethernet, WiFi) ushlaydigan dasturni yozing.
Imkoniyatlar: Visual Studio 2005 yoki undan yuqori.
Bu erda tasvirlangan yondashuv shaxsan muallifga tegishli emas va ko'plab tijorat maqsadlarida, shuningdek, qat'iy ravishda muvaffaqiyatli qo'llaniladi. bepul dasturlar(salom, GPL).
Bu ish, birinchi navbatda, tarmoq dasturlash bo'yicha yangi boshlanuvchilar uchun mo'ljallangan, ammo ular umuman rozetkalar va xususan Windows soketlari sohasida kamida asosiy bilimlarga ega. Bu yerda men tez-tez taniqli narsalarni yozaman, chunki mavzu sohasi o'ziga xosdir, agar biror narsani o'tkazib yuborsam, boshim chigal bo'ladi.

Umid qilamanki, sizga qiziqarli bo'ladi.

Nazariya (o'qish shart emas, lekin tavsiya etiladi)

Hozirgi vaqtda zamonaviylarning aksariyati axborot tarmoqlari TCP/IP protokoli stekining asosiga asoslanadi. TCP/IP protokoli stegi (Transmission Control Protocol/Internet Protocol) tarmoqlarda ishlatiladigan turli darajadagi tarmoq protokollarining umumiy nomidir. Ushbu maqolada bizni asosan IP protokoli - marshrutlanganligi qiziqtiradi tarmoq protokoli, bir tarmoq tugunidan ikkinchisiga paketlar deb ataladigan ma'lumotlarni kafolatsiz etkazib berish uchun ishlatiladi (to'g'riroq atama - datagram).
Biz uchun ma'lumot uzatish uchun mo'ljallangan IP-paketlar alohida qiziqish uyg'otadi. Bu OSI tarmoq ma'lumotlar modelining juda yuqori darajasi bo'lib, siz o'zingizni qurilmadan va ma'lumot uzatish vositasidan ajratib olishingiz mumkin, faqat mantiqiy tasvir bilan ishlaydi.
Ertami-kechmi ushlash, nazorat qilish, hisobga olish va tahlil qilish vositalari paydo bo'lishi mantiqan to'g'ri tarmoq trafigi. Bunday vositalar odatda trafik analizatorlari, paket analizatorlari yoki snifferlar (ingliz tilidan sniff - sniff) deb ataladi. Bu - tarmoq analizatori trafik, boshqa tugunlar uchun mo'ljallangan tarmoq trafigini ushlab turish va keyinchalik tahlil qilish yoki faqat tahlil qilish uchun mo'ljallangan dastur yoki apparat-dasturiy qurilma.

Amaliyot (mohiyatli suhbat)

Ayni paytda juda ko'p narsa yaratilgan dasturiy ta'minot trafikni tinglash uchun. Ulardan eng mashhuri: Wireshark. Tabiiyki, maqsad uning yutuqlarini yig'ish emas - biz tarmoq interfeysini shunchaki "tinglash" orqali trafikni ushlab turish vazifasi bilan qiziqamiz. Shuni tushunish kerakki, biz xakerlik qilmoqchi emasmiz begona tirbandlik. Biz shunchaki xostimiz orqali o'tadigan trafikni ko'rishimiz va tahlil qilishimiz kerak.

Bu nima uchun kerak bo'lishi mumkin:

  1. Tarmoq ulanishi orqali joriy trafik oqimini ko'ring (kiruvchi/chiqish/jami).
  2. Trafikni keyingi tahlil qilish uchun boshqa xostga yo'naltiring.
  3. Nazariy jihatdan, siz uni WiFi tarmog'ini buzish uchun ishlatishga harakat qilishingiz mumkin (biz buni qilmaymiz, shunday emasmi?).

libpcap/WinPcap kutubxonasiga asoslangan Wiresharkdan farqli o'laroq, bizning analizatorimiz ushbu drayverdan foydalanmaydi. Bundan tashqari, bizda hech qanday haydovchi bo'lmaydi va biz o'z NDISni yozmaymiz (oh dahshat!). Bu haqda ushbu mavzuda o'qishingiz mumkin. U shunchaki foydalanib, passiv kuzatuvchi bo'ladi faqat WinSock kutubxonasi. Bunday holda haydovchidan foydalanish ortiqcha.

Qanaqasiga? Juda oddiy.
Oddiy tarmoq ilovasini tarmoq analizatoriga aylantirishning asosiy bosqichi tarmoq interfeysini promiscuous rejimga o'tkazishdan iborat bo'lib, u tarmoqdagi boshqa interfeyslarga yo'naltirilgan paketlarni qabul qilish imkonini beradi. Ushbu rejim tarmoq kartasini tarmoqdagi kimga qaratilganligidan qat'i nazar, barcha kadrlarni qabul qilishga majbur qiladi.

Windows 2000 (NT 5.0) dan boshlab, tarmoq segmentini tinglash uchun dastur yaratish juda oson bo'ldi, chunki uni tarmoq drayveri rozetkani barcha paketlarni qabul qilish rejimiga o'tkazish imkonini beradi.

Promiscuous rejimini yoqish
uzun bayroq = 1; SOCKET rozetkasi; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);

Bizning dasturimiz IP-paketlarda ishlaydi va Windows Sockets kutubxonasining 2.2 versiyasi va xom rozetkalardan foydalanadi. IP-paketga to'g'ridan-to'g'ri kirish uchun rozetkani quyidagicha yaratish kerak:

Xom rozetkani yaratish
s = rozetka (AF_INET, SOCK_RAW, IPPROTO_IP);

Bu erda doimiy o'rniga SOCK_STREAM(TCP protokoli) yoki SOCK_DGRAM(UDP protokoli), biz qiymatdan foydalanamiz SOCK_RAW. Umuman olganda, xom rozetkalar bilan ishlash nafaqat trafikni ushlab turish nuqtai nazaridan qiziq. Aslida, biz paketning shakllanishi ustidan to'liq nazoratni qo'lga kiritamiz. To'g'rirog'i, biz uni qo'lda shakllantiramiz, bu, masalan, ma'lum bir ICMP paketini yuborish imkonini beradi...

Davom etishga ruxsat. Ma'lumki, IP-paket sarlavha, xizmat ma'lumoti va aslida ma'lumotlardan iborat. Bilimingizni yangilash uchun bu yerga qarashingizni maslahat beraman. Keling, IP sarlavhasini tuzilma shaklida tasvirlaymiz (RSDN-dagi ajoyib maqola tufayli):

IP-paket strukturasi tavsifi
typedef struct _IPHeader ( unsigned char ver_len; // sarlavha versiyasi va uzunligi unsigned char tos; // xizmat turi imzolanmagan qisqa uzunlik; // butun paketning uzunligi imzosiz qisqa identifikator; // Id unsigned short flgs_offset; // bayroqlar va ofset imzolanmagan char ttl ; // umr bo'yi imzolanmagan char protokoli; // protokol imzolanmagan qisqa xsum; // nazorat summasi imzolanmagan long src; // jo'natuvchining IP manzili imzolanmagan long dest; // maqsad IP manzili imzosiz qisqa *paramlar; // parametrlar (320 tagacha) bit) unsigned char *ma'lumotlar; // ma'lumotlar (65535 oktetgacha) )IPHeader;

Tinglash algoritmining asosiy funktsiyasi quyidagicha ko'rinadi:

Yagona paketni yozib olish funktsiyasi
IPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hisoblash, hdr); qaytaring hdr; ) aks holda 0; )

Bu erda hamma narsa oddiy: biz standart rozetka funktsiyasidan foydalangan holda ma'lumotni olamiz recv, va keyin ularni kabi tuzilishga nusxalash IPHeader.
Va nihoyat ishga tushiramiz cheksiz tsikl paketni olish:

Keling, tarmoq interfeysimizga kiradigan barcha paketlarni tortib olaylik
while (to'g'ri) (IPHeader* hdr = RS_Sniff(); // agar (hdr) IP paketiga ishlov berish ( // konsolda sarlavhani chop etish ) )
Biroz mavzudan tashqari

Bu erda va quyida muallif ba'zi muhim funktsiyalar va o'zgaruvchilar uchun RS_ (Raw Sockets-dan) prefiksini yaratdi. Men loyihani 3-4 yil oldin qildim va menda xom rozetkalar bilan ishlash uchun to'liq huquqli kutubxona yozish g'oyasi bor edi. Ko'pincha bo'lganidek, (muallif uchun) muhim natijalarga erishgandan so'ng, ishtiyoq susaydi va masala mashg'ulot misolidan uzoqqa bormadi.

Asosan, siz oldinga borishingiz va yuqorida joylashgan barcha keyingi protokollarning sarlavhalarini tavsiflashingiz mumkin. Buning uchun maydonni tahlil qilish kerak protokol tuzilishida IPHeader. Misol kodiga qarang (ha, kalit bo'lishi kerak, jin ursin!), bu erda sarlavha paket IP-da qaysi protokolni qamrab olganiga qarab ranglanadi:

/* * Paketni rang bilan ajratib ko'rsatish */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // paket bo'sh bo'lmasa, boshqa SetConsoleTextColor(0x07) ; // bo'sh to'plam agar (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "dr else=" uchun to'plamni qaytaring (agar = mahalliy" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "mahalliy" qabul paketi ) agar (h->protocol == PROT_ICMP || h-T=Protocolor) (0x70) ; // ICMP paketi ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-paket, L2TP ) boshqacha if(h) - >protocol == 53 || h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, shifrlangan IP ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); ) )

Biroq, bu ushbu maqola doirasidan sezilarli darajada tashqarida. Bizning o'quv misolimiz uchun, qaysi va qaysi trafik kelayotgan xostlarning IP manzillarini ko'rib chiqish va uning vaqt birligi uchun miqdorini hisoblash kifoya qiladi (tugallangan dastur maqolaning oxirida arxivda joylashgan) .

IP sarlavhasi ma'lumotlarini ko'rsatish uchun siz datagram sarlavhasini (ma'lumotni emas) satrga aylantirish funktsiyasini amalga oshirishingiz kerak. Amalga oshirish misoli sifatida biz quyidagi variantni taklif qilishimiz mumkin:

IP sarlavhasini satrga aylantirish
inline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=% d hlen=%d tos=%d len=%d id=%d bayroq=0x%X ofset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s”, BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->uzunlik), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protokol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); qaytish r; )

Yuqorida keltirilgan asosiy ma'lumotlarga asoslanib, biz IP-trafikni mahalliy tinglashni amalga oshiradigan ushbu kichik dasturni (o'rqinchli nom ss, oddiy sniffer uchun qisqa) olamiz. Uning interfeysi quyidagi rasmda ko'rsatilgan.

Men manba va ikkilik kodni bir necha yil oldin bo'lgani kabi taqdim etaman. Endi men unga qarashdan qo'rqaman va shunga qaramay, u juda o'qilishi mumkin (albatta, o'zingizga bu qadar ishonib bo'lmaydi). Hatto Visual Studio Express 2005 kompilyatsiya qilish uchun etarli bo'ladi.

Biz nima bilan yakunladik:

  • Sniffer foydalanuvchi rejimida ishlaydi, lekin administrator huquqlarini talab qiladi.
  • Paketlar filtrlanmaydi va xuddi shunday ko'rsatiladi (siz maxsus filtrlarni qo'shishingiz mumkin - agar qiziqsangiz, keyingi maqolada ushbu mavzuni batafsil ko'rib chiqishni taklif qilaman).
  • Wi-Fi trafiki ham yozib olinadi (hamma narsaga bog'liq maxsus model chip, u siz uchun ishlamasligi mumkin, xuddi men uchun bir necha yil oldin bo'lgani kabi), garchi AirPcap mavjud bo'lsa-da, buni ajoyib tarzda qila oladi, lekin pul talab qiladi.
  • Butun datagram oqimi faylga qayd qilinadi (maqolaning oxirida biriktirilgan arxivga qarang).
  • Dastur 2000-portda server sifatida ishlaydi. Siz telnet yordam dasturi yordamida xostga ulanishingiz va trafik oqimlarini kuzatishingiz mumkin. Ulanishlar soni yigirmata bilan cheklangan (kod meniki emas, men uni Internetda topdim va tajribalar uchun ishlatdim; men uni o'chirmadim - achinarli)

E'tiboringiz uchun rahmat, sizni va barchangizni Rojdestvo bayrami bilan tabriklayman!

Ushbu maqolada biz Windows OS uchun oddiy sniffer yaratishni ko'rib chiqamiz.
Kim qiziqsa, mushukka xush kelibsiz.

Kirish

Maqsad: IP protokoli orqali uzatiladigan tarmoq trafigini (Ethernet, WiFi) ushlaydigan dasturni yozing.
Imkoniyatlar: Visual Studio 2005 yoki undan yuqori.
Bu erda tasvirlangan yondashuv shaxsan muallifga tegishli emas va ko'plab tijorat, shuningdek, mutlaqo bepul dasturlarda (salom, GPL) muvaffaqiyatli qo'llaniladi.
Bu ish, birinchi navbatda, tarmoq dasturlash bo'yicha yangi boshlanuvchilar uchun mo'ljallangan, ammo ular umuman rozetkalar va xususan Windows soketlari sohasida kamida asosiy bilimlarga ega. Bu yerda men tez-tez taniqli narsalarni yozaman, chunki mavzu sohasi o'ziga xosdir, agar biror narsani o'tkazib yuborsam, boshim chigal bo'ladi.

Umid qilamanki, sizga qiziqarli bo'ladi.

Nazariya (o'qish shart emas, lekin tavsiya etiladi)

Hozirgi vaqtda zamonaviy axborot tarmoqlarining aksariyati TCP/IP protokoli stekining asosiga asoslangan. TCP/IP protokoli stegi (Transmission Control Protocol/Internet Protocol) tarmoqlarda ishlatiladigan turli darajadagi tarmoq protokollarining umumiy nomidir. Ushbu maqolada bizni asosan IP protokoli qiziqtiradi - bir tarmoq tugunidan ikkinchisiga paketlar deb ataladigan (to'g'riroq atama - datagram) bo'lingan ma'lumotlarni kafolatsiz etkazib berish uchun ishlatiladigan yo'naltirilgan tarmoq protokoli.
Biz uchun ma'lumot uzatish uchun mo'ljallangan IP-paketlar alohida qiziqish uyg'otadi. Bu OSI tarmoq ma'lumotlar modelining juda yuqori darajasi bo'lib, siz o'zingizni qurilmadan va ma'lumot uzatish vositasidan ajratib olishingiz mumkin, faqat mantiqiy tasvir bilan ishlaydi.
Ertami-kechmi tarmoq trafigini ushlab turish, kuzatish, qayd etish va tahlil qilish vositalari paydo bo'lishi mantiqan to'g'ri. Bunday vositalar odatda trafik analizatorlari, paket analizatorlari yoki snifferlar (ingliz tilidan sniff - sniff) deb ataladi. Bu tarmoq trafigi analizatori, boshqa tugunlar uchun mo'ljallangan tarmoq trafigini ushlab turish va keyinchalik tahlil qilish yoki faqat tahlil qilish uchun mo'ljallangan dastur yoki apparat-dasturiy qurilma.

Amaliyot (mohiyatli suhbat)

Hozirgi vaqtda trafikni tinglash uchun juda ko'p dasturiy ta'minot yaratilgan. Ulardan eng mashhuri: Wireshark. Tabiiyki, maqsad uning yutuqlarini yig'ish emas - biz tarmoq interfeysini shunchaki "tinglash" orqali trafikni ushlab turish vazifasi bilan qiziqamiz. Shuni tushunish kerakki, biz xakerlik qilmoqchi emasmiz begona tirbandlik. Biz shunchaki xostimiz orqali o'tadigan trafikni ko'rishimiz va tahlil qilishimiz kerak.

Bu nima uchun kerak bo'lishi mumkin:

  1. Tarmoq ulanishi orqali joriy trafik oqimini ko'ring (kiruvchi/chiqish/jami).
  2. Trafikni keyingi tahlil qilish uchun boshqa xostga yo'naltiring.
  3. Nazariy jihatdan, siz uni WiFi tarmog'ini buzish uchun ishlatishga harakat qilishingiz mumkin (biz buni qilmaymiz, shunday emasmi?).
libpcap/WinPcap kutubxonasiga asoslangan Wiresharkdan farqli o'laroq, bizning analizatorimiz ushbu drayverdan foydalanmaydi. Bundan tashqari, bizda hech qanday haydovchi bo'lmaydi va biz o'z NDISni yozmaymiz (oh dahshat!). Bu haqda maqolada o'qishingiz mumkin. U shunchaki foydalanib, passiv kuzatuvchi bo'ladi faqat WinSock kutubxonasi. Bunday holda haydovchidan foydalanish ortiqcha.

Qanaqasiga? Juda oddiy.
Oddiy tarmoq ilovasini tarmoq analizatoriga aylantirishning asosiy bosqichi tarmoq interfeysini promiscuous rejimga o'tkazishdan iborat bo'lib, u tarmoqdagi boshqa interfeyslarga yo'naltirilgan paketlarni qabul qilish imkonini beradi. Ushbu rejim tarmoq kartasini tarmoqdagi kimga qaratilganligidan qat'i nazar, barcha kadrlarni qabul qilishga majbur qiladi.

Windows 2000 (NT 5.0) dan boshlab, tarmoq segmentini tinglash uchun dastur yaratish juda oson bo'ldi, chunki uning tarmoq drayveri barcha paketlarni qabul qilish uchun rozetkani sozlash imkonini beradi.

Promiscuous rejimini yoqish
uzun bayroq = 1; SOCKET rozetkasi; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);
Bizning dasturimiz IP-paketlarda ishlaydi va Windows Sockets kutubxonasining 2.2 versiyasi va xom rozetkalardan foydalanadi. IP-paketga to'g'ridan-to'g'ri kirish uchun rozetkani quyidagicha yaratish kerak:
Xom rozetkani yaratish
s = rozetka (AF_INET, SOCK_RAW, IPPROTO_IP);
Bu erda doimiy o'rniga SOCK_STREAM(TCP protokoli) yoki SOCK_DGRAM(UDP protokoli), biz qiymatdan foydalanamiz SOCK_RAW. Umuman olganda, xom rozetkalar bilan ishlash nafaqat trafikni ushlab turish nuqtai nazaridan qiziq. Aslida, biz paketning shakllanishi ustidan to'liq nazoratni qo'lga kiritamiz. To'g'rirog'i, biz uni qo'lda shakllantiramiz, bu, masalan, ma'lum bir ICMP paketini yuborish imkonini beradi...

Davom etishga ruxsat. Ma'lumki, IP-paket sarlavha, xizmat ma'lumoti va aslida ma'lumotlardan iborat. Bilimingizni yangilash uchun bu yerga qarashingizni maslahat beraman. Keling, IP sarlavhasini tuzilma shaklida tasvirlaymiz (RSDN-dagi ajoyib maqola tufayli):

IP-paket strukturasi tavsifi
typedef struct _IPHeader ( unsigned char ver_len; // sarlavha versiyasi va uzunligi unsigned char tos; // xizmat turi imzolanmagan qisqa uzunlik; // butun paketning uzunligi imzosiz qisqa identifikator; // Id unsigned short flgs_offset; // bayroqlar va ofset imzolanmagan char ttl ; // umr bo'yi imzolanmagan char protokoli; // protokol imzolanmagan qisqa xsum; // nazorat summasi imzolanmagan long src; // jo'natuvchining IP manzili imzolanmagan long dest; // maqsad IP manzili imzosiz qisqa *paramlar; // parametrlar (320 tagacha) bit) unsigned char *ma'lumotlar; // ma'lumotlar (65535 oktetgacha) )IPHeader;
Tinglash algoritmining asosiy funktsiyasi quyidagicha ko'rinadi:
Yagona paketni yozib olish funktsiyasi
IPHeader* RS_Sniff() ( IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) ( hdr = (LPIPHeader) )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hisoblash, hdr); qaytaring hdr; ) aks holda 0; )
Bu erda hamma narsa oddiy: biz standart rozetka funktsiyasidan foydalangan holda ma'lumotni olamiz recv, va keyin ularni kabi tuzilishga nusxalash IPHeader.
Va nihoyat, biz cheksiz paketlarni yozib olish tsiklini boshlaymiz:
Keling, tarmoq interfeysimizga kiradigan barcha paketlarni tortib olaylik
while (to'g'ri) (IPHeader* hdr = RS_Sniff(); // agar (hdr) IP paketiga ishlov berish ( // konsolda sarlavhani chop etish ) )
Biroz mavzudan tashqari
Bu erda va quyida muallif ba'zi muhim funktsiyalar va o'zgaruvchilar uchun RS_ (Raw Sockets-dan) prefiksini yaratdi. Men loyihani 3-4 yil oldin qildim va menda xom rozetkalar bilan ishlash uchun to'liq huquqli kutubxona yozish g'oyasi bor edi. Ko'pincha bo'lganidek, (muallif uchun) muhim natijalarga erishgandan so'ng, ishtiyoq susaydi va masala mashg'ulot misolidan uzoqqa bormadi.

Asosan, siz oldinga borishingiz va yuqorida joylashgan barcha keyingi protokollarning sarlavhalarini tavsiflashingiz mumkin. Buning uchun maydonni tahlil qilish kerak protokol tuzilishida IPHeader. Misol kodiga qarang (ha, kalit bo'lishi kerak, jin ursin!), bu erda sarlavha paket IP-da qaysi protokolni qamrab olganiga qarab ranglanadi:

/* * Paketni rang bilan ajratib ko'rsatish */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // paket bo'sh bo'lmasa, boshqa SetConsoleTextColor(0x07) ; // bo'sh to'plam agar (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "dr else=" uchun to'plamni qaytaring (agar = mahalliy" h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "mahalliy" qabul paketi ) agar (h->protocol == PROT_ICMP || h-T=Protocolor) (0x70) ; // ICMP paketi ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // IP-in-paket, L2TP ) boshqacha if(h) - >protocol == 53 || h->protocol == 56) ( SetConsoleTextColor(0x4C); // TLS, shifrlangan IP ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A); ) )

Biroq, bu ushbu maqola doirasidan sezilarli darajada tashqarida. Bizning o'quv misolimiz uchun, qaysi va qaysi trafik kelayotgan xostlarning IP manzillarini ko'rib chiqish va uning vaqt birligi uchun miqdorini hisoblash kifoya qiladi (tugallangan dastur maqolaning oxirida arxivda joylashgan) .

IP sarlavhasi ma'lumotlarini ko'rsatish uchun siz datagram sarlavhasini (ma'lumotni emas) satrga aylantirish funktsiyasini amalga oshirishingiz kerak. Amalga oshirish misoli sifatida biz quyidagi variantni taklif qilishimiz mumkin:

IP sarlavhasini satrga aylantirish
inline char* iph2str(IPHeader *iph) (const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=% d hlen=%d tos=%d len=%d id=%d bayroq=0x%X ofset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s”, BYTE_H (iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->uzunlik), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET (ntohs(iph->flgs_offset)), iph->ttl, iph->protokol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); qaytish r; )
Yuqorida keltirilgan asosiy ma'lumotlarga asoslanib, biz IP-trafikni mahalliy tinglashni amalga oshiradigan ushbu kichik dasturni (o'rqinchli nom ss, oddiy sniffer uchun qisqa) olamiz. Uning interfeysi quyidagi rasmda ko'rsatilgan.

Men manba va ikkilik kodni bir necha yil oldin bo'lgani kabi taqdim etaman. Endi men unga qarashdan qo'rqaman va shunga qaramay, u juda o'qilishi mumkin (albatta, o'zingizga bu qadar ishonib bo'lmaydi). Hatto Visual Studio Express 2005 kompilyatsiya qilish uchun etarli bo'ladi.

Biz nima bilan yakunladik:

  • Sniffer foydalanuvchi rejimida ishlaydi, lekin administrator huquqlarini talab qiladi.
  • Paketlar filtrlanmaydi va xuddi shunday ko'rsatiladi (siz maxsus filtrlarni qo'shishingiz mumkin - agar qiziqsangiz, keyingi maqolada ushbu mavzuni batafsil ko'rib chiqishni taklif qilaman).
  • Wi-Fi trafigini ham ushlaydi (hammasi ma'lum bir chip modeliga bog'liq, u siz uchun ishlamasligi mumkin, xuddi men uchun bir necha yil oldin bo'lgani kabi), garchi AirPcap mavjud bo'lsa-da, buni ajoyib qila oladi, lekin pul talab qiladi.
  • Butun datagram oqimi faylga qayd qilinadi (maqolaning oxirida biriktirilgan arxivga qarang).
  • Dastur 2000-portda server sifatida ishlaydi. Siz telnet yordam dasturi yordamida xostga ulanishingiz va trafik oqimlarini kuzatishingiz mumkin. Ulanishlar soni yigirmata bilan cheklangan (kod meniki emas, men uni Internetda topdim va tajribalar uchun ishlatdim; men uni o'chirmadim - achinarli)
E'tiboringiz uchun rahmat, Xabrovsk va Xabrovka aholisini va barchani Rojdestvo bayrami bilan tabriklayman!

Hayrli kun! Ishda qandaydir tarzda muammo paydo bo'ldi - I2C orqali ishlaydigan va uning protokolini tushunish kerak bo'lgan qurilma bor edi. Shuning uchun bizga I2C interfeysi uchun sniffer kerak bo'lib, u I2C orqali kelgan va ketadigan hamma narsani UART portiga, so'ngra konvertor orqali kompyuterning COM portiga chiqaradi.

Boshlash

Menda faqat bir nechta Atmeg8 bor edi va men ularni nega ishlatmaslikka qaror qildim. Keyinchalik, hidlash sxemasi haqida savol tug'ildi.

Ikkita variant bor edi - snifferni parallel ravishda yoki ochiq kontaktlarning zanglashiga olib yoqing. Shubhasiz, birinchi variant ancha sodda ko'rinadi, bu aslida butunlay noto'g'ri bo'lib chiqdi. Lekin birinchi narsa.

Qisqacha aytganda, interfeysning o'zi haqida. I2C (Atmelda TWI) ikkita simdan foydalanadi - SCL va SDA. Birinchisi signalni soatlash uchun javob beradi, ikkinchisi to'g'ridan-to'g'ri ma'lumot uzatish uchun javobgardir. Interfeysda START va STOP holatlari ham mavjud.

Shunday qilib, mening birinchi fikrim zondni olib, bir tomondan uni atmega8 ning tashqi uzilish oyog'iga, ikkinchi tomondan, SDA chizig'iga ulash va oldingi chetini ushlash va o'tgan vaqt bo'yicha 0 yoki 1 ni aniqlash edi. Shubhasiz, bu juda yomon ishlashi kerak edi, chunki STOP signali to'g'ri ishlov berilmagan.

Ikkinchi fikr xuddi shu narsani qilish edi, lekin SCL liniyasidagi uzilishni ushlang va uzilishdan foydalanib, oddiy raqamli oyoqqa ulangan SDA liniyasini o'qing. Xuddi shu STOP holatidan tashqari bu erda hamma narsa yanada qulayroq ko'rinardi, lekin men uni non taxtasida yig'ib, nima bo'lishini ko'rishga qaror qildim.

Quyidagi kodda aniq xatolar topsangiz, oldindan uzr so'rayman, chunki men rad etilgan kod versiyalarini tiz cho'kib xotiramdan qayta tiklayapman.

Interrupt ishlov beruvchisi kodi quyidagicha ko'rinadi:

ISR(INT0_vect) ( cli(); agar (bitIsHigh(PINB, 0)) uart_send_char("1"); aks holda uart_send_char("0"); sei(); )
Nollar va birliklar portga oqib tushdi, lekin ma'lumotlar noto'g'ri ekanligi darhol ma'lum bo'ldi - bu kutilganidan ancha kam edi va xuddi shu so'rov takrorlanganda u o'zgardi. Sabablarini aniqlash jarayonida barchasi uart interfeysiga kirish tufayli ma'lumotlar yo'qolganligi bilan bog'liq bo'lib, u, aytmoqchi, maksimal barqaror tezlikda 38 kbit / s tezlikda ishlagan, I2C esa. o'zi 100 kbit/s tezlikda ishlagan. UARTni maqbul tezlikka etkazish uchun kerakli chastotaning kristali yo'qligi sababli UART tezligini oshirish mumkin emas edi. Shuning uchun, uart bilan ishlashni uzilishdan olib tashlash kerak edi. Bunga o'xshash narsa bor:

Statik uint8_t ma'lumotlari = 0; statik uint8_t idx = 7; ISR(INT0_vect) ( cli(); maʼlumotlar |= bitIsHigh(PINB, 0)<< (idx--); if (!idx) { uart_send_char(data); data = 0; idx = 7; } sei(); }
Hamma narsa barqarorroq bo'ldi, ammo ma'lumotlar hali ham hech qanday ma'noga ega emas edi. Algoritm bo'yicha bir necha soat ishlash, STOP ishlov berishni yoqish va hokazolardan so'ng, boshqa yo'ldan borishga qaror qilindi.

To'g'ri yo'lda

Parallel sxema yordamida snifferni qanchalik amalga oshirishga harakat qilsam ham, hech narsa chiqmadi. Shunga asoslanib, faqat bitta variant qoldi - bu bo'shliqqa mikrokontrollerni kiritish kerak edi, ya'ni u javob moslamasi uchun ham master, ham asl master uchun qul bo'lishi kerak. Ehtimol, chalkash tuyuladi, lekin aslida bunday emas.

Atmega8 bortida faqat bitta I2C apparati mavjud bo'lganligi sababli, ishlash uchun siz protokol uchun dasturiy ta'minotni yozishingiz kerakligi aniq.

Natijada quyidagi kod paydo bo'ldi:

ISR(TWI_vect) ( cli(); uint8_t statusi = TWSR; uint8_t b; char s; s = 0; _delay_ms(1); switch (holat va I2C_STATUS_MASK) (holat I2C_STATUS_SR_RX_ADR_ACK:/* US case I2C_str_ARC: uint8_t b; char s; s = 0; _delay_ms(1); "- AW:"); uart_send_int(TWDR); i2csoft_start(); i2csoft_open_write(I2C_ADDRESS); tanaffus; holat I2C_STATUS_SR_RX_DATA_ACK:/* I2C_STATUS_SR_RX_DATA_NACKW =% bosma; bp DRX: (% 2;) yuborish_str( s); i2csoft_write_byte(b); break; case I2C_STATUS_SR_RX_STOP_RESTART: uart_send_str("E\n"); _delay_ms(10); do ( _delay_us(5); i2csoft_start(); ) while(!i2csoft_start(); Case I2C_STATUS_BUS_ERROR: uart_send_str("B\n"); break; case TW_ST_SLA_ACK: uart_send_str("-AR:"); uart_send_int(TWDR); b = i2csoft_read_byte(); sprintf(s, b", "%.2); uart_send_str(s); TWDR = b; break; case TW_ST_DATA_ACK: b = i2csoft_read_byte(); sprintf(s, " %.2X", b); uart_send_str(s); TWDR = b; break; case TW_ST_DATA_NACK: case TW_ST_DATA_LAST_ b = i2csoft_read_byte(noto'g'ri); uart_send_str("L\n"); sindirish; standart: uart_send_char("U"); uart_send_int(holat); uart_send_char(" "); sindirish; ) TWCR |= (1<Asosiy qurilma atmega I2C apparatiga ulangan, ijro etuvchi qurilma har qanday 2 ta raqamli oyoqqa ulangan, ulardan biri SCL rejimida, ikkinchisi SDA da ishlaydi. Yuqoridagi barcha kodlar I2C orqali uzilishni qabul qiladi va dasturiy ta'minot interfeysida shunga o'xshash holatni keltirib chiqaradi, xizmat ma'lumotlari esa nima bo'layotganini tushunishga yordam berish uchun uartga yoziladi. Belgilangan kechikishlar ma'lum bir qurilma uchun tanlangan va boshqalar uchun biroz farq qilishi mumkin. Natijada, biz juda yaxshi hidlovchini olamiz.

Agar kimdir qiziqsa, manbalarni olish mumkin



 


O'qing:



Texnik fikrlash uchun mini test

Texnik fikrlash uchun mini test

Ixtisoslashtirilgan ta'lim sharoitida o'smirlarning umumiy qobiliyatlarini kompleks diagnostika qilish III QISM 3. Kognitiv soha diagnostikasi 3.3. Sinov...

Kvartira, uy va boshqa ko'chmas mulkni sotish to'g'risida e'lonni bepul yuborish Uyni tez sotish to'g'risida e'lon yuborish

Kvartira, uy va boshqa ko'chmas mulkni sotish to'g'risida e'lonni bepul yuborish Uyni tez sotish to'g'risida e'lon yuborish

Uyni sotish - bu bir qator nuanslarni hisobga olishni talab qiladigan murakkab jarayon. Jarayonni tezlashtirish uchun mutaxassislar mutaxassislarga murojaat qilishni maslahat berishadi. Biroq...

Maktublarni o'qish orqali pul ishlash Xatlarni o'qish, lekin mukofot

Maktublarni o'qish orqali pul ishlash Xatlarni o'qish, lekin mukofot

Ishni boshlashingiz mumkin bo'lgan internetda pul ishlashning eng oddiy yo'li - reklama beruvchilar tomonidan sizga yuborilgan reklama xatlarini o'qib pul ishlash...

Mavzu bo'yicha material: "Chun qalbim bilan" kontsert dasturi barcha epizodlari bilan butun qalbim bilan teleko'rsatuv

Mavzu bo'yicha material: Konsert dasturi

Umuman olganda, dastur sovet xalqining oldindan aytib bo'lmaydigan va murakkab taqdirlari haqida gapirib berdi. Aksariyat tomoshabinlar ko'z yoshlarini tiya olmadilar...

tasma tasviri RSS