다음은 이어서 전 소스코드 사용했던 pcap_findalldevs() 함수, pcap_freealldevs() 함수를 살펴볼 것이다.
pcap_findalldevs() 함수
#include <pcap.h>
int pcap_findalldevs(pcap_if_t **, char *);
이 함수는 사용자 PC에 있는 모든 네트워크 디바이스 정보를 가져오는 함수이다.
매개변수로는 pcap_if_t 타입의 포인터 변수가 저장된 변수의 주소 값과 에러 메시지가 저장될 버퍼의 주소 값을 전달한다.
전에 사용했던 소스코드를 보면 이 함수를 호출한 뒤,
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 주소까지 출력해보자.
리눅스, 윈도우 모두 실행 가능하다.
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 |