搞搞电脑微信表情的破解(.dat转png or jpg)
首先感谢:https://blog.csdn.net/weixin_42440768/
因为狗子喜欢之前那个头像,但是没找到,于是我想看看我们之前的斗图过程中有没有发她的头像。
这是做这件事情的起因。
然后找到了我微信源文件的Image文件。发现源文件都是清一色.dat格式文件。
这时候第一步直接把后缀改了jpg :( 很失望,不行,无法打开文件。
然后去谷歌搜了一下,大牛们都说是微信用异或操作加密了Jpg.
于是朝这个方向入手。
首先下载notepad++,再给它配上Hex-Editor插件,这样我们就能用notepad++用16进制打开dat了
我的办法是:
第一步:就是从网上(https://sourceforge.net/projects/npp-plugins/files/Hex%20Editor/)下载Hex-Editor.dll文件。
第二步:然后拷贝到你自己notepad安装目录的plugins子文件夹下。
第三步:最后重启notepad。
然后在这里打开16进制显示,就好了。
这样我们就得到了16进制源文件。
我以下图为样例分析。
这是打开的DAT文件,前三位是4F 96 88。按照网上大牛说了 做过了异或操作 再存储的。那么我们来试着还原。
给出参考文件头:
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
好办了,直接逐个测试下。
我发现我这个dat 是 4F^C6 = 89,96^C6 = 50,88^C6=4E
对应得上PNG格式的文件。
然后就是java打开文件重新异或之后输入输出啦。
JAVA代码(对单个文件操作,折叠的是对整个文件夹操作)
这里有个彩蛋是:本来想用python操作文件的(方便),但是本人配置了近5小时sublime+python3,因为各种墙(GFW牛逼)的问题和各种插件需要慢慢安装体验感很差,遂投入java怀抱(真香)
package Main; import java.io.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test { public static void main(String[] args) { FileInputStream in = null; FileOutputStream out = null; try { String sourceFileUrl = "存放文件目录/xxxxxx.2.dat";//文件存放目录 String targetFileUrl = "F:/p1.png";//输出目录 in = new FileInputStream(sourceFileUrl); out = new FileOutputStream(targetFileUrl); int data = 0; while ((data=in.read())!=-1){ //将读取到的字节异或上一个数,加密输出 out.write(data^(0xc6));//0xc6可以改 } }catch (Exception e){ e.printStackTrace(); }finally { //在finally中关闭开启的流 if (in!=null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out!=null){ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
package Main; import java.io.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class P3342 { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(10); Runnable r = new Runnable() { @Override public void run() { // TODO Auto-generated method stub String[] fileName = GetFileName.getFileName("C:/Users/Administrator/Documents/WeChat Files/wxid/FileStorage/General/Data/EmotionIcon/"); int i = 0; for (String name : fileName) { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("C:/Users/Administrator/Documents/WeChat Files/wxid/FileStorage/General/Data/EmotionIcon/" + name); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { out = new FileOutputStream("F:/"+name+".png"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int data = 0; try { while ((data=in.read())!=-1){ //将读取到的字节异或上一个数,加密输出 out.write(data^(0xc6)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; pool.submit(r); pool.shutdown(); } } class GetFileName { public static String[] getFileName(String path) { File file = new File(path); String[] fileName = file.list(); return fileName; } }
效果是这样的。