Rumah - Pengaturan internet
Sniffer untuk jaringan lokal dengan pembangun. Menulis sniffer sederhana untuk Windows

Pada artikel ini kita akan melihat cara membuat sniffer sederhana untuk OS Windows.
Siapa pun yang tertarik, selamat datang di kucing.

Perkenalan

Target: tulis program yang akan menangkap lalu lintas jaringan (Ethernet, WiFi) yang dikirimkan melalui protokol IP.
Cara: Visual Studio 2005 atau lebih tinggi.
Pendekatan yang dijelaskan di sini bukan milik penulis secara pribadi dan berhasil digunakan di banyak iklan, serta kategorisasi. program gratis(halo, GPL).
Pekerjaan ini ditujukan terutama bagi pemula dalam pemrograman jaringan, yang setidaknya memiliki pengetahuan dasar di bidang soket pada umumnya, dan soket Windows pada khususnya. Disini saya akan sering menulis hal-hal yang terkenal, karena bidang subjek spesifiknya, jika Anda melewatkan sesuatu, kepala Anda akan berantakan.

Saya harap ini menarik bagi Anda.

Teori (membaca tidak wajib, tetapi disarankan)

DI DALAM saat ini sebagian besar modern jaringan informasi didasarkan pada fondasi tumpukan protokol TCP/IP. Tumpukan protokol TCP/IP (Transmission Control Protocol/Internet Protocol) adalah nama kolektif untuk protokol jaringan dengan tingkat berbeda yang digunakan dalam jaringan. Pada artikel ini kita terutama akan tertarik pada protokol IP - dirutekan protokol jaringan, digunakan untuk pengiriman data tanpa jaminan yang dibagi menjadi apa yang disebut paket (istilah yang lebih tepat adalah datagram) dari satu node jaringan ke node lainnya.
Yang menarik bagi kami adalah paket IP yang dirancang untuk mengirimkan informasi. Itu sudah cukup tingkat tinggi model data OSI jaringan, ketika Anda dapat mengisolasi diri dari perangkat dan media transmisi data, hanya beroperasi dengan representasi logis.
Sangat logis bahwa cepat atau lambat alat untuk intersepsi, pengendalian, akuntansi dan analisis akan muncul lalu lintas jaringan. Alat seperti ini biasa disebut traffic analisa, packet analisa atau sniffer (dari bahasa Inggris sniff – sniff). Ini - penganalisa jaringan lalu lintas, suatu program atau perangkat perangkat keras-perangkat lunak yang dirancang untuk mencegat dan selanjutnya menganalisis, atau hanya menganalisis, lalu lintas jaringan yang ditujukan untuk node lain.

Latihan (percakapan substantif)

Saat ini sudah cukup banyak yang tercipta perangkat lunak untuk mendengarkan lalu lintas. Yang paling terkenal adalah Wireshark. Tentu saja, tujuannya bukan untuk meraih kemenangan - kami tertarik pada tugas mencegat lalu lintas hanya dengan "mendengarkan" antarmuka jaringan. Penting untuk dipahami bahwa kami tidak akan meretas dan mencegat lebih aneh lalu lintas. Kita hanya perlu melihat dan menganalisis lalu lintas yang melewati host kita.

Mengapa hal ini mungkin diperlukan:

  1. Melihat arus lalu lintas saat ini melalui koneksi jaringan (masuk/keluar/total).
  2. Alihkan lalu lintas untuk analisis selanjutnya ke host lain.
  3. Secara teoritis, Anda dapat mencoba menggunakannya untuk meretas jaringan WiFi (kami tidak akan melakukan itu, bukan?).

Tidak seperti Wireshark, yang didasarkan pada perpustakaan libpcap/WinPcap, penganalisis kami tidak akan menggunakan driver ini. Terlebih lagi, kami tidak akan memiliki driver sama sekali, dan kami tidak akan menulis NDIS kami sendiri (oh ngeri!). Anda dapat membaca tentang ini di topik ini. Dia hanya akan menjadi pengamat pasif, menggunakan hanya Perpustakaan WinSock. Menggunakan driver dalam hal ini adalah mubazir.

Bagaimana bisa? Sangat sederhana.
Langkah kunci dalam mengubah aplikasi jaringan sederhana menjadi penganalisis jaringan adalah dengan mengalihkan antarmuka jaringan ke mode promiscuous, yang memungkinkannya menerima paket yang dialamatkan ke antarmuka lain di jaringan. Mode ini dipaksakan kartu jaringan menerima semua frame, tanpa memandang kepada siapa frame tersebut ditujukan.

Dimulai dengan Windows 2000 (NT 5.0), menjadi sangat mudah untuk membuat program untuk mendengarkan segmen jaringan, karena dia pengemudi jaringan memungkinkan Anda untuk mengalihkan soket ke mode menerima semua paket.

Mengaktifkan Mode Promiscuous
bendera panjang = 1; soket soket; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);

Program kami beroperasi pada paket IP dan menggunakan perpustakaan Windows Sockets versi 2.2 dan soket mentah. Untuk mendapatkan akses langsung ke paket IP, soket harus dibuat sebagai berikut:

Membuat soket mentah
s = soket(AF_INET, SOCK_RAW, IPPROTO_IP);

Di sini, bukannya konstanta SOCK_STREAM(protokol TCP) atau SOCK_DGRAM(Protokol UDP), kami menggunakan nilai SOCK_RAW. Secara umum, bekerja dengan soket mentah menarik tidak hanya dari sudut pandang penangkapan lalu lintas. Faktanya, kami mendapatkan kendali penuh atas pembentukan paket. Atau lebih tepatnya, kami membentuknya secara manual, yang memungkinkan, misalnya, mengirim paket ICMP tertentu...

Mari kita lanjutkan. Diketahui bahwa paket IP terdiri dari header, informasi layanan, dan sebenarnya data. Saya menyarankan Anda untuk melihat di sini untuk menyegarkan pengetahuan Anda. Mari kita gambarkan header IP dalam bentuk struktur (berkat artikel bagus tentang RSDN):

Deskripsi struktur paket IP
typedef struct _IPHeader ( unsigned char ver_len; // versi header dan panjangnya unsigned char tos; // tipe layanan unsigned short length; // panjang keseluruhan paket unsigned short id; // Id unsigned short flgs_offset; // flags dan offset unsigned char ttl ; // protokol char yang tidak ditandatangani seumur hidup; // protokol xsum pendek yang tidak ditandatangani; checksum src panjang yang tidak ditandatangani; // Alamat IP pengirim unsigned long dest; // Alamat IP tujuan unsigned short *params; // parameter (hingga 320 bit) unsigned char *data; // data (hingga 65535 oktet)IPHeader;

Fungsi utama dari algoritma mendengarkan akan terlihat seperti ini:

Fungsi penangkapan paket tunggal
IPHeader* RS_Sniff() ( IPHeader *hdr; int hitungan = 0; hitungan = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (hitungan >= sizeof(IPHeader)) ( hdr = (LPIPHeader )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hitungan, hdr) jika tidak, kembalikan 0;

Semuanya sederhana di sini: kami menerima sepotong data menggunakan fungsi soket standar penerimaan, lalu salin ke dalam struktur seperti IPHeader.
Dan akhirnya kami meluncurkannya lingkaran tak berujung pengambilan paket:

Mari kita tangkap semua paket yang mencapai antarmuka jaringan kita
while (true) ( ​​​​IPHeader* hdr = RS_Sniff(); // memproses paket IP if (hdr) ( // mencetak header di konsol) )
Agak di luar topik

Di sini dan di bawah, penulis telah membuat awalan RS_ (dari Raw Sockets) untuk beberapa fungsi dan variabel penting. Saya mengerjakan proyek ini 3-4 tahun yang lalu, dan saya memiliki ide gila untuk menulis perpustakaan lengkap untuk bekerja dengan soket mentah. Seperti yang sering terjadi, setelah memperoleh beberapa hasil yang signifikan (bagi penulis), semangatnya memudar, dan persoalannya tidak lebih dari sekedar contoh pelatihan.

Pada prinsipnya, Anda dapat melangkah lebih jauh dan menjelaskan header dari semua protokol berikutnya yang terletak di atas. Untuk melakukan ini, Anda perlu menganalisis lapangan protokol dalam struktur IPHeader. Lihatlah contoh kodenya (ya, harusnya ada saklar, sial!), di mana headernya diwarnai tergantung pada protokol apa yang paketnya enkapsulasi dalam IP:

/* * Menyorot paket dengan warna */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // jika paket tidak kosong yang lain SetConsoleTextColor(0x07) ; // paket kosong if (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // paket "asli" untuk pengembalian ) else if (haddr == h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "asli" menerima paket ) if (h->protocol == PROT_ICMP || h->protocol == PROT_IGMP) ( SetConsoleTextColor (0x70) ; // paket ICMP ) else if(h->protokol == PROT_IP || h->protokol == 115) ( SetConsoleTextColor(0x4F); // paket IP-dalam-IP, L2TP ) else if(h - >protokol == 53 ||.h->protokol == 56) ( SetConsoleTextColor(0x4C); // TLS, IP dengan Enkripsi ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A);

Namun, hal ini jauh di luar cakupan artikel ini. Untuk contoh pelatihan kami, cukup dengan melihat alamat IP host dari mana dan ke mana lalu lintas datang, dan menghitung jumlahnya per unit waktu (program yang sudah selesai ada di arsip di akhir artikel) .

Untuk menampilkan data header IP, Anda harus mengimplementasikan fungsi untuk mengubah header (tetapi bukan data) datagram menjadi string. Sebagai contoh implementasi, kami dapat menawarkan opsi berikut:

Mengubah header IP menjadi string
sebaris 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 flags=0x%X offset=%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->panjang), 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));

Berdasarkan informasi dasar di atas, kita mendapatkan program kecil ini (nama menyeramkan ss, kependekan dari simple sniffer), yang mengimplementasikan mendengarkan lalu lintas IP secara lokal. Antarmukanya ditunjukkan di bawah pada gambar.

Sumber dan kode biner Saya menyediakannya apa adanya, seperti beberapa tahun yang lalu. Sekarang saya takut untuk melihatnya, namun cukup mudah dibaca (tentu saja, Anda tidak bisa terlalu percaya diri). Bahkan Visual Studio Express 2005 sudah cukup untuk kompilasi.

Apa yang kami dapatkan pada akhirnya:

  • Sniffer beroperasi dalam mode pengguna, tetapi memerlukan hak administrator.
  • Paket tidak difilter dan ditampilkan apa adanya (Anda dapat menambahkan filter khusus - saya sarankan untuk melihat topik ini secara mendetail di artikel berikutnya jika Anda tertarik).
  • Lalu lintas WiFi juga ditangkap (semuanya tergantung model tertentu chip, ini mungkin tidak berfungsi untuk Anda, seperti yang terjadi pada saya beberapa tahun yang lalu), meskipun ada AirPcap, yang dapat melakukan ini dengan luar biasa, tetapi membutuhkan biaya.
  • Seluruh aliran datagram dicatat ke dalam sebuah file (lihat arsip terlampir di akhir artikel).
  • Program ini beroperasi sebagai server pada port 2000. Anda dapat terhubung ke host menggunakan utilitas telnet dan memantau arus lalu lintas. Jumlah koneksi dibatasi hingga dua puluh (kode ini bukan milik saya, saya menemukannya di Internet dan menggunakannya untuk eksperimen; saya tidak menghapusnya - sayang sekali)

Terima kasih atas perhatian Anda, saya mengucapkan Selamat Natal kepada Anda dan semuanya!

Pada artikel ini kita akan melihat cara membuat sniffer sederhana untuk OS Windows.
Siapa pun yang tertarik, selamat datang di kucing.

Perkenalan

Target: tulis program yang akan menangkap lalu lintas jaringan (Ethernet, WiFi) yang dikirimkan melalui protokol IP.
Cara: Visual Studio 2005 atau lebih tinggi.
Pendekatan yang dijelaskan di sini bukan milik penulis secara pribadi dan berhasil digunakan di banyak program komersial dan gratis (halo, GPL).
Pekerjaan ini ditujukan terutama bagi pemula dalam pemrograman jaringan, yang setidaknya memiliki pengetahuan dasar di bidang soket pada umumnya, dan soket Windows pada khususnya. Disini saya akan sering menulis hal-hal yang terkenal, karena subjeknya spesifik, jika saya melewatkan sesuatu, kepala saya akan kacau.

Saya harap ini menarik bagi Anda.

Teori (membaca tidak wajib, tetapi disarankan)

Saat ini, sebagian besar jaringan informasi modern didasarkan pada tumpukan protokol TCP/IP. Tumpukan protokol TCP/IP (Transmission Control Protocol/Internet Protocol) adalah nama kolektif untuk protokol jaringan dengan tingkat berbeda yang digunakan dalam jaringan. Pada artikel ini, kita terutama akan tertarik pada protokol IP - protokol jaringan yang dirutekan yang digunakan untuk pengiriman data tanpa jaminan yang dibagi menjadi apa yang disebut paket (istilah yang lebih tepat adalah datagram) dari satu node jaringan ke node jaringan lainnya.
Yang menarik bagi kami adalah paket IP yang dirancang untuk mengirimkan informasi. Ini adalah model data jaringan OSI tingkat tinggi, ketika Anda dapat mengisolasi diri dari perangkat dan media transmisi data, hanya beroperasi dengan representasi logis.
Sangat logis bahwa cepat atau lambat alat untuk mencegat, memantau, menghitung, dan menganalisis lalu lintas jaringan akan muncul. Alat seperti ini biasa disebut traffic analisa, packet analisa atau sniffer (dari bahasa Inggris sniff – sniff). Ini adalah penganalisis lalu lintas jaringan, sebuah program atau perangkat keras-perangkat lunak yang dirancang untuk mencegat dan selanjutnya menganalisis, atau hanya menganalisis, lalu lintas jaringan yang ditujukan untuk node lain.

Latihan (percakapan substantif)

Saat ini sudah cukup banyak software yang diciptakan untuk mendengarkan lalu lintas. Yang paling terkenal adalah Wireshark. Tentu saja, tujuannya bukan untuk meraih kemenangan - kami tertarik pada tugas mencegat lalu lintas hanya dengan "mendengarkan" antarmuka jaringan. Penting untuk dipahami bahwa kami tidak akan meretas dan mencegat lebih aneh lalu lintas. Kita hanya perlu melihat dan menganalisis lalu lintas yang melewati host kita.

Mengapa hal ini mungkin diperlukan:

  1. Melihat arus lalu lintas saat ini melalui koneksi jaringan (masuk/keluar/total).
  2. Alihkan lalu lintas untuk analisis selanjutnya ke host lain.
  3. Secara teoritis, Anda dapat mencoba menggunakannya untuk meretas jaringan WiFi (kami tidak akan melakukan itu, bukan?).
Tidak seperti Wireshark, yang didasarkan pada perpustakaan libpcap/WinPcap, penganalisis kami tidak akan menggunakan driver ini. Terlebih lagi, kami tidak akan memiliki driver sama sekali, dan kami tidak akan membuat NDIS kami sendiri (oh ngeri!). Anda dapat membaca tentang ini di. Dia hanya akan menjadi pengamat pasif, menggunakan hanya Perpustakaan WinSock. Menggunakan driver dalam hal ini adalah mubazir.

Bagaimana bisa? Sangat sederhana.
Langkah kunci dalam mengubah aplikasi jaringan sederhana menjadi penganalisis jaringan adalah dengan mengalihkan antarmuka jaringan ke mode promiscuous, yang memungkinkannya menerima paket yang dialamatkan ke antarmuka lain di jaringan. Mode ini memaksa kartu jaringan untuk menerima semua frame, terlepas dari siapa frame tersebut ditujukan pada jaringan.

Dimulai dengan Windows 2000 (NT 5.0), menjadi sangat mudah untuk membuat program untuk mendengarkan segmen jaringan, karena driver jaringannya memungkinkan Anda mengatur soket untuk menerima semua paket.

Mengaktifkan Mode Promiscuous
bendera panjang = 1; soket soket; #define SIO_RCVALL 0x98000001 ioctlsocket(soket, SIO_RCVALL, &RS_Flag);
Program kami beroperasi pada paket IP dan menggunakan perpustakaan Windows Sockets versi 2.2 dan soket mentah. Untuk mendapatkan akses langsung ke paket IP, soket harus dibuat sebagai berikut:
Membuat soket mentah
s = soket(AF_INET, SOCK_RAW, IPPROTO_IP);
Di sini, bukannya konstanta SOCK_STREAM(protokol TCP) atau SOCK_DGRAM(Protokol UDP), kami menggunakan nilai SOCK_RAW. Secara umum, bekerja dengan soket mentah menarik tidak hanya dari sudut pandang penangkapan lalu lintas. Faktanya, kami mendapatkan kendali penuh atas pembentukan paket. Atau lebih tepatnya, kami membentuknya secara manual, yang memungkinkan, misalnya, mengirim paket ICMP tertentu...

Mari kita lanjutkan. Diketahui bahwa paket IP terdiri dari header, informasi layanan, dan sebenarnya data. Saya menyarankan Anda untuk melihat di sini untuk menyegarkan pengetahuan Anda. Mari kita gambarkan header IP dalam bentuk struktur (berkat artikel bagus tentang RSDN):

Deskripsi struktur paket IP
typedef struct _IPHeader ( unsigned char ver_len; // versi header dan panjangnya unsigned char tos; // tipe layanan unsigned short length; // panjang keseluruhan paket unsigned short id; // Id unsigned short flgs_offset; // flags dan offset unsigned char ttl ; // protokol unsigned char seumur hidup; // protokol unsigned long src; // alamat IP pengirim unsigned long dest; // alamat IP tujuan unsigned short *params; 65535 oktet) )IPHeader;
Fungsi utama dari algoritma mendengarkan akan terlihat seperti ini:
Fungsi penangkapan paket tunggal
IPHeader* RS_Sniff() ( IPHeader *hdr; int hitungan = 0; hitungan = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (hitungan >= sizeof(IPHeader)) ( hdr = (LPIPHeader )malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(hitungan, hdr) jika tidak, kembalikan 0;
Semuanya sederhana di sini: kami menerima sepotong data menggunakan fungsi soket standar penerimaan, lalu salin ke dalam struktur seperti IPHeader.
Dan akhirnya, kita memulai loop pengambilan paket tanpa akhir:
Mari kita tangkap semua paket yang mencapai antarmuka jaringan kita
while (true) ( ​​​​IPHeader* hdr = RS_Sniff(); // memproses paket IP if (hdr) ( // mencetak header di konsol) )
Agak di luar topik
Di sini dan di bawah, penulis telah membuat awalan RS_ (dari Raw Sockets) untuk beberapa fungsi dan variabel penting. Saya mengerjakan proyek ini 3-4 tahun yang lalu, dan saya memiliki ide gila untuk menulis perpustakaan lengkap untuk bekerja dengan soket mentah. Seperti yang sering terjadi, setelah memperoleh beberapa hasil yang signifikan (bagi penulis), semangatnya memudar, dan persoalannya tidak lebih dari sekedar contoh pelatihan.

Pada prinsipnya, Anda dapat melangkah lebih jauh dan menjelaskan header dari semua protokol berikutnya yang terletak di atas. Untuk melakukan ini, Anda perlu menganalisis lapangan protokol dalam struktur IPHeader. Lihatlah contoh kodenya (ya, harusnya ada saklar, sial!), di mana headernya diwarnai tergantung pada protokol apa yang paketnya enkapsulasi dalam IP:

/* * Menyorot paket dengan warna */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) ( if (h->xsum) SetConsoleTextColor(0x17); // jika paket tidak kosong yang lain SetConsoleTextColor(0x07) ; // paket kosong if (haddr == h->src) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // paket "asli" untuk pengembalian ) else if (haddr == h->dest ) ( SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "asli" menerima paket ) if (h->protocol == PROT_ICMP || h->protocol == PROT_IGMP) ( SetConsoleTextColor (0x70) ; // paket ICMP ) else if(h->protocol == PROT_IP || h->protocol == 115) ( SetConsoleTextColor(0x4F); // paket IP-in-IP, L2TP ) else if(h - >protokol == 53 ||.h->protokol == 56) ( SetConsoleTextColor(0x4C); // TLS, IP dengan Enkripsi ) if(whost == h->dest || whost == h->src) ( SetConsoleTextColor (0x0A);

Namun, hal ini jauh di luar cakupan artikel ini. Untuk contoh pelatihan kami, cukup dengan melihat alamat IP host dari mana dan ke mana lalu lintas datang, dan menghitung jumlahnya per unit waktu (program yang sudah selesai ada di arsip di akhir artikel) .

Untuk menampilkan data header IP, Anda harus mengimplementasikan fungsi untuk mengubah header (tetapi bukan data) datagram menjadi string. Sebagai contoh implementasi, kami dapat menawarkan opsi berikut:

Mengubah header IP menjadi string
sebaris 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 flags=0x%X offset=%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->panjang), 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));
Berdasarkan informasi dasar yang diberikan di atas, kita mendapatkan program kecil ini (nama menyeramkan ss, kependekan dari simple sniffer), yang mengimplementasikan mendengarkan lalu lintas IP secara lokal. Antarmukanya ditunjukkan di bawah pada gambar.

Saya memberikan sumber dan kode biner apa adanya, seperti beberapa tahun yang lalu. Sekarang saya takut untuk melihatnya, namun cukup mudah dibaca (tentu saja, Anda tidak bisa begitu percaya diri). Bahkan Visual Studio Express 2005 sudah cukup untuk kompilasi.

Apa yang kami dapatkan pada akhirnya:

  • Sniffer beroperasi dalam mode pengguna, tetapi memerlukan hak administrator.
  • Paket tidak difilter dan ditampilkan apa adanya (Anda dapat menambahkan filter khusus - saya sarankan untuk melihat topik ini secara mendetail di artikel berikutnya jika Anda tertarik).
  • Lalu lintas WiFi juga ditangkap (semuanya tergantung pada model chip tertentu, ini mungkin tidak berfungsi untuk Anda, seperti yang terjadi pada saya beberapa tahun yang lalu), meskipun ada AirPcap, yang dapat melakukan ini dengan luar biasa, tetapi membutuhkan biaya.
  • Seluruh aliran datagram dicatat ke dalam sebuah file (lihat arsip terlampir di akhir artikel).
  • Program ini beroperasi sebagai server pada port 2000. Anda dapat terhubung ke host menggunakan utilitas telnet dan memantau arus lalu lintas. Jumlah koneksi dibatasi hingga dua puluh (kode ini bukan milik saya, saya menemukannya di Internet dan menggunakannya untuk eksperimen; saya tidak menghapusnya - sayang sekali)
Terima kasih atas perhatiannya, saya ucapkan selamat kepada warga Khabrovsk dan warga Khabrovsk dan semuanya, Selamat Natal!

Selamat siang Entah bagaimana masalah muncul di tempat kerja - ada perangkat yang bekerja melalui I2C dan protokolnya perlu dipahami. Oleh karena itu, kita memerlukan sniffer untuk antarmuka I2C, yang akan menampilkan segala sesuatu yang datang dan pergi melalui I2C ke port UART dan kemudian melalui konverter ke port COM komputer.

Awal

Saya hanya memiliki beberapa Atmeg8 dan saya memutuskan mengapa tidak menggunakannya. Selanjutnya, pertanyaan tentang rangkaian sniffer muncul.

Ada 2 pilihan - nyalakan sniffer secara paralel, atau di sirkuit terbuka. Jelas sekali, opsi pertama terlihat jauh lebih sederhana, yang pada kenyataannya ternyata sepenuhnya salah. Tapi hal pertama yang pertama.

Secara singkat tentang antarmuka itu sendiri. I2C (TWI di Atmel) menggunakan dua kabel - SCL dan SDA. Yang pertama bertanggung jawab untuk mencatat waktu sinyal, yang kedua bertanggung jawab untuk mengirimkan informasi secara langsung. Antarmuka juga memiliki status START dan STOP.

Jadi, pikiran pertama saya adalah mengambil probe dan menghubungkannya ke kaki saya di satu sisi interupsi eksternal di atmega8 di sisi lain ke jalur SDA dan menangkap ujung depan, dan menentukan 0 atau 1 dari waktu yang telah berlalu. Jelas, ini seharusnya bekerja dengan sangat buruk, karena sinyal STOP tidak diproses dengan benar.

Pikiran kedua adalah melakukan hal yang sama, tetapi menangkap interupsi pada jalur SCL, dan membaca jalur SDA yang terhubung ke kaki digital biasa menggunakan interupsi tersebut. Di sini semuanya tampak lebih layak, kecuali untuk status STOP yang sama, tetapi saya memutuskan untuk mencoba merakitnya di papan tempat memotong roti dan melihat apa yang terjadi.

Saya mohon maaf sebelumnya jika Anda menemukan kesalahan yang jelas dalam kode di bawah ini, karena saya sedang merekonstruksi versi kode yang ditolak dari memori sambil berlutut.

Kode pengendali interupsi terlihat seperti ini:

ISR(INT0_vect) ( cli(); if (bitIsHigh(PINB, 0)) uart_send_char("1"); else uart_send_char("0"); sei(); )
Nol dan satu mengalir ke port, tetapi segera menjadi jelas bahwa datanya salah - jumlahnya jauh lebih sedikit dari yang diharapkan dan berubah ketika permintaan yang sama diulang. Dalam proses mencari tahu alasannya, semuanya bermuara pada fakta bahwa data hilang karena akses ke antarmuka uart, yang, omong-omong, beroperasi pada kecepatan stabil maksimum 38 kbit/s, sementara I2C sendiri beroperasi pada 100 kbit/s. Tidak mungkin meningkatkan kecepatan UART karena kurangnya kristal pada frekuensi yang diperlukan untuk membawa UART ke kecepatan yang dapat diterima. Oleh karena itu, pekerjaan dengan uart perlu dihapus dari interupsi. Punya sesuatu seperti ini:

Data uint8_t statis = 0; statis uint8_t idx = 7; ISR(INT0_vect) ( cli(); data |= bitIsHigh(PINB, 0)<< (idx--); if (!idx) { uart_send_char(data); data = 0; idx = 7; } sei(); }
Segalanya menjadi lebih stabil, namun datanya masih tidak masuk akal. Setelah beberapa jam mengerjakan algoritme, mengaktifkan pemrosesan STOP, dll., diputuskan untuk mengambil rute yang berbeda.

Di jalur yang benar

Tidak peduli seberapa keras saya mencoba mengimplementasikan sniffer menggunakan rangkaian paralel, tidak ada hasil. Berdasarkan hal ini, hanya ada satu pilihan yang tersisa - mikrokontroler harus dimasukkan ke dalam celah, yaitu, mikrokontroler harus menjadi master untuk perangkat respons dan budak untuk master asli. Mungkin terdengar membingungkan, namun kenyataannya tidak seperti itu.

Karena atmega8 hanya memiliki satu perangkat keras I2C, jelas bahwa agar dapat berfungsi, Anda perlu menulis dukungan perangkat lunak untuk protokol tersebut.

Hasilnya adalah kode berikut:

ISR (TWI_VECT) (CLI(); UINT8_T StATUS = TWSR; UINT8_T B; Char S; S = 0; _DLAY_MS (1); STATUS & I2C_STATUS_MASK) (KASUS I2C_STATUS_SR_RX_ADR_AC:/* KASUS I2C_ST Atus_sr_rx_adr_nack:*/ uart_send_str ("- AW :"); uart_send_int(TWDR); i2csoft_start(); i2csoft_open_write(I2C_ADDRESS); break; case I2C_STATUS_SR_RX_DATA_ACK:/* case I2C_STATUS_SR_RX_DATA_NACK:*/ b = TWDR; sprintf(s, " %.2X", b); uart_send_str( s ); i2csoft_write_byte(b); kasus I2C_STATUS_SR_RX_STOP_RESTART: uart_send_str("E\n"); kasus I2C_STATUS_BUS_ERROR: uart_send_str("B\n"); baca_byte (); uart_send_str(s); istirahat; kasus TW_ST_DATA_ACK: b = i2csoft_read_byte(); b = i2csoft_read_byte(salah);<uart_send_str("L\n");

merusak; bawaan: uart_send_char("U");



 


Membaca:



Bahasa pemrograman pertama

Bahasa pemrograman pertama

Jangan takut penjara, jangan takut pada kekurangan, Jangan takut pada penyakit sampar dan kelaparan, Tapi takutlah hanya pada orang yang berkata: “Saya tahu bagaimana melakukannya!” (A.Galich) Ayo...

Formulir umpan balik yang indah tanpa gambar menggunakan CSS murni

Formulir umpan balik yang indah tanpa gambar menggunakan CSS murni

Jadi, mari kita mulai, pertama-tama kita akan menandai halaman dan menulis gaya untuknya. Markup akan menyertakan formulir umpan balik biasa...

Cara menonaktifkan hotkey Windows Cara menonaktifkan tombol pada keyboard Anda

Cara menonaktifkan hotkey Windows Cara menonaktifkan tombol pada keyboard Anda

Tombol Windows pada keyboard melakukan banyak tugas penting. Ini membuka menu Start dan menekan banyak kombinasi tombol (Windows-R,...

Menyiapkan efek visual - menghilangkan yang tidak perlu Menyembunyikan rumah dari sinar matahari

Menyiapkan efek visual - menghilangkan yang tidak perlu Menyembunyikan rumah dari sinar matahari

Teman-teman, hari ini kita akan mempelajari cara mengaktifkan atau menonaktifkan efek Windows Aero di komputer atau laptop yang menjalankan...

Utilitas yang cepat dan aman untuk memformat kartu memori SD, SDHC dan SDXC.  Program ini juga mendukung bekerja dengan jenis eksternal... gambar umpan