( 아무곳이나 막 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) {
}
}
}