首页 » 原创 » 正文

[原创/技术]基于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用户的保护也显得非常重要。

发表评论