昨天分享了一个简单锁屏型勒索软件的分析,主要是对解锁码与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、在复制黏贴时有些小操作就不多说了,直接附上相关代码吧:
[Java] 纯文本查看 复制代码 protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFileNames(new File(Environment.[i]getExternalStorageDirectory[/i]().toString()));
Iterator v3 = this.filesToDecrypt.iterator();
while(v3.hasNext()) {
Object v2 = v3.next();
String encryptedFile=String.[i]valueOf[/i](v2);
String originFile=encryptedFile.substring(0,encryptedFile.lastIndexOf("."));
try {
Log.[i]i[/i]("encryptedFile",encryptedFile);
Log.[i]i[/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]i[/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]i[/i](fileType,encrypted);
}
public void decrypt(String encryptedFile, String originFile) throws Exception { // A.txt.enc, A.txt
MessageDigest v0 = MessageDigest.[i]getInstance[/i]("SHA-256");
v0.update("jndlasssf074sacxcsadasdadzczxcwr".getBytes("UTF-8"));
byte[] v11 = new byte[32];
System.[i]arraycopy[/i](v0.digest(), 0, v11, 0, v11.length);
Cipher cipher=Cipher.[i]getInstance[/i]("AES/CBC/PKCS7Padding");
SecretKeySpec key = new SecretKeySpec(v11, "AES");
AlgorithmParameterSpec spec = new IvParameterSpec(new byte[16]);
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[8];
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[v1].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, 隔壁贴大神出于安全的考虑是不分享的,那我就紧随大神了。 |