개요

패킷 분석 툴을 개발해보면서 비효율적이라고 생각했던 구조를 tcpdump에서는 어떻게 처리하는지 확인하고자 함

CMakeLists.txt

tcpdump.c가 main일 것으로 예상

1261 set(TCPDUMP_SOURCE_LIST_C fptype.c tcpdump.c)
1323 add_executable(tcpdump ${TCPDUMP_SOURCE_LIST_C})

tcpdump.c

main

  • netdissect_options 구조체로 옵션에 대한 플래그를 설정하고, callback 함수의 인자로 전달해 패킷 처리
  • callback 함수는 플래그에 따라 변경되지만 결국에는 pretty_print_packet을 호출

info

  • 캡처한 패킷에 대한 정보 출력
  • -r 에서는 사용 x

netdissect.h

  • netdissect_options : 각종 옵션 여부를 확인하는 flag, packet 정보, 상황(기본, 에러 등)에 맞는 출력 함수를 멤버로 가짐

print.c

  • pretty_print_packet : 옵션에 따라 패킷 내용을 출력, 시간은 공통 내용이기 때문에 해당 함수에서 처리, 이후는 타입에 맞는 출력 함수를 lookup 함수로 불러와 처리
  • pcap_datalink : pcap api로, datalink type을 반환 cf) https://www.tcpdump.org/linktypes.html 반환값 정보
  • lookup_printer : 패킷 타입에 맞는 함수를 반환 -> 네트워크 프로토콜에 대응하는 다양한 처리함수를 효과적으로 불러오기 위함
  • if_printer : 패킷 출력 함수를 추상화 한 자료형 -> lookup_printer에서 함수를 반환하기 위해 별도의 자료형을 정의

print-ether.c

  • ethertype_print : 해당 함수가 호출되기 전에 헤더를 처리하고, ethernet type에 맞는 처리 함수 호출 -> 하나씩 순서대로 역캡슐화

Reference

https://github.com/the-tcpdump-group/tcpdump
https://npcap.com/
https://www.tcpdump.org/index.html
https://sugerent.tistory.com/348
 
 
 
 

'⌨️ 개발 > Open Source' 카테고리의 다른 글

[Snort] Snort 기본  (0) 2024.03.03
[Tcpdump] Tcpdump 기본  (0) 2024.03.03