[jNetPcap] 자바에서 패킷 캡쳐를 위한 jNetPcap 개발 환경 구축하기

류명운

·

2016. 11. 15. 02:36

반응형

[jNetPcap] 자바에서 패킷 캡쳐를 위한 jNetPcap 개발 환경 구축하기

jNetPcap 이란?

  • libpcap 라이브러리의 모든 호출 용 Java 라이브러리
  • 캡처 한 패킷을 실시간으로 디코딩 가능
  • 네트워크 프로토콜(핵심 프로토콜)의 대규모 라이브러리를 제공
  • 사용자는 Java SDK를 사용하여 자신의 프로토콜 정의를 쉽게 추가

Java Platform 에서 패킷 캡쳐(Packet Capture)를 수행하기 위해 WinPcap을 Java에서 사용가능하도록 포팅한 jNetPcap Lib를 이용해보려 한다. 이와 관련하여 개발 환경 구축 및 패킷 캡쳐 샘플 프로젝트를 실행해보는 본 포스팅의 순서는 다음과 같다.

  1. WinPcap 다운로드 및 설치하기
  2. jNetPcap 다운로드 및 프로젝트에 jnetpcap.jar, jnetpcap.dll 파일 추가하기
  3. 샘플 프로젝트 실행해보기


1. WinPcap 다운로드 및 설치하기

* Download URL - http://www.winpcap.org/install/default.htm

설치 파일을 공식 홈페이지에서 다운로드한 뒤 설치를 진행하여 준다.


2. jNetPcap 다운로드 및 프로젝트에 jnetpcap.jar, jnetpcap.dll 파일 추가하기

* Download URL - http://jnetpcap.com/

자신의 운영체제 및 버전에 맞는 파일을 다운로드하여 준다. (본인의 경우 Windows 32bit 선택)

다운로드 받은 파일의 압축을 풀면 아래와 같은 파일들이 존재하는데 프로젝트를 실행하기 위해 실제 필요한 파일은 jnetpcap.jar와 jnetpcap.dll 이 되겠다.

이클립스(자신이 사용하는 IDE)에서 패킷 캡쳐 샘플 프로젝트를 만들어준다.

프로젝트(PacketCapture) 하위에 Lib 폴더를 생성하여 준 뒤, jnetpcap.jar 및 jnetpcap.dll 파일을 Copy files 해준다.

프로젝트(PacketCapture) 우클릭 → [Build Path] → [Configure Build Path..] → [Add JARs..] → jnetpcap.jar 라이브러리를 추가하여 준다.


3. 샘플 프로젝트 실행해보기

다음으로 클래스 파일을 생성하여 jnetpcap.dll 라이브러리를 로드하여주는 코드를 작성하여 추가해준다.

public class PacketCapture {
	// 정적으로 jnetpcap.dll 파일 로드
	static {
		try {
			// native Library Load
			System.load(new File("jnetpcap.dll").getAbsolutePath());
			System.out.println(new File("jnetpcap.dll").getAbsolutePath());
		} catch (UnsatisfiedLinkError e) {
			System.out.println("Native code library failed to load.\n" + e);
			System.exit(1);
		}
	}

	public static void main(String[] args) {
        //..미작성
    }

}

이어서 공식 사이트에서 제공하는 패킷 캡쳐 예제 소스를 추가하여 실행해본다.

* 기본 예제 - http://jnetpcap.com/?q=examples/classic

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;

public class PacketCapture {
	static {
		try {
			System.load(new File("jnetpcap.dll").getAbsolutePath());
			System.out.println(new File("jnetpcap.dll").getAbsolutePath());
		} catch (UnsatisfiedLinkError e) {
			System.out.println("Native code library failed to load.\n" + e);
			System.exit(1);
		}
	}

	public static void main(String[] args) {
		List<PcapIf> alldevs = new ArrayList<PcapIf>();
		StringBuilder errbuf = new StringBuilder();
		int r = Pcap.findAllDevs(alldevs, errbuf);
		if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
			System.err.printf("Can't read list of devices, error is %s", errbuf.toString());
			return;
		}
		System.out.println("Network devices found:");
		int i = 0;
		for (PcapIf device : alldevs) {
			String description = (device.getDescription() != null) ? device.getDescription()
					: "No description available";
			System.out.printf("#%d: %s [%s]\n", i++, device.getName(), description);
		}

		PcapIf device = alldevs.get(0);
		System.out.printf("\nChoosing '%s' on your behalf:\n",
				(device.getDescription() != null) ? device.getDescription() : device.getName());

		int snaplen = 64 * 1024;
		int flags = Pcap.MODE_PROMISCUOUS;
		int timeout = 10 * 1000;
		Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);

		if (pcap == null) {
			System.err.printf("Error while opening device for capture: " + errbuf.toString());
			return;
		}

		PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
			public void nextPacket(PcapPacket packet, String user) {
				System.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",
						new Date(packet.getCaptureHeader().timestampInMillis()), packet.getCaptureHeader().caplen(),
						packet.getCaptureHeader().wirelen(), user);
			}
		};

		pcap.loop(10, jpacketHandler, "jNetPcap rocks!");
		pcap.close();
	}
}

* 38번째 줄의 alldeve.get()의 인자 값에 캡쳐할 네트워크 장치의 번호를 맞추어 주어야 한다.

해당 파일을 실행하였을 때 위와 같이 이상없이 실행된다면 이상없이 jNetPcap의 개발환경 구축이 완료된 것이다.

* 패킵 캡쳐(생성) 예제 프로그램 - [공개용 S/W 개발] Packet Flooder (DOS)


반응형