Network Packet Programming: Membaca Packet Dengan Callback


Setelah berhasil mendapatkan network device yang dapat di-sniffer, aku akan mencoba membaca packet milik network device tersebut. Aku harus mulai dengan fungsi pcap_open_live(). Setelah itu, untuk membaca packet, WinPcap menawarkan dua cara, dengan callback atao tanpa callback (cara biasa). Pada latihan kali ini, aku akan mencoba memakai callback, sehingga fungsi yang perlu aku panggil adalah pcap_dispatch() atau pcap_loop(). Aku akan memakai pcap_loop() yang akan terus menunggu hingga jumlah packet yang aku tentukan tercapai, walaupun hal ini dapat menyebabkan blocking jika jaringan sedang sibuk.

Untuk mempersingkat tulisan, aku tidak akan menyertakan kode program untuk menampilkan informasi device lagi. Aku hanya menambahkan sedikit kode yang memberi pilihan bagi user untuk menentukan device mana yang akan di-capture:

int pilihan=1, i=1;
printf("Masukkan nomor perangkat yang akan di-capture: ");
scanf_s("%d", &pilihan);
currentDevice = devices;
while (pilihan!=i) {
  currentDevice = currentDevice->next;
  i++;
}

Setelah itu, aku memanggil pcap_open_live() dengan kode seperti:

pcap_t *handle = pcap_open_live(currentDevice->name, 65535, 1, 1000, pesanError);
if (handle==NULL) {
  printf("ERROR: %s\n", pesanError);
  pcap_freealldevs(devices);
  exit(EXIT_FAILURE);
}

Pada pcap_open_live() di atas, aku men-capture maksimal 65.535 byte (seharusnya ini adalah maksimal ukuran kebanyakan packet); aku juga mengaktifkan modus promiscuous, yaitu tidak hanya menangkap packet yang ditujukan untuk komputer-ku tapi juga packet yang dalam perjalanan ke komputer lain tapi harus singgah sebentar ke komputer-ku (well, orang yang iseng pasti sangat suka ini!); dan aku menentukan read timeout sebesar 1000 ms.

Sampai pada bagian ini, aku tidak membutuhkan lagi informasi devices, sehingga aku bisa membebaskan alokasi memori untuk linked list yang berisi informasi tersebut. Setelah itu, aku bisa mendaftarkan fungsi callback:

pcap_freealldevs(devices);
pcap_loop(handle, 0, handlerPacketMasuk, NULL);

Sekarang, setiap kali ada packet yang masuk, fungsi handlerPacketMasuk() akan dikerjakan. Berikut ini adalah contoh fungsi tersebut:

void handlerPacketMasuk(u_char *user,
       const struct pcap_pkthdr *pkt_header,
       const u_char *pkt_data) {

  for (u_int i=1; i<=(pkt_header->len); i++) {
    printf("%02x ", pkt_data[i-1]);
    if (i%8==0) printf("\n");
  }

  printf("\n\n");

}

Fungsi di atas akan menampilkan isi packet dalam tampilan 8 byte per baris. Setidaknya hari ini aku sudah membuat sebuah program sniffer primitif.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: