Java批量解析dat⽂件,图⽚破解Java批量解析dat⽂件,图⽚破解
前⾔
关于异或值怎么计算
⾸先使⽤⼗六进制器打开dat⽂件,显⽰如下
jpg图⽚⽂件头⼀般为FF D8 开头的,所以此处使⽤科学计算器,计算异或值
计算后的值
所以此处异或值就是0x9D
代码
以下是java代码,创建⼀个weChatImgRevert .java后复制进去就好啦。
此处的jdk版本需要1.8以上…,另外三个参数需要改成⾃⼰的哦~
package ample.demo;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import urrent.atomic.AtomicReference;
public class weChatImgRevert {
public static void main(String[] args){
String path ="C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage\\Image\\2019-07";
String targetPath ="D:\\weChat\\2019-07\\";
int xor =0xCB;
convert(path, targetPath, xor);
}
/**
* @param path 图⽚地址
* @param targetPath 转换后⽬录
*/
private static void convert(String path, String targetPath,int xor){
File[] file =new File(path).listFiles();
if(file == null){
return;
}
int size = file.length;
System.out.println("总共"+ size +"个⽂件");
AtomicReference<Integer> integer =new AtomicReference<>(0);
Arrays.stream(file).parallel().forEach(file1 ->{
try(InputStream reader =new FileInputStream(file1);
OutputStream writer =
new FileOutputStream(targetPath + Name().split("\\.")[0]+".jpg")){
byte[] bytes =new byte[1024*10];
int b;
while((b = ad(bytes))!=-1){//这⾥的in.read(bytes);就是把输⼊流中的东西,写⼊到内存中(bytes)。
for(int i =0; i < bytes.length; i++){
bytes[i]=(byte)(int)(bytes[i]^ xor);
if(i ==(b -1)){
if(i ==(b -1)){
break;
}
}
writer.write(bytes,0, b);
writer.flush();
}
integer.()+1);
System.out.Name()+"(⼤⼩:"+((double) file1.length()/1000)+"kb),进度:"+ ()+ "/"+ size);
}catch(Exception e){
e.printStackTrace();
}
});
System.out.println("解析完毕!");
}
/**
* 获取异或值,不⼀定准确,当解析不出来的时候,换⼀张图⽚的异或值来解析
*
* @param PhotoPath
* @return
*/
private static int getXor(String PhotoPath){
File file =new File(PhotoPath);
try(InputStream reader =new FileInputStream(file)){
int[] xors =new int[4];
xors[0]= ad()&0xFF^0xFF;
xors[1]= ad()&0xFF^0xD8;
reader.skip(file.length()-1);
xors[2]= ad()&0xFF^0xFF;
xors[3]= ad()&0xFF^0xD9;
Map<Integer, Integer> map =new HashMap<>();
for(int xor : xors){
ainsKey(xor)){
map.put(xor, (xor)+1);
}else{
map.put(xor,1);
}
}
return map.values().stream().max(Integer::compareTo).get();
}catch(Exception e){
e.printStackTrace();
}
return0;
}
}
执⾏main⽅法后就可以在⽬标⽂件夹中去看转换后的图⽚了
以下是转换后的效果图⽚:
第⼆种⽅式,适合不懂怎么计算,想直接⽤的代码
以下是java代码,创建⼀个WxChatImgRevert.java后复制进去就好啦。
此处的jdk版本需要1.8以上…,另外两个参数需要改成⾃⼰的哦~
此处的原理是判断图⽚⽂件的⼗六进制特征码。
package ample.demo;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import urrent.atomic.AtomicInteger;
import urrent.atomic.AtomicReference;
public class WxChatImgRevert2 {
public static void main(String[] args){
String path ="C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage";
String targetPath ="D:\\weChat\\temp";
convert(path, targetPath);
}
/**
* @param path 图⽚⽬录地址
* @param targetPath 转换后⽬录
*/
private static void convert(String path, String targetPath){
File[] file =new File(path).listFiles();
if(file == null){
return;
}
int size = file.length;
System.out.println("总共"+ size +"个⽂件");
AtomicReference<Integer> integer =new AtomicReference<>(0);
AtomicInteger x =new AtomicInteger();
for(File file1 : file){
if(file1.isFile()){
Object[] xori =getXor(file1);
if(xori != null && xori[1]!= null){
x.set((int)xori[1]);
}
break;
}
}
Arrays.stream(file).parallel().forEach(file1 ->{
if(file1.isDirectory()){
String[] newTargetPath = Path().split("/|\\\\");
File targetFile =new File(targetPath+File.separator+newTargetPath[newTargetPath.length -1]);
if(!ists()){
targetFile.mkdirs();
}
Path(),targetPath+File.separator+newTargetPath[newTargetPath.length -1]);
return;
}
Object[] xor =getXor(file1);
()==0&& xor[1]!= null &&(int) xor[1]!=0){
x.set((int) xor[1]);
}
xor[1]= xor[1]== null ? x.get(): xor[1];
try(InputStream reader =new FileInputStream(file1);
OutputStream writer =
new FileOutputStream(targetPath + File.separator + Name().split("\\.")[0]+(xor[0]!= null ?
"."+ xor[0]:""))){
byte[] bytes =new byte[1024*10];
int b;
while((b = ad(bytes))!=-1){//这⾥的in.read(bytes);就是把输⼊流中的东西,写⼊到内存中(bytes)。
for(int i =0; i < bytes.length; i++){
for(int i =0; i < bytes.length; i++){
bytes[i]=(byte)(int)(bytes[i]^(int) xor[1]);
if(i ==(b -1)){
break;
}
}
writer.write(bytes,0, b);
writer.flush();
}
integer.()+1);
System.out.Name()+"(⼤⼩:"+((double) file1.length()/1000)+"kb,异或值:"+ xor[1]+"),"+ "进度:"+ ()+
"/"+ size);
}catch(Exception e){
e.printStackTrace();
}
});
System.out.println("解析完毕!");
}
/**
* 判断图⽚异或值
*
* @param file
* @return
*/
private static Object[]getXor(File file){
Object[] xor = null;
if(file != null){
byte[] bytes =new byte[4];
try(InputStream reader =new FileInputStream(file)){
}catch(Exception e){
e.printStackTrace();
}
xor =getXor(bytes);
}
return xor;
}
/**
* @param bytes
* @return
*/
private static Object[]getXor(byte[] bytes){
Object[] xorType =new Object[2];
int[] xors =new int[3];
for(Map.Entry<String, String> type : FILE_Set()){
String[] hex ={
String.Key().charAt(0))+ Key().charAt(1),
String.Key().charAt(2))+ Key().charAt(3),
String.Key().charAt(4))+ Key().charAt(5)
};
xors[0]= bytes[0]&0xFF^ Integer.parseInt(hex[0],16);
xors[1]= bytes[1]&0xFF^ Integer.parseInt(hex[1],16);
xors[2]= bytes[2]&0xFF^ Integer.parseInt(hex[2],16);
if(xors[0]== xors[1]&& xors[1]== xors[2]){
xorType[0]= Value();
xorType[1]= xors[0];
break;
}
}
return xorType;
代码转换
}
private final static Map<String, String> FILE_TYPE_MAP =new HashMap<String, String>();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论