Port 스캐너를 JAVA로 코딩해 보았습니다

 

Port 스캐너란

: 해당 IP의 열린 포트가 몇번이 있는지 다 찾아주는 기능을 합니다

( 아무곳이나 막 Port스캔을 사용하게되면 나의 공인 IP가 대상 사이트로 부터 차단될 수 있다 )

 

Main 코드

import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws Exception {
		
		Scanner input = new Scanner(System.in);
		
		int start = 1;						// 기본 포트 시작을 1로 세팅하는 변수
		int end = 0xffff;					// 기본 포트 종료를 FFFF로 세팅하는 변수
		
		String port_range = null;			// 스캔할 포트의 범위를 받는 변수
		String ip = null;					// 대상 IP를 받는 변수
		
		System.out.print("대상 ip 입력 : ");	
		ip = input.nextLine();				// 대상 IP를 입력 받아 변수에 넣는다
		
		System.out.print("포트 범위 입력 (ex:1-100): ");
		port_range = input.nextLine();		// 스캔할 포트의 범위를 입력 받아 변수에 넣는다
		
		// 예외처리
		try {
			// 활성화된 ip인지 확인하기위해 80번 포트로 확인해본다
			new Socket(ip, 80);
			
			// 입력 받은 포트의 범위를 "-" 기준으로 잘라서 배열에 넣는다
			String[] ports = port_range.split("-");
			
			// 입력 받은 포트의 범위가 없을 경우 if문에 들어오지 않는다
			if(!(ports[0].equals("")))
			{	
				// 입력 받은 포트 범위에 0번지를 start 변수에 덮어쓴다
				start = Integer.parseInt(ports[0]);
				// 입력 받은 포트 범위에 1번지를 end 변수에 덮어쓴다
				end = Integer.parseInt(ports[1]);
			}
			
		// IP를 잘못 입력했을 경우의 예외 처리	
		} catch (UnknownHostException e) {
			System.out.println("잘못된 ip 입력");
			return;
		// 모든 경우의 예외 처리
		} catch (Exception e) {
			System.out.println("잘못된 입력");
			return;
		}
		
		// 직접 만든 PortScan 클래스 객체 생성
		PortScan p = null;
		
		// 포트의 범위를 지정한 만큼 포트를 스캔해준다
		for (; start <= end; start++) {
			p = new PortScan(ip, start, 1);
			p.start();
		}
		// 과부하를 방지하기 위한 sleep
		Thread.sleep(10000);
	}
}

 

PortScan 클래스 코드

import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

// 빠른 동작위해 쓰레드 사용
public class PortScan extends Thread {
	
	String ip = null;		// 대상 IP를 담아주는 변수	
	int port = 0;			// 포트 번호 하나를 담아주는 변수
	int timeout = 1000;		// 대기시간에 timeout을 걸어주는 변수
	
	// 생성자를 통해 메인으로 부터 값을 받아 세팅
	public PortScan(String ip, int port, int timeout){
		this.ip = ip;	
		this.port = port;
		this.timeout = timeout * this.timeout;
	}
	
	@Override
	public void run() {
		
		// Sooket 참조 변수
		Socket c = null;
		// SooketAddress를 통해 IP와 Port번호를 받아서 addr 변수에 저장한다
		SocketAddress addr = new InetSocketAddress(this.ip, this.port);
		
		// 예외처리
		try {
			
			//Sooket 객체 생성
			c = new Socket();
			// connect를 통해 addr에 저장된 IP와 PORT로 연결을  시도하고 timeout시간동안 대기한다
			c.connect(addr, this.timeout);
			// 위에서 연결에 성공하면 성공한 포트를 출력한다 실패하면 예외처리로 코드가 끝난다
			System.out.println("open: "+this.port);
			// Sooket를 닫아준다
			c.close();
		} catch (Exception e) {
			
		}	
	}
}

 

동작 캡쳐

 

- 대상 IP 입력란에 IP나 도메인 주소를 넣고 스캔할 포트 범위를 입력해준다

- 입력된 IP와 포트 범위를 대상으로 포트 스캔을 시작한다

'JAVA' 카테고리의 다른 글

IP 스캐너 코딩 (JAVA)  (0) 2020.11.13
생성자 (JAVA)  (0) 2020.11.13
프로세스 관리 코딩 ( JAVA )  (1) 2020.11.12
간단한 구구단 코딩 (JAVA)  (0) 2020.11.05

+ Recent posts