프로그래밍/C언어를 활용한 네트워크 해킹

Packet Capture 라이브러리2

cyanhe_wh 2019. 9. 3. 17:38
반응형

다음은 이어서 전 소스코드 사용했던 pcap_findalldevs() 함수, pcap_freealldevs() 함수를 살펴볼 것이다.

 

pcap_findalldevs() 함수

#include <pcap.h>

int pcap_findalldevs(pcap_if_t **, char *);

 

이 함수는 사용자 PC에 있는 모든 네트워크 디바이스 정보를 가져오는 함수이다.

매개변수로는 pcap_if_t 타입의 포인터 변수가 저장된 변수의 주소 값과 에러 메시지가 저장될 버퍼의 주소 값을 전달한다.

 

[그림 1-1] 소스코드

전에 사용했던 소스코드를 보면 이 함수를 호출한 뒤,

alldevs 변수에 연결 리스트로 검색된 네트워크 카드 정보가 저장된다. pcap_if_t의 구조체는 pcap.h 파일에 정의되어 있다.

struct pcap_if {

    struct pcap_if *next;

    char *name;          // 인터페이스 이름

    char *description;   // 인터페이스 설명

    struct pcap_addr *addresses;

    bpf_u_int32 flags; // PCAP_IF_interface flags

};

name, description, addresses, flags는 값을 저장하기 위해 사용되지만, pcap_if *next 멤버는 다음 구조체의 주소 값을 저장하기 위해 사용된다.

pcap_findalldevs() 함수를 호출하여 생성된 구조체 연결 리스트의 정보는 사용자 PC 환경에 있는 네트워크 인터페이스의 개수에 따라 동적으로 메모리가 할당되어 구조체 연결 정보가 생성된다.

 

pcap_freealldevs() 함수

#include <pcap.h>

void pcap_freealldevs(pcap_if_t *);

이 함수는 pcap_findalldevs() 함수로 인해 메모리가 동적으로 할당된 것을 사용 후 메모리를 해제해주는 역할을 한다.


두 함수를 이용해 네트워크 인터페이스의 IP 주소까지 출력해보자.

[그림 1-2] pcap 함수 활용 IP 출력
[그림 1-3] 실행 결과

리눅스, 윈도우 모두 실행 가능하다.


pcap 라이브러리의 주소 정보가 저장되는 pcap_addr 구조체에 대한 정의 되어있다.

 

struct pcap_addr {

    struct pcap_addr *next;

    struct sockaddr *addr;           // address

    struct sockaddr *netmask;      // netmask for that address

    struct sockaddr *broadaddr;   // broadcast address for that address

    struct sockaddr *dstaddr;       // P2P destination address for that address

};

typedef struct pcap_addr pcap_addr_t;

 

pcap_addr 구조체는 실제 주소가 저장되는 addr 및 netmask, broadaddr 등의 멤버가 있을 뿐만 아니라 다음 pcap_addr 구조체의 주소 값을 저장하는 멤버도 있다.

 

네트워크 인터페이스 정보가 저장된 pcap_if_t 구조체 변수의 주소를 얻으면 pcap_addr이라는 구조체 멤버 포인터 변수 addresses를 이용하여 다양한 주소를 추출할 수 있다.

반응형

'프로그래밍 > C언어를 활용한 네트워크 해킹' 카테고리의 다른 글

ARP 프로토콜  (0) 2020.12.02
Ethernet 헤더  (0) 2019.09.05
체크섬(Checksum)  (0) 2019.09.03
Packet Capture 라이브러리  (0) 2019.09.03
RAW 소켓  (0) 2019.09.03