搞搞电脑微信表情的破解(.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

效果是这样的。

posted on 2019-04-16 17:18  Esquecer  阅读(8110)  评论(1编辑  收藏  举报

导航