Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Архив блога

пятница, 17 сентября 2010 г.

Однопоточный сканер портов

Напишем сканер портов. Он пока что будет состоять из одного потока. Сканирование портов - попытка выяснить, какие порты открыты на конкретной машине. Цель этого сканирования может быть как благая (например, системный администратор хочет по максимуму обезопасить хост, и для этого ему нужно закрыть часть из открытых портов), так и вредоносная (злоумышленник хочет выяснить, какие сетевые сервисы запущены на хосте с целью внедрить вредоносную программу).

В Java мы имеем возможность перебирать порты и пробовать подключиться к порту. Если подключение произошло, значит, порт открыт. Если нет, то порт закрыт.

Код сканера:

import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
 
 
public class PortScanner {
 
private int minPort = 1;
private int maxPort = 0x10000;
private String host = "192.168.1.104";
private int timeout = 100;
 
public int getTimeout() {
return timeout;
}
 
public void setTimeout(int timeout) {
this.timeout = timeout;
}
 
public int getMinPort() {
return minPort;
}
 
public void setMinPort(int minPort) {
this.minPort = minPort;
}
 
public int getMaxPort() {
return maxPort;
}
 
public void setMaxPort(int maxPort) {
this.maxPort = maxPort;
}
 
public String getHost() {
return host;
}
 
public void setHost(String host) {
this.host = host;
}
 
public List<Integer> scan() {
try {
InetAddress ia = InetAddress.getByName(getHost());
return scan(ia);
} catch (IOException ioe) {
return null;
}
}
 
List<Integer> scan(InetAddress inetAddress) {
List<Integer> openPortsList = new ArrayList<Integer>(0xFF);
System.out.println("scanning ports: ");
for (int port = minPort; port <= maxPort; port++) {
System.out.print(port);
try {
InetSocketAddress isa = new InetSocketAddress(inetAddress,port);
Socket socket = new Socket();
socket.connect(isa,timeout);
System.out.println(" opened");
openPortsList.add(port);
socket.close();
} catch (IOException ioe) {
System.out.println("");
}
}
return openPortsList;
}
 
public static void main(String[] args) {
if (args.length < 1) {
usage();
return;
}
 
String host = args[0];
System.out.println("Scanning host "+host);
 
PortScanner scanner = new PortScanner();
 
if (args.length==2) {
if (args[1].indexOf("-")>-1) {
// range of ports pointed out
String[] ports = args[1].split("-");
try {
int minPort = Integer.parseInt(ports[0]);
int maxPort = Integer.parseInt(ports[1]);
scanner.setMinPort(minPort);
scanner.setMaxPort(maxPort);
} catch (NumberFormatException nfe) {
System.out.println("Wrong ports!");
return;
}
} else {
// one port pointed out
try {
int port = Integer.parseInt(args[1]);
scanner.setMinPort(port);
scanner.setMaxPort(port);
} catch (NumberFormatException nfe) {
System.out.println("Wrong port!");
return;
}
}
}
 
scanner.setHost(host);
List<Integer> openPortsList = scanner.scan();
if (openPortsList != null) {
if (openPortsList.size() >0) {
System.out.println("List of opened ports:");
for (Integer openedPort : openPortsList) {
System.out.println(openedPort);
}
} else {
System.out.println("No opened ports!");
}
} else {
System.out.println("Error happened!");
}
}
 
static void usage() {
System.out.println("Java Port Scanner usage: ");
System.out.println("java PortScanner host port");
System.out.println("Examples:");
System.out.println("java PortScanner 192.168.1.100 1-1024");
System.out.println("java PortScanner 192.168.1.100 1099");
System.out.println("java PortScanner 192.168.1.100 (this scans all ports from 1 to 0x10000)");
}
}


Все действие происходит в методе scan. В общем, там все довольно понятно, так что, мне кажется, объяснения излишни. Code is the best document!

П.С. Хороший открытый сканер портов на Java - Angry IP Scanner.

2 комментария:

Постоянные читатели