首頁 » 原創 » 正文

[原創/技術]基於socket遠程控制的實現

本文原創,禁止轉載!
本文圖片和文字做了處理,去除了一些可能洩露隱私的個人信息。
BUG信息提示
請注意被控端serve.java文件中異常被扔出後沒有處理,造成一旦主控端輸入文件夾不存在,被控端就會自動退出。
摘要
本文首先介紹了一些基本概念,接著提出了製作本程式的動機和面向的背景,然後介紹了軟體的功能,最後提出了軟體未來需要改進的地方和可以增設的擴展功能。
Abstract
This article first introduces some basic concepts, and then proposes the motivation and background for making this program. Then it introduces the functions of the software. Finally, it proposes the areas where the software needs to be improved and the extensions that can be added.
軟體界面
p (1)
基本概念
Java是本程式的編程語言,它是面向對象的高級語言,有著良好的安全性與可移植性。Socket是應用程式之間的通信橋樑,兩個程式可以在不同主機通過socket傳遞消息。Swing是一款界面工具開發包,允許程序員使用較少的代碼獲得豐富的畫面。
製作動機
之前上課老師說過製作socket通訊相關的程式可以在期末55分到60分的情況下勉強算及格,雖然我不認為我會需要這5分,但還是針對socket展開了學習,結合我以前所學的java知識,使用2天(共30小時)編寫出了這樣一款軟體。主要的動機是練習socket通訊的相關內容,並複習java程式的編寫方法,由於期末快到,時間有限,代碼寫的比較散漫,但可以用作參考。

面向背景
1.在個人計算機上安裝被控端,等到計算機丟失時保護個人信息不洩露。
2.在辦公室簡單的控制家用電腦。
3.學生之間的相互學習和交流。

軟體功能
1.基礎命令:遠程控制被控端關機,重啟,註銷和鎖定。
2.擴展功能:遠程格式化所有磁盤(除系統盤),時間同步,發送測試封包等。
3.查找文件:可以查看遠程計算機中的所有文件,也可以單列出某個目錄下的單一類型文件,並將文件信息返回主控端,主控端可單獨獲取這些信息,也可以進行下一步操作。
4.加解密:程式可以對指定範圍內的特定文件進行DES標準加密和解密。
5.彈出消息:在被控端主機彈出消息。消息內容可以自定義。
6.高級指令:允許任意的cmd命令,更快速在被控端實現更廣泛的操作。
部分功能使用方法
1.讓遠程計算機立刻關機
p (2)
第一步輸入對方ip,第二步輸入對方埠號,第三步點擊送出。在之後的解說中,我默認用戶已經完成了前兩步,就不再說明了。
2.讓遠程計算機三分鐘後關機
p (3)
在高級指令中輸入代碼「shutdown -s -t 180」,點擊「送出」。
3.註銷遠程計算機
p (4)
在基礎命令下拉菜單選擇「註銷」,然後點擊「送出」
4.查找D盤test文件夾下的所有文件
p (5)
第一步輸入文件路徑(也可以直接寫驅動器磁碟號,例如:D:\),然後輸入要找的後綴名,最後點擊查找。
5.加密d碟下的所有jpg圖像文件
p (6)
第一步輸入路徑,第二部輸入後綴,最後點擊加密。
我們來看下加密的效果:
對於文本文件:
加密前:
p (7)
加密後:
p (8)
對於圖像文件:
加密前:
p (9)
加密後:
p (10)
應用程式:
加密前:
p (11)
加密後:
p (12)
解密的方法與加密類似,不再贅述。
p (13)
6.給被控端發送消息
p (14)
輸入消息後點「送出消息」。
顯示效果:
p (15)
代碼解析

被控端:

function.java
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
 * 這是一個功能類,保存了程式需要用到的大部分功能。
 * 大部分的函數都有一個String類型的參數,它是接受來自server.java的指令,
 * 而實際上,這個文件的指令是由client.java發送的,它在主控主機中,
 * 發送指令給server.java。server接受命令後交給function處理。
 */
public class function {
	/**
	 * encrypt為加密與解密程序,encryptState用來表示是加密過程還是
	 * 解密過程,它的初始值為0.當函數收到指令後,正確格式為"**1,D:\\xxx,txt",
	 * 它會被分解成3個String存儲在subcommand數組中,其中**是前置指令判斷標識,
	 * 用於告訴前面的處理函數把它交給encrypt函數處理,後面的1代表加密,2代表解密,
	 * 後面D:\\代表文件路徑,txt代表文件類型,這些參數都是由主控端收集並用統一的
	 * String傳遞,最後再拆分給不同的參數使用。
	 * */
	public boolean encrypt(String command){
	int encryptState=0;//加密還是解密
	if(command.startsWith("**")){ //再次確認是否是加解密指令
	//如果是加密,狀態設為1
	if(command.startsWith("**1"))encryptState=1;
	//如果是加密,狀態設為2
	if(command.startsWith("**2"))encryptState=2;
	 //String數組接受參數
	 String subCommand[]=new String[]{"","","",""};
	 //filePath接受文件路徑
	 String filePath="";
	 //suffix接受文件後綴
	 String suffix="";
	 //分隔指令
	 subCommand=command.split(",");
	 filePath=subCommand[1];
	 suffix=subCommand[2];
	 //將所有文件保存在一個list當中
    List ll = getFiles(new File(filePath),suffix);
    //遍歷文件 
    for (File ff : ll) {
        String oldPathName=ff.getPath();
        String subPathName[]=new String[]{"","",""};
        String newPathName="";
       /**
        * 在實際操作中,會有因為同名文件而造成被佔用的情況,
        * 經過長時間的調試,我想到一個辦法,先創建一個加密副本,
        * 在文件末尾填上「[c]」,然後再刪除原來的文件,防止佔用的情況。
        * 因為原來的文件名包含後綴,所以我先把文件名和後綴分離在加上標識。
        * */
        subPathName=oldPathName.split("\\.");
        newPathName=subPathName[0]+"[c]."+subPathName[1];
        //實例化並加入參數
        encrypt td = new encrypt("aaa"); 
       //如果是加密
	    if(encryptState==1){
        try {
        	//執行加密
			td.encrypt(oldPathName,newPathName);
        } catch (Exception e) {
        	return false;
		}}
	    //如果是解密
	    else if(encryptState==2){
	    try {
			td.decrypt(oldPathName,newPathName);
		} catch (Exception e) {
			//當程式有錯誤,返回false
			return false;
		}}
	    else{return false;}
	    //加解密後刪除源文件
	    if(ff.exists()){ff.delete();}
	    }
	}
	//程式沒有錯誤,返回true
	return true;
}
	/**
	 * 這個函數用來遍歷所有的文件,部分參數已經在之前解釋過了,不再贅述。
	 * */
	public boolean listFiles(Socket socket,String command){
		function f = new function();
		 String subCommand[]=new String[]{"","","",""};
		 String filePath="";
		 String suffix=""; 
		 subCommand=command.split(",");
		 filePath=subCommand[1];
		 suffix=subCommand[2];
		List ll = f.getFiles(new File(filePath),suffix);
	 	//打開socket的輸出流
		OutputStream os;
	 	try {   //獲取輸出流
				os = socket.getOutputStream();
			} catch (IOException e) {
				return false;
			}
	 	PrintWriter pw = new PrintWriter(os);
		pw.write("指定目錄的指定類型文件有:\n");
		int number=0;
		for (File ff : ll) {
			number++;
			//寫到PrintWriter中
			pw.write("第["+number+"]個文件:");
			//獲取文件路徑並保存到pw
	    	pw.write(ff.getPath()+"\n");}
		if(number==0){
			//如果文件數量為0
			pw.write("指定目錄沒有文件!");}
		 //輸出緩存
		 pw.flush();
		 //關閉連接
	     pw.close();
	     //沒有發生異常
	     return true;
}
	
/**
 * 這個函數用來執行cmd指令,事實上,所有的基礎,擴展和高級指令都由它交給windows系統
 * 處理,它以「##」開頭,分隔掉##後的指令部分直接執行。
 * */
	public boolean exec(String command){
		//再次確認是否是否是可執行指令
		if(command.startsWith("##")){
			//調用系統命令提示符
			Runtime r = Runtime.getRuntime();
			try {
				r.exec(command.substring(2, command.length()));
			} catch (IOException e) {return false;}//如果執行失敗返回false
		}
		//如果執行成功返回true
		return true;
	}
	//專門用來遍歷全部的文件
	public List getFiles(File fileDir, String fileType) {
       //新建一個ArrayList保存文件引用
		List lfile = new ArrayList();
        //列出文件
		File[] fs = fileDir.listFiles();
        //遍歷文件再加入lfile中
		for (File f : fs) {
			//如果是文件
            if (f.isFile()) {
               //如果文件類型符合
            	if (fileType
                        .equals(f.getName().substring(
                                f.getName().lastIndexOf(".") + 1,
                                f.getName().length())))
                    //添加到lfile中
            		lfile.add(f);
            } else {
            	//不是文件,也看做對象
                List ftemps = getFiles(f,fileType);
                lfile.addAll(ftemps);
            }
        }
		//返回這個list
        return lfile;
    }
}

Encrypt.java
//導入包略  
public class encrypt {   
  Key key;   
  //生成秘鑰
  public encrypt(String str) {   
    getKey(str);  
  }   
  //將key生成  
  public void getKey(String strKey) {   
    try {   
        KeyGenerator kg = KeyGenerator.getInstance("DES");   
        kg.init(new SecureRandom(strKey.getBytes()));   
        this.key = kg.generateKey();   
        kg = null;   
    } catch (Exception e) {}   
  }   
 //加密函數
  public void encrypt(String file, String destFile) throws Exception {   
    Cipher cipher = Cipher.getInstance("DES");  
    cipher.init(Cipher.ENCRYPT_MODE, this.key); 
    //獲取文件的輸入流
    InputStream is = new FileInputStream(file);   
    //獲取文件的輸出流
    OutputStream out = new FileOutputStream(destFile);   
    CipherInputStream cis = new CipherInputStream(is, cipher); 
    //創建緩存數組
    byte[] buffer = new byte[1024];   
    int r;   
    while ((r = cis.read(buffer)) > 0) {   
        out.write(buffer, 0, r);   
    }   
    cis.close();   
    is.close();   
    out.close();   
  }   
  //解密函數  
  public void decrypt(String file, String dest) throws Exception {   
    Cipher cipher = Cipher.getInstance("DES");   
    cipher.init(Cipher.DECRYPT_MODE, this.key); 
    //獲取輸入流
    InputStream is = new FileInputStream(file);
    //獲取輸出流
    OutputStream out = new FileOutputStream(dest);   
    CipherOutputStream cos = new CipherOutputStream(out, cipher);   
    //開緩存
    byte[] buffer = new byte[1024];   
    int r;   
    while ((r = is.read(buffer)) >= 0) {   
      cos.write(buffer, 0, r);   
    }  
    //關閉流
    cos.close();   
    out.close();   
    is.close();   
  }   
 }  

Server.java
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) throws Exception {
	//當執行完一個指令後,繼續監聽下一個命令
	while(true){
	//打開這個埠
	ServerSocket serverSocket =new ServerSocket(2333);
	//始終監聽這個埠
	Socket socket = serverSocket.accept();
	//獲取socket輸入流
	InputStream is = socket.getInputStream();
	//把輸入流存到Reader中
	InputStreamReader isr =new InputStreamReader(is);
	BufferedReader br =new BufferedReader(isr);
	String info =null;
	//當br一行不為空時,讀取它
	while((info=br.readLine())!=null){
	//實例化function類
	function fn=new function();
	//如果指令以##開頭,交給exec函數處理
	if(info.startsWith("##")){fn.exec(info);}
	//如果指令以**開頭,交給encrypt函數處理
	if(info.startsWith("**")){fn.encrypt(info);}
	//如果指令以&&開頭,交給listFiles處理
	if(info.startsWith("&&")){fn.listFiles(socket,info);}}
	//各種流的關閉
	br.close();
	isr.close();
	is.close();
	socket.close();
	serverSocket.close();
	}}
}

主控端:

client.java
//import包的部分,為節約篇幅,略。
public class client {
	public String call(String command,String ip,int port) {
	try{Socket socket =new Socket(ip,port);//建立socket通訊,它的ip和埠由前端UI獲得
OutputStream os = socket.getOutputStream();//這是一個位元組輸出流,輸出相應的信息
	PrintWriter pw =new PrintWriter(os);//將輸出流包裝成列印流
	pw.write(command);//傳遞command指令到緩存
	pw.flush();//傳送緩存
	ocket.shutdownOutput();//關閉輸出流
	InputStream is = socket.getInputStream();//獲取輸入流,獲取伺服器回應字元
	BufferedReader br = new BufferedReader(new InputStreamReader(is)); //將輸入流存到Buffer
	String info = null;String msgCol="";//保存消息組
	while((info=br.readLine())!=null){//當br不為null時,保存到msgCol
	msgCol=msgCol+info+"\n";}
br.close();is.close();pw.close();os.close();socket.close();//各種流的關閉
	return msgCol;//將msgCol即全部的返回信息傳給調用函數
	}catch(Exception e){}return "err";}}//如果不正常結束,返回err告知調用函數

mainFrame.java
/**
*這個類主要控制程式的UI,它是由可視化Swing編程工具生成的,由於不涉及
*技術演算法,並沒有什麼注釋。
*/
import java.awt.Color;

/*
* mainFrame.java
*
* Created on __DATE__, __TIME__
*/

/**
*這個類主要控制程式的UI,它是由可視化Swing編程工具生成的,由於不涉及
*技術演算法,並沒有什麼注釋。
*/
public class mainFrame extends javax.swing.JFrame {

/** Creates new form mainFrame */
public mainFrame() {
initComponents();
}

//GEN-BEGIN:initComponents
//
private void initComponents() {

jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
jTextField2 = new javax.swing.JTextField();
jComboBox1 = new javax.swing.JComboBox();
jComboBox2 = new javax.swing.JComboBox();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jLabel6 = new javax.swing.JLabel();
jTextField3 = new javax.swing.JTextField();
jLabel7 = new javax.swing.JLabel();
jTextField4 = new javax.swing.JTextField();
jButton4 = new javax.swing.JButton();
jLabel8 = new javax.swing.JLabel();
jTextField5 = new javax.swing.JTextField();
jTextField6 = new javax.swing.JTextField();
jLabel9 = new javax.swing.JLabel();
jButton5 = new javax.swing.JButton();
jLabel10 = new javax.swing.JLabel();
jTextField7 = new javax.swing.JTextField();
jButton6 = new javax.swing.JButton();
jLabel11 = new javax.swing.JLabel();
jTextField8 = new javax.swing.JTextField();
jButton7 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jLabel12 = new javax.swing.JLabel();
jTextField9 = new javax.swing.JTextField();
jButton8 = new javax.swing.JButton();
jLabel13 = new javax.swing.JLabel();
jLabel14 = new javax.swing.JLabel();
jTextField10 = new javax.swing.JTextField();
jLabel13.setOpaque(true);

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jLabel1.setText(“\u9060\u63a7\u52a9\u624bV1.0 xxx”);

jLabel2.setText(“\u5c0d\u65b9IP”);

jTextField1.setText(“127.0.0.1”);

jLabel3.setText(“\u7aef\u53e3\u865f”);

jTextField2.setText(“2333”);

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
“關機”, “重啟”, “註銷”, “鎖定” }));
jComboBox1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jComboBox1ActionPerformed(evt);
}
});

jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
“格式化所有磁盤”, “停止DLL文件運行”, “時間同步”, “發送封包” }));
jComboBox2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jComboBox2ActionPerformed(evt);
}
});

jLabel4.setText(“\u57fa\u790e\u547d\u4ee4”);

jLabel5.setText(“\u9ad8\u7d1a\u547d\u4ee4”);

jButton2.setText(“\u9001\u51fa”);
jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton2MouseClicked(evt);
}
});

jButton3.setText(“\u9001\u51fa”);
jButton3.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton3MouseClicked(evt);
}
});

jLabel6.setText(“\u9060\u7a0b\u52a0\u5bc6 \u5728\u4e0b\u65b9\u8f38\u5165\u6587\u4ef6\u593e\u8def\u5f91”);

jTextField3.setText(“D:\\\\test”);

jLabel7.setText(“\u5f8c\u7db4”);

jTextField4.setText(“txt”);

jButton4.setText(“\u52a0\u5bc6”);
jButton4.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton4MouseClicked(evt);
}
});

jLabel8.setText(“\u9060\u7a0b\u89e3\u5bc6 \u5728\u4e0b\u65b9\u8f38\u5165\u6587\u4ef6\u593e\u8def\u5f91”);

jTextField5.setText(“D:\\\\test”);

jTextField6.setText(“txt”);

jLabel9.setText(“\u5f8c\u7db4”);

jButton5.setText(“\u89e3\u5bc6”);
jButton5.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton5MouseClicked(evt);
}
});

jLabel10.setText(“\u5f48\u51fa\u6d88\u606f”);

jTextField7.setText(“\u9019\u662f\u4e00\u500b\u6d88\u606f”);

jButton6.setText(“\u9001\u51fa\u6d88\u606f”);
jButton6.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton6MouseClicked(evt);
}
});

jLabel11.setText(“\u67e5\u627e\u6587\u4ef6”);

jTextField8.setText(“D:\\\\test”);
jTextField8.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField8ActionPerformed(evt);
}
});

jButton7.setText(“\u67e5\u627e”);
jButton7.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton7MouseClicked(evt);
}
});

jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);

jLabel12.setText(“\u9ad8\u7d1a\u6307\u4ee4”);

jButton8.setText(“\u9001\u51fa”);
jButton8.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton8MouseClicked(evt);
}
});

jLabel13.setText(“[\u8a0a\u606f]\u6e96\u5099\u5c31\u7dd2,\u7b49\u5f85\u6307\u4ee4…”);

jLabel14.setText(“xxx DEC/2017”);

jTextField10.setText(“txt”);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addContainerGap()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jLabel7)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(
jTextField4,
javax.swing.GroupLayout.PREFERRED_SIZE,
86,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel8)
.addGroup(
layout.createSequentialGroup()
.addComponent(
jLabel9)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(
jTextField6,
javax.swing.GroupLayout.PREFERRED_SIZE,
84,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel1)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
false)
.addGroup(
javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addComponent(
jLabel12,
javax.swing.GroupLayout.PREFERRED_SIZE,
78,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField9,
javax.swing.GroupLayout.PREFERRED_SIZE,
430,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jButton8,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
.addGroup(
javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING,
false)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jLabel2)
.addComponent(
jLabel4)
.addComponent(
jLabel5))
.addGap(7,
7,
7)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(
jButton5,
javax.swing.GroupLayout.PREFERRED_SIZE,
88,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jButton4,
javax.swing.GroupLayout.PREFERRED_SIZE,
90,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(
javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addGap(23,
23,
23)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jComboBox1,
0,
86,
Short.MAX_VALUE)
.addComponent(
jTextField1)
.addComponent(
jComboBox2,
0,
86,
Short.MAX_VALUE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addGap(18,
18,
18)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING,
false)
.addComponent(
jButton2,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(
jButton3,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)))
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jLabel3)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))))))
.addGroup(
layout.createSequentialGroup()
.addComponent(
jLabel6)
.addGap(120,
120,
120))
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField3,
javax.swing.GroupLayout.PREFERRED_SIZE,
304,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField5,
javax.swing.GroupLayout.PREFERRED_SIZE,
304,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(
jLabel13,
javax.swing.GroupLayout.DEFAULT_SIZE,
304,
Short.MAX_VALUE))
.addGap(47,
47,
47)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(
jLabel10)
.addComponent(
jScrollPane1)
.addComponent(
jLabel11)
.addGroup(
javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(
jTextField8,
javax.swing.GroupLayout.DEFAULT_SIZE,
164,
Short.MAX_VALUE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField10,
javax.swing.GroupLayout.PREFERRED_SIZE,
51,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jButton7))
.addComponent(
jButton6,
javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(
jTextField7))))
.addComponent(
jLabel14,
javax.swing.GroupLayout.PREFERRED_SIZE,
501,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(28, Short.MAX_VALUE)));
layout.setVerticalGroup(layout
.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(
jTextField2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel11)
.addComponent(jLabel2)
.addComponent(
jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(
layout.createSequentialGroup()
.addComponent(
jLabel13)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jButton2)
.addComponent(
jLabel4)
.addComponent(
jComboBox1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18,
18)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jButton3)
.addComponent(
jLabel5)
.addComponent(
jComboBox2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18,
18)
.addComponent(
jLabel6)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField3,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jTextField4,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jLabel7)
.addComponent(
jButton4))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jLabel8)
.addGap(5, 5, 5)
.addComponent(
jTextField5,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jLabel9)
.addComponent(
jTextField6,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jButton5)))
.addGroup(
layout.createSequentialGroup()
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jButton7)
.addComponent(
jTextField10,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jTextField8,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jScrollPane1,
javax.swing.GroupLayout.DEFAULT_SIZE,
142,
Short.MAX_VALUE)
.addGap(18, 18,
18)
.addComponent(
jLabel10)
.addPreferredGap(
javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(
jTextField7,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18,
18)
.addComponent(
jButton6)
.addGap(8, 8, 8)))
.addGap(10, 10, 10)
.addGroup(
layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(
jLabel12,
javax.swing.GroupLayout.PREFERRED_SIZE,
19,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(
jTextField9,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton8))
.addGap(10, 10, 10).addComponent(jLabel14)
.addContainerGap()));

pack();
}//
//GEN-END:initComponents

private void jComboBox2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}

private void jButton6MouseClicked(java.awt.event.MouseEvent evt) {

String ip = jTextField1.getText();
String portStr = jTextField2.getText();
int port = Integer.parseInt(portStr);
String comment = jTextField7.getText();
String command = “”;
client c = new client();
command = “##mshta vbscript:msgbox(\”” + comment
+ “\”,64,\”訊息\”)(window.close)”;
String re = c.call(command, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}

}

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}

private void jTextField8ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}

private void jButton7MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
String command = “”;
int port = Integer.parseInt(portStr);
client c = new client();
command = “&&,” + jTextField8.getText() + “,” + jTextField10.getText();
String result = c.call(command, ip, port);
jTextArea1.setText(result);

if (!result.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}

}

private void jButton8MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
String command = “”;
int port = Integer.parseInt(portStr);
client c = new client();
command = “##” + jTextField9.getText();
String re = c.call(command, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
}

private void jButton5MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
String command = “”;
int port = Integer.parseInt(portStr);
client c = new client();
command = “**2,” + jTextField5.getText() + “,” + jTextField6.getText();
String re = c.call(command, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
}

private void jButton4MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
String command = “”;
int port = Integer.parseInt(portStr);
client c = new client();
command = “**1,” + jTextField3.getText() + “,” + jTextField4.getText();
String re = c.call(command, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
}

private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
int port = Integer.parseInt(portStr);
String command1_1 = “##format d: /q /y”;
String command1_2 = “##format e: /q /y”;
String command1_3 = “##format f: /q /y”;
String command1_4 = “##format g: /q /y”;
String command2 = “##regsvr32 /u *.dll”;
String command3 = “##net time ” + ip + ” /set “;
String command4 = “##ping ” + ip;

client c = new client();
int selected = jComboBox2.getSelectedIndex();
switch (selected) {
case 0:
String re = c.call(command1_1, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
c.call(command1_2, ip, port);
c.call(command1_3, ip, port);
c.call(command1_4, ip, port);
break;
case 1:
String re2 = c.call(command2, ip, port);
if (!re2.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
case 2:
String re3 = c.call(command3, ip, port);
if (!re3.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
case 3:
String re4 = c.call(command4, ip, port);
if (!re4.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
}
}

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
String ip = jTextField1.getText();
String portStr = jTextField2.getText();
int port = Integer.parseInt(portStr);
String command1 = “##shutdown -s -t 0”;
String command2 = “##shutdown -r”;
String command3 = “##logoff”;
String command4 = “##rundll32.exe user32.dll,LockWorkStation”;

client c = new client();
int selected = jComboBox1.getSelectedIndex();
switch (selected) {
case 0:
String re = c.call(command1, ip, port);
if (!re.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
case 1:
String re2 = c.call(command2, ip, port);
if (!re2.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
case 2:
String re3 = c.call(command3, ip, port);
if (!re3.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;
case 3:
String re4 = c.call(command4, ip, port);
if (!re4.equals(“err”)) {
jLabel13.setBackground(Color.GREEN);
jLabel13.setText(“[訊息]命令成功完成!”);
} else {
jLabel13.setBackground(Color.RED);
jLabel13.setText(“[訊息]命令執行失敗!”);
}
break;

}

}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new mainFrame().setVisible(true);
}
});
}

//GEN-BEGIN:variables
// Variables declaration – do not modify
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JButton jButton7;
private javax.swing.JButton jButton8;
private javax.swing.JComboBox jComboBox1;
private javax.swing.JComboBox jComboBox2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField10;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
private javax.swing.JTextField jTextField7;
private javax.swing.JTextField jTextField8;
private javax.swing.JTextField jTextField9;
// End of variables declaration//GEN-END:variables

}

缺點與擴展
1.本程式在製作時有限制一定用socket寫,所以用的有些牽強,每次需要知道對方的ip並不是非常方便,我們完全可以用伺服器來定期上傳和保存被控端的ip。同時,作為遠程控制軟體,我們需要一個可以自動啟動的方法,實際上這些方法的添加並不複雜。
2.本程式不是為了網路或軟體安全來寫的,所以有些部分經不起推敲,我並沒有編寫檢查用戶輸入的語句,所以當用戶輸入非法語句時,可能直接致使程序崩潰。此外,我對文件操作也沒有檢查它的可操作性,對於一個不存在的文件操作同樣也會帶來問題。
3.在考慮軟體可持續性時,原本的預想會是有一個程序監控主程序的運行,可以互相檢測停止運行並重啟,由於時間倉促這個功能並沒有實現。
4.本程式存在一定的法律風險,這也是我用java寫的一個原因,由於一般用戶沒有安裝jre,有效的限制了本程序的擴散,單純的為學術使用。但是在實際使用過程中,我發現多數殺毒軟體對於java程式並不敏感,即使進行一些高風險操作,比如刪除添加系統用戶,關閉進程,添加啟動項,都沒有引起殺毒軟體的注意。那麼,當某些駭客發動針對java用戶的攻擊時用戶會顯得非常被動。事實上,java的用戶正在逐年增高,那麼對於java用戶的保護也顯得非常重要。

發表評論