搞搞電腦微信表情的破解(.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;
    }

}
View Code

效果是這樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM