顺利毕业 发表于 2019-3-3 23:58

还原被勒索软件加密的文件

昨天分享了一个简单锁屏型勒索软件的分析,主要是对解锁码与PIN码的获得方法,当然也包括了无码时使用adb的直接破解。

今天分享一个加密文件的勒索软件,由于该软件没有进行加壳、代码混淆,故要解密文件较为容易,以下就开始进行分享啦。

1、准备一个用于测试的文件,文件名为ShunLiBiYe.txt,(我本人,哈哈哈)。文件内容见下图啦。将该txt文件放到/sdcard目录下。


2、在模拟器上安装该应用,可看出该恶意应用对自己进行了伪装:


3、运行该应用,会出现一堆的俄罗斯文字,文字内容就不具体翻译了,大致意思就是勒索啦。最中间那块黑色的,其实是打开了手机的前置摄像头,但由于现在用的是模拟器,所以就只有一团黑啦。至于为什么打开摄像头,可能就是想在心理层面进一步攻击手机所有者的心理防线吧,瞎猜的,在这里不重要,嘿嘿。


4、此时回到模拟器的/sdcard目录下,发现txt文件出现了“enc”后缀,读取后出现了一堆乱码,说明文件确实被勒索软件加密了。


5、解密的方法,跟昨天分享的破解解锁码与PIN码的方法一样,大致就是把勒索软件的apk拉到JEB里,找到文件解密的相关代码,复制到Android Studio里,稍作修改。作为示范,下面就只贴出部分代码:


6、但是稍作修改是不够的。由于本人对于Android开发尚未入门,所以难免出一些状况,但既然是分享贴,那就都发出来给大家看看吧。

7、首先是第一次报错:


原因:对sd卡没有读写的权限,故listFiles()就无法返回/sdcard目录下的列表,所以在AndroidManifest.xml中增加相应需要的权限:


8、第二次报错:


原因:在将JEB中相关代码复制到Android Studio时,未复制下图中第一个红色框框中的代码,导致v11其实是个空的byte[](即上图中的b变量,此处b与v11是同一个,只是我在改bug时进行了下修改而已。),进而影响了key值。


9、将解密前后的文件对比进行展示:第一个图是在Android Studio的Logcat直接展示,第二个图是回到/sdcard目录下进行查看(/mnt/sdcard与/sdcard其实是指向同一个位置的)




10、在复制黏贴时有些小操作就不多说了,直接附上相关代码吧:

protected voidonCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
      getFileNames(new File(Environment.getExternalStorageDirectory().toString()));
      Iterator v3 = this.filesToDecrypt.iterator();
      while(v3.hasNext()) {
            Object v2 = v3.next();
            String encryptedFile=String.valueOf(v2);
            String originFile=encryptedFile.substring(0,encryptedFile.lastIndexOf("."));
            try {
                Log.i("encryptedFile",encryptedFile);
                Log.i("originFile",originFile);
                decrypt(encryptedFile, originFile);// A.txt.enc,A.txt
                fileContent("encryptedFile", encryptedFile);
                fileContent("decryptedFile", originFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
      }
    }
    public ArrayList filesToDecrypt=new ArrayList();
    public void fileContent(String fileType, String fileName) throws IOException {
      FileInputStream v3 = new FileInputStream(fileName);
      Log.i(fileType,fileName);
      InputStream inputStream = v3;
      BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
      StringBuffer buffer = new StringBuffer();
      String line = "";
      while ((line = in.readLine()) != null){
            buffer.append(line);
      }
      String encrypted= buffer.toString();
      Log.i(fileType,encrypted);
    }

    public void decrypt(String encryptedFile, String originFile) throws Exception {// A.txt.enc,A.txt
      MessageDigest v0 = MessageDigest.getInstance("SHA-256");
      v0.update("jndlasssf074sacxcsadasdadzczxcwr".getBytes("UTF-8"));
      byte[] v11 = new byte;
      System.arraycopy(v0.digest(), 0, v11, 0, v11.length);

      Cipher cipher=Cipher.getInstance("AES/CBC/PKCS7Padding");
      SecretKeySpec key = new SecretKeySpec(v11, "AES");

      AlgorithmParameterSpec spec = new IvParameterSpec(new byte);
      FileInputStream v3 = new FileInputStream(encryptedFile);
      FileOutputStream v4 = new FileOutputStream(originFile);
      cipher.init(2, key, spec);
      CipherInputStream v1 = new CipherInputStream(((InputStream)v3), cipher);
      byte[] v2 = new byte;
      int v00;
      while(true) {
             v00= v1.read(v2);
            if(v00 == -1) {
                break;
            }
            v4.write(v2, 0, v00);
      }
      v4.flush();
      v4.close();
      v1.close();
    }

    private void getFileNames(File arg8) { // arg8即:new File(Environment.getExternalStorageDirectory().toString())
//      List extensionsToDecrypt= Arrays.asList(new String[]{"enc"});
      File[] v2 = arg8.listFiles();
      int v1;
      for(v1 = 0; v1 < v2.length; ++v1) {
            File v4 = new File(arg8.getAbsolutePath(), v2.getName());
            if(!v4.isDirectory() || v4.listFiles() == null) {
                String v3 = v4.getAbsolutePath();
                String v0 = v3.substring(v3.lastIndexOf(".") + 1);
//                if(extensionsToDecrypt.contains(v0)) {
                if(v0.equals("enc")) {
                  filesToDecrypt.add(v4.getAbsolutePath());
                }
            }
            else {
                this.getFileNames(v4);
            }
      }
    }

记得加权限

11、至于该不该把这个勒索软件的apk直接分享出来,又或是分享md5之类的,emmmmmm, 隔壁贴大神出于安全的考虑是不分享的,那我就紧随大神了。

顺利毕业 发表于 2019-3-4 17:54

fxfnfxy 发表于 2019-3-4 17:37
我电脑也中了个勒索病毒,所有文件名后缀加CHAR都打不了。这个怎么办,论坛里哪们大神有空能破解下么……

不好意思,我目前只对Android的有些了解,其他的还未接触学习过。说不定你可以发个求助帖???

顺利毕业 发表于 2019-3-16 10:30

sunsocen 发表于 2019-3-15 01:07
这个真的厉害了,我服了,这样都能还原那就不用怕勒索病毒了

还是怕的,我分享的这个勒索软件比较简单,它不进行混淆加密之类的操作,否则还原起来就很麻烦了。

菠菜汤 发表于 2019-3-4 07:08

能否制作一个破解
工具

nizhenyoumo 发表于 2019-3-4 08:12

小白看不懂感谢分享收藏先

hxp.china.sh 发表于 2019-3-4 09:40

这个给人家解密收费比较吃香   :lol

顺利毕业 发表于 2019-3-4 09:46

菠菜汤 发表于 2019-3-4 07:08
能否制作一个破解
工具

针对这个勒索软件作一个破解工具应该是可以的,但可能不适用其他变种。

顺利毕业 发表于 2019-3-4 09:46

nizhenyoumo 发表于 2019-3-4 08:12
小白看不懂感谢分享收藏先

请问哪一块我写得不够清楚呢?我可以再进一步解释解释

顺利毕业 发表于 2019-3-4 09:52

hxp.china.sh 发表于 2019-3-4 09:40
这个给人家解密收费比较吃香

分享帖,收费什么的,暂时还没想法,哈哈哈哈

huqfox 发表于 2019-3-4 12:17

给楼主点赞,学习学习

fnre 发表于 2019-3-4 14:10

感谢分享

FENGMUTIAN 发表于 2019-3-4 14:49

感谢大佬的分享{:1_893:}
页: [1] 2 3 4
查看完整版本: 还原被勒索软件加密的文件