jNetPcap 기능 활성화

 

유의사항으로는

 

JavaFX는 Modulepath에 넣어주어야 하고

 

JNetPcap은 Classpath에 넣어주어야

 

javafx exception in application start method 이와같은 오류가 생기지 않는다

 

이것을 몰라 몇시간동안 고생했다

 

활성화 하는 것까지 코드를 올려보겠다

 

Controller.java

package controller;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;

public class Controller implements Initializable {
	
	@FXML
	private ListView<String> networkListView;
	
	@FXML
	private TextArea textArea;
	
	@FXML
	private Button pickButton;
	
	ObservableList<String> networkList = FXCollections.observableArrayList();
	
	private ArrayList<PcapIf> allDevs = null;
	
	@SuppressWarnings("deprecation")
	@Override
	public void initialize(URL location, ResourceBundle resources) {
		allDevs = new ArrayList<PcapIf>();
		StringBuilder errbuf = new StringBuilder();
		int r = Pcap.findAllDevs(allDevs, errbuf);
		if (r == Pcap.NOT_OK || allDevs.isEmpty()) {
			textArea.appendText("네트워크 장치를 찾을 수 없습니다.\n" + errbuf.toString() + "\n");
			return;
		}
		textArea.appendText("네트워크 장치를 찾았습니다.\n원하시는 장치를 선택해주세요.\n");
		for (PcapIf device : allDevs) {
			networkList.add(device.getName() + " " +
					((device.getDescription() != null) ? device.getDescription() : "설명 없음"));
		}
		networkListView.setItems(networkList);
	}
	
	public void networkPickAction() {
		if(networkListView.getSelectionModel().getSelectedIndex() < 0) {
			return;
		}
		Main.device = allDevs.get(networkListView.getSelectionModel().getSelectedIndex());
		networkListView.setDisable(true);
		pickButton.setDisable(true);
		
		int snaplen = 64 * 1024;
		int flags = Pcap.MODE_PROMISCUOUS;
		int timeout = 1;
		
		StringBuilder errbuf = new StringBuilder();
		Main.pcap = Pcap.openLive(Main.device.getName(), snaplen, flags, timeout, errbuf);
		
		if (Main.pcap == null) {
			textArea.appendText("네트워크 장치를 열 수 없습니다.\n" + errbuf.toString() + "\n");
			return;
		}
		textArea.appendText("장치선택 : " + Main.device.getName() + "\n");
		textArea.appendText("네트워크 장치를 활성화했습니다");
	}
}

 

Main.java

package controller;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Main extends Application {
	
	public static Pcap pcap = null;
	public static PcapIf device = null;
	
	private Stage primaryStage;
	private AnchorPane layout;
	
	@Override
	public void start(Stage primaryStage) {
		this.primaryStage = primaryStage;
		this.primaryStage.setTitle("JavaFX ARP SPoofing");
		setLayout();
	}
	
	public void setLayout() {
		try {
			FXMLLoader loader = new FXMLLoader();
			loader.setLocation(Main.class.getResource("../view/View.fxml"));
			layout = (AnchorPane) loader.load();
			Scene scene = new Scene(layout);
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Stage getPrimaryStage() {
		return primaryStage;
	}
	
	public static void main(String[] args) {
		launch(args);
	}

}

 

View.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.*?>

<AnchorPane prefHeight="480" prefWidth="490" fx:controller="controller.Controller"
	xmlns:fx="http://javafx.com/fxml/1">
	<children>
		<ListView fx:id="networkListView" layoutX="15" layoutY="14" 
			prefHeight="78" prefWidth="462">
			<items>
				<FXCollections fx:factory="observableArrayList"/>
			</items>
		</ListView>
		<Button fx:id="pickButton" onAction="#networkPickAction" layoutX="395" layoutY="103" 
			prefHeight="29" prefWidth="82" text="PICK"></Button>
		<TextArea fx:id="textArea" editable="false" layoutX="15" layoutY="144" 
			prefHeight="325" prefWidth="462"></TextArea>
	</children>
</AnchorPane>

 

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

공부(14)  (0) 2021.09.12
공부(13)  (0) 2021.09.12
공부(11)  (0) 2021.09.11
공부(10)  (0) 2021.09.10
공부(9)  (0) 2021.09.10

자바FX MVC 모델 틀 잡기

 

prefHeight 높이 설정

 

prefWidth 너비 설정

 

childern 자식 으로 ListView 가 들어갈 수 있는데 하나하나 원소를 담을 수 있는 리스트를 보여주는 공간

 

TextArea 에서 editable 은 수정 가능 여부

 

Main.java

 

package controller;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Main extends Application {
	
	private Stage primaryStage;
	private AnchorPane layout;
	
	@Override
	public void start(Stage primaryStage) {
		this.primaryStage = primaryStage;
		this.primaryStage.setTitle("JavaFX ARP SPoofing");
		setLayout();
	}
	
	public void setLayout() {
		try {
			FXMLLoader loader = new FXMLLoader();
			loader.setLocation(Main.class.getResource("../view/View.fxml"));
			layout = (AnchorPane) loader.load();
			Scene scene = new Scene(layout);
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Stage getPrimaryStage() {
		return primaryStage;
	}
	
	public static void main(String[] args) {
		launch(args);
	}

}

 

 

View.fxml

 

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>


<AnchorPane prefHeight="480" prefWidth="490" xmlns:fx="http://javafx.com/fxml/1">
	<children>
		<ListView layoutX="15" layoutY="14" prefHeight="78" prefWidth="462"></ListView>
		<Button layoutX="395" layoutY="103" prefHeight="29" prefWidth="82" text="PICK"></Button>
		<TextArea editable="false" layoutX="15" layoutY="144" prefHeight="325" prefWidth="462"></TextArea>
	</children>
</AnchorPane>

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

공부(13)  (0) 2021.09.12
공부(12)  (0) 2021.09.11
공부(10)  (0) 2021.09.10
공부(9)  (0) 2021.09.10
공부(8)  (0) 2021.09.10

JavaFX

 

JavaFX는 현재 프로그램 개발의 트렌드라고 할 수 있는 MVC 모델을 따르고 있다

 

M(Model) V(View) C(Controller)

 

이벤트가 생기면 컨트롤러로 넘어가서 처리가 되는데

 

이 컨트롤러는 그러한 이벤트에 따라 어떠한 처리를 한 뒤에 모델과 뷰를 업데이트 시킴 

 

모델 : 데이터의 형태를 정의함

 

뷰 : 모델에서 정의된 데이터를 실제로 사용자한테 출력

 

컨트롤러 : 실질적으로 Model과 view를 다루어 처리

 

이렇게 귀찮은 MVC 모델을 사용하는 이유는?

 

=> 익숙해지면 생산성이 굉장히 높다

 

=> 협업에 유리하다.

 

=> 세계적인 표준으로서의 의미가 있다

 

JavaFX는 다음의 구성요소로 이루어진다

 

1) 레이아웃(Layout) : 실제로 프로그램을 구성하는 내용을 담당 (View)

 

2) 스타일(Style) : 프로그램의 디자인 부분을 담당 (View)

 

3) 비즈니스 로직(Business Logic) : 프로그램의 기능적 부분 담당 (Model, Controller)

 

 

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

공부(12)  (0) 2021.09.11
공부(11)  (0) 2021.09.11
공부(9)  (0) 2021.09.10
공부(8)  (0) 2021.09.10
공부(7)  (0) 2021.09.09

패킷 전송하기

 

package main;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;



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);
		
		byte[] bytes = new byte[14];
		Arrays.fill(bytes, (byte) 0xff);
		
		ByteBuffer buffer = ByteBuffer.wrap(bytes);
		
		if (pcap.sendPacket(buffer) != Pcap.OK) {
			System.out.println(pcap.getErr());
		}
		
		StringBuilder sb = new StringBuilder();
		for (byte b: bytes) {
			sb.append(String.format("%02x ", b & 0xff));
		}
		System.out.println("전송한 패킷: " + sb.toString());
	}

}

 

와이어샤크를 통해 패킷을 전송하는 것을 볼 수 있다

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

공부(11)  (0) 2021.09.11
공부(10)  (0) 2021.09.10
공부(8)  (0) 2021.09.10
공부(7)  (0) 2021.09.09
공부(6)  (0) 2021.09.09

+ Recent posts