Kylix Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
카일릭스 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
자유게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

카일릭스 Q&A
[217] Re: 패킷관련 부분 참고자료 입니다.
보따리 [] 2548 읽음    2003-02-11 20:59
패킷 캡처부분은 리눅스에서 주로 많이 사용할수 있는 pcaplib를 사용하실수 있으시겠고
좀더 깊게 공부하신다면, 리눅스 커널상의 ip 스택부분에 레이어 하나를 추가하는 식의 인터미디어트 드라이버 모듈을 짜셔서 하셔도 될겁니다.

pcaplib는 카일릭스에서는 코딩을 안 해 보았지만, gcc에서 컴파일 되는 c 라이브러리입니다. (gcc에서 컴파일되니깐 카일릭스3의 C++컴파일러도 될듯합니다... 테스트는 아직 못해봤습니다.)

그리고 모조패킷이나 raw socket를 공부하신다면 libnet(모조패킷만드는 라이브러리)등의 라이브러리도 도움이 되실겁니다. 
(이 라이브러리도 약간의 버그가 있긴하지만 ...)

이번에 프로젝트를 하면서 패킷캡처링 부분을 하면서 만든 문서입니다..
참고가 되시길 바랍니다.

1. Libpcap(Portable Packet Capturing Library)

가. 개요

패킷을 캡쳐하기 위한 도구로는 BPF(Berkeley Packet Filter), DLPI, NIT, SNOOP, SNIT, SOCK_PACKET, LSF(Linux Socket Filter), drain등 각 운영체제별로 다양한 도구가 있다. 

운영체제별로 패킷을 캡쳐하기 위한 코드를 별도로 구성하는 것은 매우 번거로운 일이다. 따라서 이와 같은 다양한 도구들을 수용하는 Portable한 API가 개발되었고 이것이 바로 libpcap이다.

라이브러리 사용자는 운영체제의 각기 다른 datalink로의 접근 방법에 상관없이 libpcap을 이용하여 소기의 목적을 달성할 수 있다. libpcap을 이용한 대표적인 툴이 바로 tcpdump이다.

나. Interface 해설.

pcap_lookupdev()

ex) device = pcap_lookupdev(ebuf);

네트웍 디바이스를 가져오는 함수. 가능한 다바이스 중 가장 번호가 낮은 디바이스를 가져온다. 일반적인 리눅스의 경우에는 eth0이 된다. 다른 디바이스를 통해 패킷을 캡쳐하려면 이 함수를 사용하지 않고 프로그램의 입력으로 디바이스명을 가져오면 된다.

pcap_open_live()

ex) pd = pcap_open_live(device, snaplen, PROMISCUOUS, 1000, ebuf); 

위 함수는 실제 기기를 열어주는 기능을 하는 것으로 snaplen는 패킷당 저장할 바이트의 수로써 실제 datalink계층부터 패킷의 크기를 계산하여 원하는 부분만을 얻어오면 되는 것이다. PROMISCUOUS는 1이며 이는 네트웍 디바이스에 오는 모든 패킷을 받겠다는 의미이다. 이 모드를 자세하게 설명하면 Ethernet은 모든 패킷이 broadcasting되며 일단 모든 네트웍 디바이스는 동일 네트웍내의 다른 호스트의 패킷도 일단 접하게 된다. 그러나, 네트웍 디바이스는 기본적으로 자신의 패킷 만을 받게끔 되어있다. 그러므로 다른 호스트의 패킷은 버리게 되는 것이다. 그러나 promiscuous모드로 디바이스 모드를 바꾸게 되면 모든 패킷을 받아들이게 되는 것이다. 모든 네트워크 모니터링 프로그램들은 모두 이 모드를 사용하게 된다. 세 번째 인자는 패킷이 버퍼로 전달될 때 바로 전달되는 것이 아니라 위에서 명시한 시간을 넘겼을 때나 버퍼가 다 채워졌을 때 응용프로그램으로 전달되는 것이다.

pcap_lookupnet()

ex) pcap_lookupnet(device, &localnet, &netmask, ebuf) 

열려진 패킷 캡쳐 디바이스에 네트웍 주소와 서브넷 마스크를 넘겨준다.

pcap_compile()

ex) pcap_compile(pd, &fcode, filter_rule, 0, netmask) 

정해진 필터룰에 의해 필터 프로그램을 컴파일하게 되는데 우리가 원하는 패킷은 필터룰을 주어야만 원하는 패킷만을 얻을 수 있다. 실제 tcpdump에서 사용하는 필터룰이 여기에 쓰인다.

자세한 필터룰에 대한 설명은 tcpdump의 메뉴얼을 보면 알 수 있다.

pcap_setfilter()

ex) pcap_setfilter(pd, &fcode)

위는 앞서 컴파일한 필터 프로그램을 지정해 주는데 사용된다. 이렇게 하여 원하는 패킷을 얻을 준비를 하게 된다.

pcap_datalink()

ex) printer = lookup_printer(pcap_datalink(pd)); 

위는 패킷 캡쳐 디바이스의 datalink계층의 종류를 넘겨 받아 이에 따른 적절한 함수포인터를 할당하게 된다.

pcap_loop()

ex) pcap_loop(pd, packetcnt, printer, pcap_userdata);

실제 패킷을 잡아서 실행할 함수를 지정해 주는 함수이다. packetcnt의 수만큼 패킷을 잡아서 잡을 때 마다 해당 패킷을 printer가 포인터하는 함수에게 전달하고 함수를 수행하게 된다.

packetcnt를 0으로 지정하면 무한대로 함수를 실행한다.

pcap_next()

함수형 포인터를 사용하지 않고 함수를 호출할 때마다 패킷을 리턴해주는 함수로 앞의 pcap_datalink()와 pcap_loop()를 대체할 수 있다.


참고 사이트 

www.tcpdump.org -> 패킷캡춰라이브러리
libnet은 rpmfind(www.rpmfind.net)에서 검색하시면 나옵니다...

+ -

관련 글 리스트
216 [질문] 패킷 관련 프로그램을 짤수 있는지.. 난데^^* 2268 2003/02/10
217     Re: 패킷관련 부분 참고자료 입니다. 보따리 2548 2003/02/11
218         Re:Re: 패킷관련 부분 참고자료 입니다. 난데^^* 2135 2003/02/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.