阳光下的少年 发表于 2019-6-1 16:42

Java 系统级隐藏文件恢复

本帖最后由 阳光下的少年 于 2019-6-1 17:04 编辑

# Java 系统级隐藏文件恢复
## 前言
最近在学校机房上课, 然后每次回宿舍用U盘的时候就发现全部都变成**.EXE**文件了, 然后我就把杀毒软件拿出来扫描完修复才行.</br>
这周四在机房上课, 同学把我的U盘拿去拷贝文件给我的时候又是这情况而且机房的电脑非常卡, 带不起杀毒软件, 然后自己研究了一下搞清了恶意程序的行为.</br>

恶意程序行为: 对插入U盘的第一层文件目录设置为系统级文件隐藏保护, 而且还会释放出可执行程序的快捷方式. 而且还会把默认的可执行程序的图标更改为文件夹的默认图标.</br>
然后百度了一下发现设置系统级文件隐藏的指令是 `attrib` 然后执行了一下去掉隐藏属性的指令文件就回来了.</br>

然后今天用Java语言实现的时候有个类调用的时候总是出问题, 要么是**访问的文件被占用** 或者就是 **无反应** 程序不报错也不抛异常.</br>
最后查出问题所在是: 用IDEA调试文件时就会出现这个问题, 比如你用编译器调试生成的文件, 然后在你的代码也无权访问, 必须退出IDEA在执行就没问题了.</br>

在我退掉IDEA之前发现 `Runtime.getRuntime().exec();` 这段代码总是出问题, 总是抛异常文件被占用, 但是我用鼠标打开却没问题, 然后封装了指令改成调用bat文件, 还是抛异常, 然后又想着是不是执行执行exe文件, 然后就用易语言掉bat文件, 然后让Java掉易语言, 但还是不行, 最后想到可能是IDEA占用的问题, 最后退掉IDEA, 打包Jar文件终端下执行没问题.</br>

***

## 源码
```java
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Main{

    public Main(){

    }

    public static void main(String args[]){

      // 界面
      for (int i = 0; i < 30; i++)
            System.out.print("■");
      System.out.println("\n文件类型: 类似杀毒软件的文件恢复工具\n陕西国际商贸学院4号教学楼305教室专用文件恢复工具\n前言:\n有人在计算机装还原系统之前装了恶意程序.\n此恶意程序行为: 对插入的U盘文件夹第一层目录执行系统级隐藏文件保护, 并通过创建可执行文件的快捷方式更改默认可执行程序的图标为文件夹的图标.\n食用方法:\n如果你发现你的U盘文件和文件夹都变成了.exe, 那么请你手动删除这些文件, 此程序必须在你的电脑上执行, 因为如果你在被感染的电脑上运行那是不可以的.\n选择程序界面类型:\n1. 字符界面( 省电费, 运行快 )\n2. 窗口界面( 美观 ) <-- 暂未开放");
      for (int i = 0; i < 30; i++)
            System.out.print("■");
      System.out.println();

      // 读取目录列表
      System.out.println("请输入U盘根目录:");
      Scanner input = new Scanner(System.in);
      String fileList = input.next();             // 获取文件路径
      File file = new File(fileList);
      String[] fileNameList = file.list();      // 输出文件列表

      // 获取文件夹列表
      System.out.println("读取文件列表:");
      for (int i = 0; i< 30;i++)
            System.out.print("▃");
      System.out.println();

      // 创建bat文件
      File creatFile = new File(fileList + "\\cmdStr.bat");

      // 如果文件存在
      if (creatFile.length() > 0){
            try{

                // 清空文件内容
                FileWriter fileWriter = new FileWriter(creatFile);
                fileWriter.write("");
                fileWriter.flush();
                fileWriter.close();
            }
            catch (IOException e1){
                e1.printStackTrace();
            }

      }

      for (int i=0; i<fileNameList.length;i++){

            // 调试文件不保存
            if (fileNameList == "cmdStr.bat" || fileNameList == "JavaCallBatFile.exe")
                fileNameList = null;

            System.out.println(fileNameList);
            try{

                // 写入指令
                FileWriter cmdWriter = new FileWriter(creatFile, true);   // 允许追加内容
                BufferedWriter bufferedWriter = new BufferedWriter(cmdWriter);
                bufferedWriter.append("attrib "+file.getAbsolutePath()+"\\"+fileNameList+" -S" + " -H");
                bufferedWriter.newLine();         // 换行
                bufferedWriter.flush();
            }
            catch (IOException e1){
                e1.printStackTrace();
            }
      }
      for (int i = 0; i< 30;i++)
            System.out.print("▃");
      System.out.println();

      String exeFilePath = "";
      try{

            // 复制Exe程序
            File exeFile = new File("JavaCallBatFile.exe");
            FileInputStream fileCopy = new FileInputStream(exeFile);

            // 粘贴文件到bat目录下
            FileOutputStream filePaste = new FileOutputStream(fileList + "\\" +exeFile);
            exeFilePath = fileList + "\\" + exeFile;

            // 复制文件数据
            int n = 0;
            while((n = fileCopy.read()) != -1){
                filePaste.write(n);
            }

            //关闭文件流
            filePaste.flush();
            fileCopy.close();
            filePaste.close();
      }
      catch (FileNotFoundException e){
            e.printStackTrace();
      }
      catch (IOException e1){
            e1.printStackTrace();
      }

      // 等待3秒
      System.out.println("等待3秒");
      try{
            Thread.sleep(3000);
      }
      catch (InterruptedException e){
            e.printStackTrace();
      }

      // 调用外部程序
      try{
            Runtime.getRuntime().exec(exeFilePath);
      }
      catch (IOException e1){
            e1.printStackTrace();
      }
      System.out.println("执行完成");
    }
}
```

* 文件后半部分有冗余代码, 是因为之前在不停的调试 `Runtime.getRuntime().exec();` 这段代码所写的, 总体来说目的是达到了.

[源码下载: GitHub](https://github.com/TianruiShi/str/tree/master/Code/Java/FileRecovery)

* 外调的易语言程序的代码只有一行 `执行()`这个语句, 没有任何不安全的问题.

pepete 发表于 2019-6-1 18:13

学习, 谢谢楼主分享

Victory.ms 发表于 2019-6-1 18:22

JavaSE 不太合适开发这个,易语言可以一气呵成

阳光下的少年 发表于 2019-6-1 22:34

Victory.ms 发表于 2019-6-1 18:22
JavaSE 不太合适开发这个,易语言可以一气呵成

Emmmm, Java作为我的主要开发语言, 以后找工作也要搞这方面的, 就是想用Java实现一遍

a364397341 发表于 2019-6-2 23:43

作为小白的我 只是觉得两个字牛逼”,虽然没看懂什么但是了解了病毒的存在形式也是一种学习 感谢楼主分享
页: [1]
查看完整版本: Java 系统级隐藏文件恢复