<main 함수>
char *pcap_lookupdev(char *errbuf)
패킷을 캡쳐할 적당한 네트워크 디바이스(NIC : Network Interface Card)를 찾아 그 디바이스를 지칭하는 스트링을 리턴한다.
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
pcap_open_live() 는 네트워크의 패킷들을 보기위해 필요한 packet capture descriptor를 얻기위해 사용된다. NIC의 promiscuous mode란 자신이 목적지가 아닌 패킷들도 받아들이는 모드를 말한다. promiscuous로 동작하지 않도록 설정해도 라이브러리 내부에서 필요에 의해 일부 promiscuous 모드로 동작할 수 있다.
char *device : 사용할 네트워크 디바이스를 지시하는 스트링
int snaplen : 캡쳐할 최대 bytes
int promisc : NIC가 promiscuous mode로 동작할 지 여부
int to_ms : millisecond 단위의 read timeout
char *ebuf : pcap_open_live()가 실패할 경우에만 에러 메시지가 저장된다. 보통 NULL
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
에러가 발생하거나 요구된 갯수 만큼의 패킷을 받아들이고 리턴한다. pcap_dispatch()와 다르게 타임 아웃이 발생해도 리턴되지 않는다. cnt 값이 음수면 에러가 발생하기 전까지 계속 수행한다.
pcap_t *p : 패킷 캡쳐 descriptor
int cnt : 읽을 패킷의 갯수
pcap_handler callback : 패킷을 처리할 루틴
u_char *user : 사용자 데이터
<HexView 함수>
먼저 조건으로 Ethernet type이 IP일 경우를 생각한다.
Etehrnet type이 IP일 경우 ip 구조체에 ipframe 사이즈 만큼 패킷을 복사해준다.
그 다음에 IP type이 TCP 타입인지 검사한다.
TCP type일 경우에 이제는 tcp 데이터 부분만 뽑아내는 작업을 한다.
unsigned char *tcpdata를 선언한 후에
tcpdata = (unsigned char *) (pa + (iph->ihl*4) + (tcph->doff *4));
-> packet에 ip length와 tcp length를 더해준다. 그 이후에 데이터가 나오기 떄문이다.
다음 조건을 통하여 순서대로 PUT이 나올 경우에 대한 조건을 생각한다.
데이터를 클라우도 서비스에 업로드 할 경우에 HTTP protocol이 PUT이 나온후에 쭉
데이터가 나오고 16진수로 od oa od oa 가 나온 후에 나의 데이터가 출력되기 때문이다.
또 하나 고려해야 할 사항은 fragment이다. Wireshark 로 확인해 본 결과
tcp segment frame으로 fragment 되어있었다.
그 packet들을 확인해본 결과 fragment된 packet들은 모두 acknumber가 같았다.
그러므로 처음 PUT이 나온 경우에 tcph->ack_seq를 변수에 저장하고, 다음 packet과
비교하여 같을 경우에는 같은 목적의 packet이다.
그 이후 또 하나 생각할 것은 PUT 이후에 내가 올리는 데이터 정보가 바로 나오는 것이
아니라 Http에 대한 정보가 나오고 계속 나오다가 Cookie에 대한 정보가 나온 후 od oa
od oa라는 패턴 이후에 내가 업로드 하는 정보가 나오기 때문에 조건으로 if문 중첩을
하였다.
(나중에 제대로 확인 위해 Hex코드와 아스키코드를 함께 찍어 볼 것)
od oa od oa가 나올 후에 데이터가 나오지만,한 패킷 중간 쯤에 od oa od oa가 나온다면
뒷 부분은 데이터가 나오기 때문에 count라는 변수를 두어 0일 경우에는 0d 0a 0d 0a가
패킷 중간에 나올 경우를 대비해 두어 0d 0a 0d 0a가 나온다면 뒷부분을 바로 출력 후에
count를 1로 변경시켜준다. 다음 패킷은 acknumber가 전 packet과 같을 때까지는 모두
data부분이므로 데이터를 출력해준다.