jNetPcap으로 패킷 캡처하기

 

payload는 실제로 서버와 통신에서 어떠한 캐릭터를 주고 받을 때 그러한 데이터가 들어가는 공간

 

예를들어 우리가 어떠한 웹사이트에 접속해서 그의 사이트에 로그인을 시도 한다던지 그럴 때 어떠한 로그인 정보를

 

보낼 때 이러한 페이로드에 담아 보낸다

 

package jNetPcap3;

import java.util.ArrayList;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapHeader;
import org.jnetpcap.PcapIf;
import org.jnetpcap.nio.JBuffer;
import org.jnetpcap.nio.JMemory;
import org.jnetpcap.packet.JRegistry;
import org.jnetpcap.packet.Payload;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.format.FormatUtils;
import org.jnetpcap.protocol.lan.Ethernet;
import org.jnetpcap.protocol.network.Ip4;
import org.jnetpcap.protocol.tcpip.Tcp;

public class Main {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {

		ArrayList<PcapIf> allDevs = new ArrayList<PcapIf>();
		StringBuilder errbuf = new StringBuilder();
		
		int r = Pcap.findAllDevs(allDevs, errbuf);
		if (r == Pcap.NOT_OK || allDevs.isEmpty()) {
			System.out.println("네트워크 장치를 찾을 수 없습니다. " + errbuf.toString());
			return;
		}
		
		System.out.println("[ 네트워크 장비 탐색 성공 ]");
		int i = 0;
		for (PcapIf device : allDevs) {
			String description = (device.getDescription() != null) ?
					device.getDescription() : "장비에 대한 설명이 없습니다.";
			System.out.printf("[%d번]: %s [%s]\n", i++, device.getName(), description);
		}
		
		PcapIf device = allDevs.get(0);
		System.out.printf("선택한 장치: %s\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.out.printf("패킷 캡처를 위해 네트워크 장치를 여는 데에 실패했습니다. 오류 : " 
					+ errbuf.toString());
			return;
		}
		
		Ethernet eth = new Ethernet();
		Ip4 ip = new Ip4();
		Tcp tcp = new Tcp();
		
		Payload payload = new Payload();
		PcapHeader header = new PcapHeader(JMemory.POINTER);
		JBuffer buf = new JBuffer(JMemory.POINTER);
		int id = JRegistry.mapDLTToId(pcap.datalink());
		
		while (pcap.nextEx(header, buf) != Pcap.NEXT_EX_NOT_OK) {
			PcapPacket packet = new PcapPacket(header, buf);
			packet.scan(id);
			System.out.printf("[ %d ]\n", packet.getFrameNumber());
			if (packet.hasHeader(eth)) {
				System.out.printf("출발지 MAC 주소 = %s\n도착지 MAC 주소 = %s\n",
						FormatUtils.mac(eth.source()), FormatUtils.mac(eth.destination()));
			}
			if (packet.hasHeader(ip)) {
				System.out.printf("출발지 IP 주소 = %s\n도착지 IP 주소 = %s\n",
						FormatUtils.ip(ip.source()), FormatUtils.ip(ip.destination()));		
			}
			if (packet.hasHeader(tcp)) {
				System.out.printf("출발지 TCP 주소 = %d\n도착지 TCP 주소 = %d\n",
					tcp.source(), tcp.destination());		
			}
			if (packet.hasHeader(payload)) {
				System.out.printf("페이로드의 길이 = %d\n", payload.getLength());
				System.out.print(payload.toHexdump());
			}
		}
		pcap.close();
	}

}

'Hacking > ARP 스푸핑' 카테고리의 다른 글

공부(10)  (0) 2021.09.10
공부(9)  (0) 2021.09.10
공부(7)  (0) 2021.09.09
공부(6)  (0) 2021.09.09
공부(5)  (0) 2021.09.09

+ Recent posts