首先感謝: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; } }

效果是這樣的。