[HC Official] Scout Port Scanner 12-21-2013, 08:35 PM
#1
Hello friends. Today I would like to present to you a port scanner I made in java lately along with its source code. Feel free to modify and redistribute it, but do give me credits if you use this source. If you find any bugs in the software, report it here or email me at arcanist@programmer.net
Screen Shots :
![[Image: up1.png]](http://s14.postimg.org/c8edm5029/up1.png)
![[Image: up2.png]](http://s23.postimg.org/ippf746ob/up2.png)
Source Code :
PortScanner.java
PortScan.java
Ports.java
ProgressUpdate.java
PortScannerGUI.java
Requirements : JDK 1.7 or higher will be required to compile and execute the above code successfully.
Download : https://www.mediafire.com/?tb5bbx39lsip5u4
Regards
Screen Shots :
![[Image: up1.png]](http://s14.postimg.org/c8edm5029/up1.png)
![[Image: up2.png]](http://s23.postimg.org/ippf746ob/up2.png)
Source Code :
PortScanner.java
Code:
package ps;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.SwingUtilities;
/**
*
* @author The Arcanist
* Feel free to modify and redistribute this code.
* If you wish to report any bug or suggest anything, email me at arcanist@programmer.net or fing me in Hack Community
*/
public class PortScanner {
public static InetAddress TARGET;
public static PortScannerGUI psg;
public static boolean stop=false;
public static ExecutorService es;
public static int qty,scnd;
public static void scan() {
if(psg!=null) {
qty=65536;
scnd=-1;
updateProgress();
}
es=Executors.newFixedThreadPool(5);
display("Scanning Ports on Host "+TARGET+"...");
for(int i=1;i<65536;i++) {
es.submit(new PortScan(i));
}
es.shutdown();
}
public static void scan(int lowerPort,int upperPort) {
if(psg!=null) {
qty=upperPort-lowerPort;
scnd=-1;
ProgressUpdate pu=new ProgressUpdate();
Thread t=new Thread(pu);
t.start();
updateProgress();
}
es=Executors.newFixedThreadPool(5);
display("Scanning Ports on Host "+TARGET+"...");
for(int i=lowerPort;i<=upperPort;i++) {
es.submit(new PortScan(i));
}
es.shutdown();
}
public static void scan(int ports[]) {
if(psg!=null) {
qty=ports.length;
scnd=-1;
ProgressUpdate pu=new ProgressUpdate();
Thread t=new Thread(pu);
t.start();
updateProgress();
}
es=Executors.newFixedThreadPool(5);
display("Scanning Ports on Host "+TARGET+"...");
for(int i=0;i<ports.length;i++) {
es.submit(new PortScan(ports[i]));
}
es.shutdown();
}
public static void updateProgress() {
scnd++;
if(scnd>=qty && !ProgressUpdate.stop) {
ProgressUpdate.stop=true;
psg.updateProgress(100);
psg.addToLog("Scan Completed!");
psg.scanOver();
}
}
public static void stopScan() {
es.shutdownNow();
}
public static void display(String str) {
if(psg==null) {
System.out.println(str);
}
else {
psg.addToLog(str);
}
}
public static void main(String args[]) {
String host;
int argl=args.length;
if(argl==0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
psg=new PortScannerGUI();
}
});
}
else {
switch(argl) {
case 1:
host=args[0];
try {
TARGET=Inet4Address.getByName(host);
}
catch(UnknownHostException e) {
display("Error : Unknown Host "+host);
System.exit(-2);
}
scan();
break;
case 2:
host=args[0];
String param=args[1];
try {
TARGET=Inet4Address.getByName(host);
}
catch(UnknownHostException e) {
display("Error : Unknown Host "+host);
System.exit(-2);
}
int index=param.indexOf('-');
if(index>0 && index<param.length() && param.lastIndexOf('-')==index) {
String range[]=param.split("-");
int upperPort=0,lowerPort=0;
try {
lowerPort=Integer.parseInt(range[0]);
upperPort=Integer.parseInt(range[1]);
if(lowerPort<0 || lowerPort>65536 || upperPort<0 || upperPort>65536)
throw new NumberFormatException();
}
catch(NumberFormatException e) {
display("Error : The Port numbers must be integer values between 0 and 65536.");
System.exit(-1);
}
scan(lowerPort,upperPort);
}
else {
String ports[]=param.split(",");
int portList[]=new int[ports.length];
try {
for(int i=ports.length-1;i>=0;i--) {
portList[i]=Integer.parseInt(ports[i]);
if(portList[i]<0 || portList[i]>65536)
throw new NumberFormatException();
}
}
catch(NumberFormatException e) {
System.out.println("Error : The Port numbers must be integer values between 0 and 65536.");
System.exit(-1);
}
scan(portList);
}
break;
default:
System.out.println("Error in format of parameters");
}
}
}
}
PortScan.java
Code:
package ps;
import java.io.IOException;
import java.net.Socket;
public class PortScan implements Runnable{
private int port;
public PortScan(int port) {
this.port=port;
}
@Override
public void run() {
@SuppressWarnings("unused")
Socket socket=null;
try {
socket=new Socket(PortScanner.TARGET,port);
display();
PortScanner.updateProgress();
}
catch(IOException e) {
PortScanner.updateProgress();
//when the exception is thrown, the port was closed
}
}
public void display() {
if(PortScanner.psg==null) {
System.out.print("Port "+port+" is open on host "+PortScanner.TARGET);
if(Ports.ports.get(port)!=null)
System.out.println(" : "+Ports.ports.get(port));
}
else {
if(Ports.ports.get(port)!=null)
PortScanner.psg.addToLog("Port "+port+" is open on host "+PortScanner.TARGET+
" : "+Ports.ports.get(port));
else
PortScanner.psg.addToLog("Port "+port+" is open on host "+PortScanner.TARGET);
}
}
}
Ports.java
Code:
package ps;
import java.util.HashMap;
public class Ports {
static HashMap<Integer,String> ports;
static {
ports=new HashMap<Integer,String>();
ports.put(1, "TCP Port Service Multiplexer (TCPMUX)");
ports.put(5, "Remote Job Entry (RJE)");
ports.put(7, "ECHO");
ports.put(18, "Message Send Protocol (MSP)");
ports.put(20, "FTP Data Transfer");
ports.put(21, "FTP Control (Command)");
ports.put(22, "SSH Remote Login Protocol");
ports.put(23, "Telnet");
ports.put(25, "Simple Mail Transfer Protocol (SMTP)");
ports.put(29, "MSG ICP");
ports.put(37, "Time Protocol");
ports.put(42, "Host Name Server (Nameserv)");
ports.put(43, "Whois");
ports.put(49, "Login Host Protocol (Login)");
ports.put(53, "Domain Name System (DNS)");
ports.put(69, "Trivial File Transfer Protocol (TFTP)");
ports.put(70, "Gopher Services");
ports.put(79, "Finger");
ports.put(80, "HTTP");
ports.put(103, "X 400 Standard");
ports.put(108, "SNA Gateway Access Server");
ports.put(109, "Post Office Protocol v2 (POP2)");
ports.put(110, "Post Office protocol v3 (POP3)");
ports.put(115, "Simple File Transfer Protocol (SFTP)");
ports.put(118, "SQL Services");
ports.put(119, "Network News Transfer Protocol (NNTP)");
ports.put(137, "NetBIOS Name Service");
ports.put(139, "NetBIOS Datagram Service");
ports.put(143, "Interim Mail Access Protocol (IMAP)");
ports.put(150, "NetBIOS Session Service");
ports.put(156, "SQL Server");
ports.put(161, "Simple Network Management Protocol (SNMP)");
ports.put(179, "Border Gateway Protocol (BGP)");
ports.put(190, "Gateway Access Control Protocol (GACP)");
ports.put(194, "Internet Relay Chat (IRC)");
ports.put(197, "Directory Location Service (DLS)");
ports.put(389, "Lightweight Directory Access Protocol (LDAP)");
ports.put(444, "Simple Network Paging Protocol (SNPP)");
ports.put(445, "Microsoft DS");
ports.put(458, "Apple Quicktime");
ports.put(546, "DHCP Client");
ports.put(547, "DHCP Server");
ports.put(563, "SNEWS");
ports.put(569, "MSN");
ports.put(1080, "Socks");
}
}
ProgressUpdate.java
Code:
package ps;
public class ProgressUpdate extends Thread {
public static boolean stop=false;
@Override
public void run() {
stop=false;
while(!stop) {
PortScanner.psg.updateProgress((int)(((float)PortScanner.scnd/PortScanner.qty)*100));
try {
Thread.sleep(100);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public void stopProg() {
stop=true;
}
}
PortScannerGUI.java
Code:
package ps;
import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import static java.awt.GraphicsDevice.WindowTranslucency.*;
public class PortScannerGUI implements ItemListener,ActionListener{
private JFrame frame;
private JLabel hostLabel,rangeLabel,toLabel,specificLabel1,specificLabel2,logLabel;
private JTextField hostField,startRangeField,endRangeField,specificField;
private JTextArea logArea;
private JScrollPane logScroll;
private ButtonGroup radioGroup;
private JRadioButton rangeRadio,specificRadio;
private JButton startButton,stopButton,exitButton;
private JProgressBar progressBar;
private StringBuffer logString;
private JLabel logo,header;
private boolean scanState;
public PortScannerGUI() {
frame=new JFrame("Scout Port Scanner");
frame.setBounds(200, 20, 600, 700);
frame.setResizable(false);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage("logo.png"));
hostLabel=new JLabel("Host");
hostLabel.setBounds(20,100,100,30);
hostField=new JTextField(16);
hostField.setBounds(120,100,300,30);
hostField.setText("127.0.0.1");
radioGroup=new ButtonGroup();
rangeRadio=new JRadioButton("Scan in a range");
rangeRadio.setBounds(20,150,200,30);
rangeRadio.setSelected(true);
rangeRadio.addItemListener(this);
specificRadio=new JRadioButton("Scan specific ports");
specificRadio.setBounds(20,250,200,30);
specificRadio.addItemListener(this);
radioGroup.add(rangeRadio);
radioGroup.add(specificRadio);
rangeLabel=new JLabel("Range");
rangeLabel.setBounds(20,200,100,30);
startRangeField=new JTextField(16);
startRangeField.setBounds(120,200,70,30);
startRangeField.setText("1");
toLabel=new JLabel("to");
toLabel.setBounds(200,200,30,30);
endRangeField=new JTextField(16);
endRangeField.setBounds(220,200,70,30);
endRangeField.setText("1024");
specificLabel1=new JLabel("Port Numbers");
specificLabel1.setBounds(20,310,100,30);
specificField=new JTextField(16);
specificField.setBounds(120,310,300,30);
specificLabel2=new JLabel("(enter port numbers separated by a single comma)");
specificLabel2.setBounds(120,340,300,30);
startButton=new JButton("Start");
startButton.setBounds(450,100,100,30);
startButton.addActionListener(this);
stopButton=new JButton("Stop");
stopButton.setBounds(450,140,100,30);
stopButton.addActionListener(this);
exitButton=new JButton("Exit");
exitButton.setBounds(450, 180, 100, 30);
exitButton.addActionListener(this);
progressBar=new JProgressBar();
progressBar.setBounds(20,390,540,30);
progressBar.setStringPainted(true);
logLabel=new JLabel("Scan Log");
logLabel.setBounds(20,440,100,30);
logArea=new JTextArea();
logArea.setEditable(false);
logScroll=new JScrollPane(logArea);
logScroll.setBounds(20,470,540,200);
logString=new StringBuffer();
logo=new JLabel();
logo.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage("logo.png")));
logo.setBounds(30,20,42,50);
header=new JLabel("Scout Port Scanner v-1.0");
header.setFont(new Font(Font.MONOSPACED,Font.BOLD,30));
header.setBounds(105, 20, 450, 50);
frame.add(logo);
frame.add(header);
frame.add(hostLabel);
frame.add(hostField);
frame.add(rangeRadio);
frame.add(specificRadio);
frame.add(rangeLabel);
frame.add(startRangeField);
frame.add(toLabel);
frame.add(endRangeField);
frame.add(specificLabel1);
frame.add(specificField);
frame.add(specificLabel2);
frame.add(startButton);
frame.add(stopButton);
frame.add(exitButton);
frame.add(progressBar);
frame.add(logLabel);
frame.add(logScroll);
updateSelected();
updateSelected2();
setTheme();
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd=ge.getDefaultScreenDevice();
if(gd.isWindowTranslucencySupported(TRANSLUCENT)) {
frame.setOpacity(0.9f);
}
frame.setVisible(true);
scanState=false;
}
public void updateSelected() {
if(specificRadio.isSelected()) {
rangeLabel.setEnabled(false);
startRangeField.setEnabled(false);
endRangeField.setEnabled(false);
toLabel.setEnabled(false);
specificLabel1.setEnabled(true);
specificField.setEnabled(true);
specificLabel2.setEnabled(true);
}
else if(rangeRadio.isSelected()){
rangeLabel.setEnabled(true);
startRangeField.setEnabled(true);
endRangeField.setEnabled(true);
toLabel.setEnabled(true);
specificLabel1.setEnabled(false);
specificField.setEnabled(false);
specificLabel2.setEnabled(false);
}
}
public void updateSelected2() {
if(scanState) {
stopButton.setEnabled(true);
exitButton.setEnabled(false);
startButton.setEnabled(false);
}
else {
stopButton.setEnabled(false);
exitButton.setEnabled(true);
startButton.setEnabled(true);
}
}
public void updateProgress(int val) {
progressBar.setValue(val);
}
public void addToLog(String str) {
String s=new String(logString);
if(!s.equals(s.replace(str, "")))
return;
logString.append(str);
logString.append("\n");
logArea.setText(new String(logString));
}
public void scanOver() {
scanState=false;
updateSelected2();
}
public void setTheme() {
frame.setUndecorated(true);
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (Exception e) {
}
UIManager.put("nimbusBase", Color.red);
UIManager.put("nimbusBlueGrey", Color.black);
UIManager.put("control", Color.black);
UIManager.put("nimbusOrange", Color.red);
UIManager.put("nimbusLightBackground", Color.darkGray);
UIManager.put("text", Color.white);
UIManager.put("nimbusDisabledText", Color.darkGray);
UIManager.put("nimbusSelectionBackground", Color.red);
SwingUtilities.updateComponentTreeUI(frame);
}
@Override
public void itemStateChanged(ItemEvent e) {
updateSelected();
}
@Override
public void actionPerformed(ActionEvent e) {
Object event=e.getSource();
if(event==exitButton) {
frame.dispose();
}
else if(event==startButton) {
try {
PortScanner.TARGET=Inet4Address.getByName(hostField.getText());
}
catch(UnknownHostException e1){
e1.printStackTrace();
}
logString=new StringBuffer();
if(rangeRadio.isSelected()) {
int upper=0,lower=0;
try {
upper=Integer.parseInt(endRangeField.getText());
lower=Integer.parseInt(startRangeField.getText());
if(upper<1 || upper>65536 || lower<1 || lower>65536) {
throw new NumberFormatException();
}
}
catch(NumberFormatException e1 ){
addToLog("Error : The Port numbers must be integer values between 0 and 65536.");
return;
}
PortScanner.scan(lower,upper);
scanState=true;
updateSelected2();
}
else if(specificRadio.isSelected()){
String str[]=specificField.getText().split(",");
int ports[]=new int[str.length];
for(int i=0;i<str.length;i++) {
try {
ports[i]=Integer.parseInt(str[i].trim());
}
catch(NumberFormatException e1) {
addToLog("Error : The Port numbers must be integer values between 0 and 65536.");
return;
}
}
PortScanner.scan(ports);
scanState=true;
updateSelected2();
}
}
else if(event==stopButton) {
PortScanner.stopScan();
scanState=false;
updateSelected2();
}
}
}
Requirements : JDK 1.7 or higher will be required to compile and execute the above code successfully.
Download : https://www.mediafire.com/?tb5bbx39lsip5u4
Regards
Folow me on My YouTube Channel if you're into art.