Udpcap adalah emulasi UDP-Socket yang hanya menerima berdasarkan Npcap. Ini menggunakan driver penangkap paket Npcap untuk menangkap lalu lintas ethernet, mengurai semua header yang diperlukan dan mengembalikan Payload UDP. Dengan Udpcap Anda dapat membuka Soket UDP dan menerima data tanpa benar-benar membuka Soket!
Proyek ini hanya untuk Windows, karena Npcap hanya menargetkan Windows juga.
Udpcap dapat :
Udpcap tidak bisa :
Semua dependensi diambil dengan mudah oleh CMake. Namun untuk benar-benar menggunakan Udpcap, driver Npcap perlu diinstal. Ingatlah bahwa lisensi Npcap adalah hak milik.
Menggunakan driver penangkap paket untuk meniru soket UDP sepertinya ide yang buruk, padahal Anda bisa menggunakan Soket UDP yang tepat? Ya, mungkin memang begitu. Tapi tunggu dulu, ada masalah Windows yang sangat spesifik yang dapat diatasi oleh proyek ini.
Dibandingkan dengan Windows 7, Windows 10 memiliki Windows Defender (The MpsSvc Service) yang lebih agresif. Saat menerima banyak paket multicast UDP dengan soket biasa di Windows 10, Windows Defender menyebabkan beban CPU yang sangat besar sehingga membuat seluruh sistem menjadi lamban. Masalahnya tampaknya menjadi lebih buruk, ketika mesin Windows tersambung ke Domain Windows, seperti yang biasanya terjadi di jaringan perusahaan besar. Saat menyelidiki Sistem dengan Peretas Proses, kita dapat melihat bahwa proses System
(Kernel Windows) menempati seluruh inti CPU. Selalu ada satu thread di dalam kernel yang menggunakan semua siklus CPU dan memiliki tcpip.sys
di tumpukan panggilannya:
Firewall Defender tidak dapat dinonaktifkan lagi di Windows 10. Layanan MpsSvc bahkan akan tetap berjalan ketika dinonaktifkan sementara, karena menawarkan fitur keamanan lebih lanjut selain Defender Firewall.
Di Windows, setiap akses jaringan (yang dimulai oleh ruang pengguna) menggunakan API Winsocks/2. API tersebut menggunakan driver sistem file Kernel-Mode Afd.sys
, yang kemudian menggunakan Transport Protocol Driver tcpip.sys
. Driver tcpip.sys adalah tempat semua keajaiban Protokol terjadi di Windows. Ini juga merupakan titik di mana Windows Defender Firewall menganalisis lalu lintas. Microsoft telah membuat seluruh API hanya untuk tujuan itu: Windows Filtering Platform (WFP). API ini tersedia di Windows Vista dan yang lebih baru. Di bawah tcpip.sys
hanya terdapat NDIS.sys
(Spesifikasi Antarmuka Driver Jaringan) dan driver Ethernet NIC yang sebenarnya. Jadi untuk mengatasi masalah beban CPU Defender Firewall, kita perlu melewati seluruh driver tcpip.sys
dan semua yang ada di atasnya. Lihat gambar di bawah (garis hitam) untuk mendapatkan gambaran umum. Saat menggunakan Npcap, Windows Defender tidak melihat soket terbuka dan tidak menganalisis lalu lintas. Namun ini berarti bahwa tumpukan protokol UDP harus diimplementasikan kembali di ruang pengguna (di situlah Udpcap berguna!) .
Udpcap memiliki API yang sangat sederhana dengan kemiripan yang kuat dengan API soket terkenal lainnya:
# include < iostream >
# include < udpcap/udpcap_socket.h >
int main ()
{
// Create a Udpcap socket and bind it to a port. For this example we want to
// receive data from any local or remote source and therefore not bind to an
// IP address.
Udpcap::UdpcapSocket socket;
socket. bind ( Udpcap::HostAddress::Any (), 14000 );
for (;;)
{
// Allocate a buffer for the received datagram. The size of the buffer
// should be large enough to hold the largest possible datagram.
std::vector< char > datagram ( 65535 );
// Create an error code object to hold the error code if an error occurs.
Udpcap::Error error = Udpcap::Error::OK;
// Receive a datagram from the Socket. This is a blocking
// operation. The operation will return once a datagram has been received,
// the socket was closed by another thread or an error occured.
size_t num_bytes = socket. receiveDatagram (datagram. data (), datagram. size (), error);
// Resize the buffer to the actual size of the received datagram.
datagram. resize (num_bytes);
std::cout << " Received " << datagram. size () << " bytes: "
<< std::string (datagram. data (), datagram. size ())
<< std::endl;
}
return 0 ;
}
Anda memerlukan git-for-windows, Visual Studio 2015 atau lebih baru dan CMake 3.13 atau lebih baru untuk mengkompilasi Udpcap.
Kloning repo ini
(Atau Anda dapat mengunduh repo ini sebagai arsip. Tidak ada submodul.)
git clone https://github.com/eclipse-ecal/udpcap.git
cd udpcap
Hubungi CMakeWindows.bat
Ini juga akan mengunduh dependensi berikut:
.lib
biner).lib
biner) Buka _build/udpcap.sln
dengan Visual Studio dan kompilasi udpcap
serta sampelnya
Untuk melihat beberapa keluaran dari sampel, Anda jelas harus selalu mengeksekusi sampel pengirim dan udpcap_reciever.
Anda dapat mengatur Opsi CMake berikut untuk mengontrol bagaimana Udpcap seharusnya dibuat:
Pilihan | Jenis | Bawaan | Penjelasan |
---|---|---|---|
UDPCAP_BUILD_SAMPLES | BOOL | ON | Buat sampel Udpcap (dan asio) untuk mengirim dan menerima data dummy |
UDPCAP_BUILD_TESTS | BOOL | OFF | Bangun udpcap GTests. Memerlukan GTest::GTest agar tersedia. |
UDPCAP_THIRDPARTY_ENABLED | BOOL | ON | Aktifkan / Nonaktifkan penggunaan dependensi terintegrasi. |
UDPCAP_THIRDPARTY_USE_BUILTIN_NPCAP | BOOL | ON | Ambil dan buat berdasarkan Versi npcap SDK yang terintegrasi. Hanya tersedia jika UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_PCAPPLUSPLUS | BOOL | ON | Ambil dan buat berdasarkan Versi Pcap++ yang terintegrasi. Hanya tersedia jika UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_ASIO | BOOL | ON | Ambil dan bangun berdasarkan Versi asio yang terintegrasi. Hanya tersedia jika UDPCAP_THIRDPARTY_ENABLED=ON |
UDPCAP_THIRDPARTY_USE_BUILTIN_GTEST | BOOL | ON | Ambil dan buat pengujian terhadap versi GTest yang telah ditentukan sebelumnya. Jika dinonaktifkan, target harus diberikan secara eksternal. Hanya tersedia jika UDPCAP_THIRDPARTY_ENABLED=ON dan UDPCAP_BUILD_TESTS=ON |
UDPCAP_LIBRARY_TYPE | STRING | Mengontrol jenis perpustakaan Udpcap dengan memasukkan string ke dalam panggilan add_library . Dapat diatur ke STATIS / BERBAGI / OBJEK. Jika disetel, ini akan menggantikan opsi CMake BUILD_SHARED_LIBS biasa. Jika tidak disetel, CMake akan menggunakan setelan default, yang dikontrol oleh BUILD_SHARED_LIBS . |
Integrasikan sebagai binari :
Unduh rilis udpcap atau buat seperti yang dijelaskan sebelumnya. Jika Anda membuat sendiri, pastikan untuk membuat dan menginstal versi debug dan rilis.
Jika Anda memilih perpustakaan udpcap bersama (-> .dll
), perpustakaan itu akan berdiri sendiri dan Anda hanya perlu menyalin udpcap.dll
/ udpcapd.dll
ke direktori aplikasi Anda.
Jika Anda memilih pustaka udpcap statis (-> .lib
), Anda juga perlu menyediakan target berikut untuk CMake:
pcapplusplus::pcapplusplus
npcap::npcap
Lihat contoh integrasi Udpcap untuk mendapatkan saran tentang cara melakukannya. Anda dapat menemukan skrip dan modul untuk mengambil dan menemukan Npcap dan Pcap++ di sini:
Tambahkan direktori udpcap ke CMAKE_PREFIX_PATH
Anda:
cmake your_command_line -DCMAKE_PREFIX_PATH=path/to/udpcap/install/dir
Integrasikan sebagai sumber
Jadikan sumber udpcap tersedia. Misalnya Anda dapat mengunduhnya secara manual, menggunakan submodul git atau menggunakan CMake FetchContent.
Tambahkan yang berikut ke CMakeLists.txt
Anda :
# You will probably not need the samples, so turn them off.
set (UDPCAP_BUILD_SAMPLES OFF )
# Add the top-level directory as cmake subdirectory
add_subdirectory ( "path_to_udpcap" )
# Add the dummy Findudpcap.cmake do the module path to make
# find_package(udpcap) succeed.
list ( APPEND CMAKE_MODULE_PATH "path_to_udpcap/thirdparty/udpcap/Modules" )
Sekarang Anda dapat menautkan ke udpcap::udpcap