Network Packet Programming: Percobaan Pertama


Sehubungan dengan topik yang sedang dipelajari, alangkah menyenangkannya jika aku dapat membuat program untuk menangkap dan mengirim packet secara langsung pada data link layer. Teman-temanku yang suka iseng pasti pernah menggunakan program serupa untuk menyadap atau memblokir koneksi internet seseorang. Tool tersebut harus dapat membuat packet palsu, dan ini hanya bisa dilakukan di data link layer. Sayangnya, Windows tidak menyediakan cara gampang untuk memodifikasi packet selain dengan membuat NDIS intermediate driver. Tapi kabar baiknya, ada sebuah library open source (plus driver siap jadi, tentunya) yang dapat digunakan untuk keperluan ini, yaitu WinPCap. Wireshark adalah salah satu tool yang memanfaatkan WinPCap untuk men-capture packet.

Setelah men-download WinPcap Developer Pack, aku akan mendapatkan beberapa header dan static library yang siap dipakai oleh program. Sekarang, aku akan menyiapkan project baru di Visual C++. Aku masih menggunakan Visual Studio 2008 dan sudah hampir setahun lebih aku tidak menyentuh gadis ini (kabarnya Visual Studio 2010 beta sudah dapat dicoba). Setelah sedikit meluangkan waktu untuk menyesuaikan diri, aku meng-import header-header yang ada. Aku juga tidak lupa menambahkan referensi bagi compiler, dengan men-klik kanan nama project dan memilih properties, C/C++, General. Lalu pada Additional Include Directories, aku menambahkan folder yang berisi header tersebut. Hal yang sama juga aku lakukan pada static library, dengan memilih Linker, Input, dan mengisi Additional Dependencies dengan lokasi static library milik WinPCap (wpcap.lib dan Packet.lib).

Aku mulai dengan membuat kode seperti:

#include "pcap.h"
#include <conio.h>

void exitHandler() {
  printf("Tekan sembarang tombol untuk keluar dari program...");
  _getch();
}

int main() {
  atexit(exitHandler);

  ...

  exit(EXIT_SUCCESS);
}

Langkah pertama adalah aku akan menampilkan perangkat network apa saja yang tersedia dan dapat dipergunakan oleh WinPcap, dengan memanggil fungsi pcap_findalldevs(). Bila ingin men-capture packet milik network card yang berada di jaringan remote (bukan di komputer lokal), aku harus menggunakan fungsi pcap_findalldevs_ex(). Syarat lainnya adalah komputer remote tersebut harus menjalankan daemon rpcapd.exe (terdapat di folder instalasi WinPcap).

pcap_if_t *devices;
char pesanError[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs(&devices, pesanError)==-1) {
  printf("ERROR: %s\n", pesanError);
  exit(EXIT_FAILURE);
}

pcap_findalldevs() akan menghasilkan nilai -1 jika terjadi kesalahan saat mencari device apa saja yang dapat dipergunakan. Jika ia sukses, maka daftar device yang ada akan disimpan dalam struktur linked list pcap_if_t. Berikut ini adalah contoh kode program untuk menampilkan isi pcap_if_t:

#include "pcap.h"
#include <conio.h>

char *iptos(u_long in);

void exitHandler() {
  printf("Tekan sembarang tombol untuk keluar dari program...");
  _getch();
}

int main() {
  atexit(exitHandler);
  pcap_if_t *devices;
  char pesanError[PCAP_ERRBUF_SIZE];
  if (pcap_findalldevs(&devices, pesanError)==-1) {
    printf("ERROR: %s\n", pesanError);
    exit(EXIT_FAILURE);
  }

  pcap_if_t *currentDevice = devices;

  while (currentDevice != NULL) {

    printf("Device: %s\n", currentDevice->name);
    printf("Description: %s\n",
    currentDevice->description ? currentDevice->description : "(informasi tidak
      tersedia)");

    pcap_addr *address = currentDevice->addresses;
    while (address != NULL) {
      if (address->addr->sa_family == AF_INET) {
        sockaddr_in *sockaddr = (struct sockaddr_in *) address->addr;
        printf("Address: %s\n", iptos(sockaddr->sin_addr.s_addr));
      }
      address=address->next;
    }
    currentDevice = currentDevice->next;
    printf("\n\n");
  }

  pcap_freealldevs(devices);
  exit(EXIT_SUCCESS);
}

/* From tcptraceroute, convert a numeric IP address to a string */
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
  static char output[IPTOSBUFFERS][3*4+3+1];
  static short which;
  u_char *p;
  p = (u_char *)&in;
  which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
  sprintf_s(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
  return output[which];
}

Program di atas juga menampilkan alamat IP untuk setiap device yang disimpan dalam struktur linked list pcap_addr jika ada. Untuk menerjemahkan alamat IP numerik dan menampilkan ke dalam bentuk String (berbahagialah programmer Java yang punya toString()), aku men-copy paste fungsi iptos() yang ada di dokumentasi WinPcap. Dan lagi-lagi tidak seperti di Java, aku harus membebaskan alokasi memory setelah aku tidak membutuhkannya, dalam hal ini sudah ada fungsi pembantu pcap_freealldevs().

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: