.pcap파일 저장방법 문의..

dnjswns2942의 이미지

안녕하세요.. 프로그램을 하나 짜보려고 하는데요..
http://packetslaboratory.blogspot.kr/2013/04/wireshark-pcap-file-format.html
위의 사이트 주소에 보면 .pcap 형식으로 파일을 저장하는 방법을 설명 하였습니다.
저도 위의 사이트와 같이 프로그램을 자바로 직접 짜보려고 하는데요.
네트워크 프로그램 지식이 불충분하여 프로그램 짜는데 문제가 있네요.

한패킷만이라도 정확하게 짜보고 싶은데 도움좀 부탁 드립니다~(__)

책도 추천해주셨으면 좋겠습니다^^

chanik의 이미지

패킷캡처는 어차피 C로 작성된 libpcap/WinPcap 라이브러리가 해 주고 각 프로그래밍 언어에서는 언어별 바인딩, 즉 Wrapper 라이브러리를 쓰게 됩니다. 아래 페이지에 pcap 라이브러리 Java 바인딩의 목록이 나옵니다.

http://en.wikipedia.org/wiki/Pcap#Wrapper_libraries_for_libpcap.2FWinPcap

여기서 하나를 골라 쓰시면 됩니다. 하부의 라이브러리는 모두 똑같은 pcap이지만 Java로 wrapping하면서 나름대로의 재구성과 naming을 했을테니, 작성되는 java 코드의 모양은 서로 조금씩 다를 것입니다. 그중 어떤 것이 잘 작성되어 있는지는 모르겠지만, google에서 "pcap java"를 뒤지면 가장 먼저 나오는 것은 jNetPcap이네요. 아래 페이지에 예제코드가 여러개 나옵니다.

http://jnetpcap.com/examples

dnjswns2942의 이미지

답변을 주셔서 대단히 감사합니다. jpcap으로 해보려고 하였으나 디바이스 장치로 패킷을 받아 실행하는 예제 더라구요.
저는 패킷을 받을때 kismet & airodump 같은 프로그램으로 패킷을 이미 받구 있어서 jpcap 라이브러리로는 안되더라구요.ㅠ
날코딩으로 해보려는데 부족한점이 너무 많네요..ㅠ
제가 알고 싶은 부분은 이렇습니다.
자바를 이용하여 패킷을 받아서 pcap파일로 저장을 하고 싶습니다.

위의 내용으로 직접 날 코딩을 해보려는데 패킷 받는것 까지는 소스를 적용 하였으나,
그이후에 글로벌헤더와 패킷헤더를 위의 내용과 같이 적용하여 패킷을 저장 시키고 싶습니다.
최대의 문제는 패킷헤더에 마지막 8바이트 incl_len , orig_len 길이가 변하기 때문에 패킷 길이를 구해야 하는데
아무리 찾아도 적용해볼 예제가 없네요.,,
자바를 이용하여 패킷길이 구하는 방법이나 위의 방법으로 패킷을 이용한 네트워크 프로그램 프로젝트를 해보신분
조언좀 부탁 드립니다
그리고 지식에 필요한 서적도 알려주시면 감사 합니다.

chanik의 이미지

질문글에서 링크해주신 사이트에 .pcap 파일 포맷 설명이 나오기는 합니다만, pcap 라이브러리는 .pcap 파일 저장기능도 지원하므로 파일포맷을 수작업으로 일일이 채워 저장할 필요는 없습니다. 원본 pcap 라이브러리에는 pcap_dump_open(), pcap_dump(), pcap_dump_close() 같은 API가 준비되어 있고, jNetPcap 라이브러리의 경우 이 기능이 PcapDumper라는 이름으로 wrapping 되어 있습니다 (다른 Java 바인딩은 어떤지 모르겠습니다).

http://jnetpcap.com/examples/dumper 샘플에서 이 기능을 쓰고 있는데요. NIC로부터 캡처된 패킷을 콜백함수에서 바로 PcapDumper로 덤프 하여 저장시키는 식입니다. 글로벌 헤더는 pcap 라이브러리가 알아서 만들어주니까 신경쓰지 않아도 되고, 패킷헤더에 채울 데이터인 (sec, usec, caplen, len)은 캡처시 넘어온대로 똑같이 덤프합니다.

(샘플의 버그때문에 저장된 .pcap 파일이 매번 지워져버리는 문제가 있는데, 68~69 라인을 77라인 이후로 옮기면 되더군요)

------

그리고, 댓글에 적으신 내용중 의문점이 두 가지 있습니다. 굵은 글씨로 표시했습니다.

> 저는 패킷을 받을때 kismet & airodump 같은 프로그램으로 패킷을 이미 받구 있어서 jpcap 라이브러리로는 안되더라구요

제 경험으로는 Windows/Linux 모두 한 NIC에 캡처프로그램이 복수개 붙어있어도 상관없습니다. 그리고, Windows 7에서 Wireshark으로 실험 해보니 Wi-Fi NIC에도 복수개의 캡처프로그램이 붙을 수 있었습니다. 캡처된 패킷은 복수개의 캡처프로그램에 모두 넘어옵니다. 따라서 다른 프로그램이 캡처를 하고 있기때문에 또다른 캡처클라이언트를 붙일 수 없다는 것은 이해가 되지 않습니다. 예외가 있는 것인가요? 이 부분만 검증되면 위의 PcapDumper 샘플을 좀 고쳐서 쓰시면 목적달성이 될 것 같은데요.

> 위의 내용으로 직접 날 코딩을 해보려는데 패킷 받는것 까지는 소스를 적용 하였으나,
> 그이후에 글로벌헤더와 패킷헤더를 위의 내용과 같이 적용하여 패킷을 저장 시키고 싶습니다.
> 최대의 문제는 패킷헤더에 마지막 8바이트 incl_len , orig_len 길이가 변하기 때문에 패킷 길이를 구해야 하는데
> 아무리 찾아도 적용해볼 예제가 없네요.

이미 알고계시리라 생각합니다만, incl_len , orig_len의 의미는 아래와 같습니다.

- orig_len : 캡처된 패킷 원본의 크기
- incl_len : 캡처된 패킷 원본 가운데 .pcap 파일에 저장된 크기 (원본의 뒷부분은 버리고 일부만 저장하는 경우)

보통의 경우엔 orig_len == incl_len이 되지만, 예를 들어 패킷의 뒷부분에는 관심이 없고 ip 헤더에만 관심이 있다든지 하는 경우가 생기 는데, 이 경우 캡처된 패킷내용물을 앞부분 일부만 .pcap 파일에 저장할 수 있고, 이때 orig_len >= incl_len 이 됩니다. (또한 패킷헤더.incl_len <= 글로벌헤더.snaplen 이어야 하고요)

날코딩(?)의 의미는 잘 모르겠습니다만, 어쨌든 패킷을 받는것까지 가능하다면 패킷길이는 바이트수를 세면 되고, .pcap 파일 패킷헤더의 길이값은 위의 원칙에 따라 채우면 되는데 패킷길이 계산에 문제되는 부분이 무엇인가요?

dnjswns2942의 이미지

안녕하세요.^^ 프로그램의 배움은 끝이 없는것 같습니다.
사실 orig_len 과 incl_len 그리고 글로벌 헤더에 있는 .snaplen 각각의 의미는 나름대로 알고 있었지만 답변 해주시는분이 명확하게 알려주시니
더욱 이해 하기 좋았습니다.
이미 패킷을 받는 중인 복수의 패킷 프로그램이 실행중 이므로 jpcap 라이브러리로 안된다는 의미는
모니터 모드로 동작중인 kismet 프로그램의 주변 탐색 정보를 받아 자신에게 연결된 사람에게 정보를 뿌려 줍니다.
Socket server = new Socket("192.168.1.1", 2502);
이런식으로 소켓을 연결 시켜주면 kismet프로그램의 패킷을 받을수 있는데요.
BufferedReader 문자열을 읽어들여,
ArrayList 담아서 뿌려주는 식으로 만들었습니다.
이상태에서 jpcap 예제를 이용하여 덤프파일을 만들어 보려고 했는데 에러가 발생하여 포기 하였었습니다.(어떤 오류 인지는 기억이 가물가물.ㅜㅜ)

제가 질문 한것은 정말 허접한데 답변 해주신분은 조목조목 설명 주셔서 너무 감사드립니다.
pcapdumper 샘플을 잘 적용하여 패킷저장 시켜 보겠습니다..^^

환절기에 감기 조심하시고 좋은 하루 되세요^_^

gilgil의 이미지

chanik님이 말씀하신 대로 pcap_dump_* API를 사용하면 됩니다.
다른 언어라면 wrapping class나 module이 존재하면 그걸 그냥 사용하면 되죠.
그 이상 뭐를 알려 달라고 하시는 지요?

dnjswns2942의 이미지

네 답변 감사드립니다^^

pcap_dump api를 사용하여 잘 적용 시켜 보겠습니다~

환절기에 감기 조심하시고 좋은 하루 되세요^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.