[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 求精通PS和PY的大侠转换微信图片的格式

本帖最后由 5i365 于 2022-2-4 12:43 编辑

电脑版微信, 聊天过程中的图片在电脑上存为了dat格式, 在github上找了个python代码和C#代码, 可以成功解析还原为图片,

但是要装python, 感觉powershell实现起来应该更精简一些, 求大侠帮忙, 提前感谢

--------------------------------------------------------------------------------------------
微信dat文件转png、jpg图片

dat文件路径:C:\image\ 没有先创建好 将要转换的微信dat文件 放到此处。

图片输出路径:C:\image\jpg\

写死了相应的路径,可根据需要修改,或创建此目录

python代码:
  1. # weixin_Image.bat 破解
  2. # JPG 16进制 FF D8 FF
  3. # PNG 16进制 89 50 4e 47
  4. # GIF 16进制 47 49 46 38
  5. # 微信.bat 16进制 a1 86----->jpg  ab 8c----jpg     dd 04 --->png
  6. # 自动计算异或 值
  7. import os
  8. into_path = r'C:/image'  # 微信image文件路径
  9. out_path = r"C:/image/jpg"
  10. def main(into_path, out_path):
  11.     dat_list = Dat_files(into_path)  # 把路径文件夹下的dat文件以列表呈现
  12.     lens = len(dat_list)
  13.     if lens == 0:
  14.         print('没有dat文件')
  15.         exit()
  16.     num = 0
  17.     for dat_file in dat_list:  # 逐步读取文件
  18.         num += 1
  19.         temp_path = into_path + '/' + dat_file  # 拼接路径:微信图片路径+图片名
  20.         dat_file_name = dat_file[:-4]  # 截取字符串 去掉.dat
  21.         imageDecode(temp_path, dat_file_name, out_path)  # 转码函数
  22.         value = int((num / lens) * 100)             # 显示进度
  23.         print('正在处理--->{}%'.format(value))
  24. def Dat_files(file_dir):
  25.     """
  26.     :param file_dir: 寻找文件夹下的dat文件
  27.     :return: 返回文件夹下dat文件的列表
  28.     """
  29.     dat = []
  30.     for files in os.listdir(file_dir):
  31.         if os.path.splitext(files)[1] == '.dat':
  32.             dat.append(files)
  33.     return dat
  34. def imageDecode(temp_path, dat_file_name, out_path):
  35.     dat_read = open(temp_path, "rb")  # 读取.bat 文件
  36.     xo, j = Format(temp_path)  # 判断图片格式 并计算返回异或值 函数
  37.     if j == 1:
  38.         mat = '.png'
  39.     elif j == 2:
  40.         mat = '.gif'
  41.     else:
  42.         mat = '.jpg'
  43.     out = out_path + '/' + dat_file_name + mat  # 图片输出路径
  44.     png_write = open(out, "wb")  # 图片写入
  45.     dat_read.seek(0)  # 重置文件指针位置
  46.     for now in dat_read:  # 循环字节
  47.         for nowByte in now:
  48.             newByte = nowByte ^ xo  # 转码计算
  49.             png_write.write(bytes([newByte]))  # 转码后重新写入
  50.     dat_read.close()
  51.     png_write.close()
  52. def Format(f):
  53.     """
  54.     计算异或值
  55.     各图片头部信息
  56.     png:89 50 4e 47
  57.     gif: 47 49 46 38
  58.     jpeg:ff d8 ff
  59.     """
  60.     dat_r = open(f, "rb")
  61.     try:
  62.         a = [(0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff)]
  63.         for now in dat_r:
  64.             j = 0
  65.             for xor in a:
  66.                 j = j + 1  # 记录是第几个格式 1:png 2:gif 3:jpeg
  67.                 i = 0
  68.                 res = []
  69.                 now2 = now[:3]      # 取前三组判断
  70.                 for nowByte in now2:
  71.                     res.append(nowByte ^ xor[i])
  72.                     i += 1
  73.                 if res[0] == res[1] == res[2]:
  74.                     return res[0], j
  75.     except:
  76.         pass
  77.     finally:
  78.         dat_r.close()
  79. # 运行
  80. # 按间距中的绿色按钮以运行脚本。
  81. if __name__ == '__main__':
  82.     main(into_path, out_path)
复制代码
C#代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. namespace wx_dat2img
  8. {
  9.     class Decrypt
  10.     {
  11.         public static List<string> datDir = new List<string>();
  12.         public static bool deldat = false;
  13.         public Decrypt()
  14.         {
  15.         }
  16.         public string ext { get; set; }
  17.         public byte key { get; set; } //用于解密的数字
  18.         public string datfile { get; set; }//需要转换的文件
  19.         public string Convert()
  20.         {
  21.             FileInfo fileInfo = new FileInfo(datfile);
  22.             byte[] dat = File.ReadAllBytes(fileInfo.FullName);
  23.             getExt(dat[0], dat[1]);
  24.             for (int i = 0; i < dat.Length; i++)
  25.             {
  26.                 dat[i] ^= key;
  27.             }
  28.             string imgPath = Path.Combine(fileInfo.DirectoryName, "img", fileInfo.LastWriteTime.ToString("yyyyMMdd"));
  29.             if (!Directory.Exists(imgPath)) Directory.CreateDirectory(imgPath);
  30.             string imgFullPath = Path.Combine(imgPath, fileInfo.Name + ext);
  31.             if (!File.Exists(imgFullPath))
  32.                 File.WriteAllBytes(imgFullPath, dat);
  33.             if (deldat)
  34.             {
  35.                 Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(datfile, Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs, Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin);
  36.             }
  37.             return imgFullPath;
  38.         }
  39.         private void getExt(byte key1, byte key2)
  40.         {
  41.             byte jkey1 = (byte)(key1 ^ 0xff);
  42.             byte jkey2 = (byte)(key2 ^ 0xD8);
  43.             if (jkey1 == jkey2)
  44.             {
  45.                 key = jkey1;
  46.                 ext = ".jpg";
  47.             }
  48.             byte gkey1 = (byte)(key1 ^ 0x47);
  49.             byte gkey2 = (byte)(key2 ^ 0x49);
  50.             if (gkey1 == gkey2)
  51.             {
  52.                 key = gkey1;
  53.                 ext = ".gif";
  54.             }
  55.             byte pkey1 = (byte)(key1 ^ 0x89);
  56.             byte pkey2 = (byte)(key2 ^ 0x50);
  57.             if (pkey1 == pkey2)
  58.             {
  59.                 key = pkey1;
  60.                 ext = ".png";
  61.             }
  62.             byte bkey1 = (byte)(key1 ^ 0x42);
  63.             byte bkey2 = (byte)(key2 ^ 0x4d);
  64.             if (bkey1 == bkey2)
  65.             {
  66.                 key = bkey1;
  67.                 ext = ".bmp";
  68.             }
  69.         }
  70.     }
  71. }
复制代码

  1. $into_path = 'C:/image'  # 微信image文件路径
  2. $out_path = "C:/image/jpg"
  3. function imageDecode($temp_path, $dat_file_name, $out_path){
  4. $dat_read=gc $temp_path -enc byte # 读取.bat 文件
  5. $xo, $j = Format($temp_path) # 判断图片格式 并计算返回异或值 函数
  6. if($j -eq 1){$mat = '.png'}elseif($j -eq 2){$mat = '.gif'}elseif($j -eq 3){$mat = '.jpg'}
  7. $out = $out_path + '/' + dat_file_name + $mat  # 图片输出路径
  8. sc -enc byte $out $(foreach($now in $dat_read){$now -bxor $xo})# 图片写入
  9. }
  10. function Format($f){
  11. $a = @((0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff))
  12. $dat_r = gc $f -enc byte
  13. foreach($xor in $a){$j++;foreach($now in $xor){$res+=$now -bxor $dat_r[$i++]};if($res[0] -eq $res[1] -eq $res[2]){return $res[0], $j};rv i,res}
  14. }
  15. dir $into_path|%{
  16. $temp_path=$_.fullname # 拼接路径:微信图片路径+图片名
  17. $dat_file_name=$_.basename # 截取字符串 去掉.dat
  18. imageDecode($temp_path, $dat_file_name, $out_path) # 转码函数
  19. }
复制代码

TOP

回复 2# idwma


    感谢帮忙, 执行时一直报错,下面是示例文件
https://send.cm/d/8ac9

TOP

本帖最后由 idwma 于 2022-2-5 13:28 编辑

回复 3# 5i365

改了
    密码是多少
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $into_path = '.\image'  # 微信image文件路径
  3. $out_path = "."
  4. function imageDecode($temp_path, $dat_file_name, $out_path){
  5. $dat_read=gc -readcount 0 $temp_path -enc byte # 读取.bat 文件
  6. $xo, $j = Format($temp_path) # 判断图片格式 并计算返回异或值 函数
  7. if($j -eq 1){$mat = '.png'}elseif($j -eq 2){$mat = '.gif'}elseif($j -eq 3){$mat = '.jpg'}
  8. $out = $out_path + '/' + $dat_file_name + $mat  # 图片输出路径
  9. [io.file]::writeallbytes($out,([byte[]]$(foreach($now in $dat_read){$now -bxor $xo}))) # 图片写入
  10. }
  11. function Format($f){
  12. $a = @((0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff))
  13. $dat_r = gc -readcount 0 $f -enc byte
  14. foreach($xor in $a){$j++;foreach($now in $xor){$res+=@($now -bxor $dat_r[$i++])};if($res[0] -eq $res[1] -eq $res[2]){return $res[0], $j};rv i,res}
  15. }
  16. dir $into_path|%{
  17. $temp_path=$_.fullname # 拼接路径:微信图片路径+图片名
  18. $dat_file_name=$_.basename # 截取字符串 去掉.dat
  19. imageDecode $temp_path $dat_file_name $out_path # 转码函数
  20. }
复制代码
1

评分人数

    • 5i365: 太牛X了, 感谢帮忙技术 + 1

TOP

回复 4# idwma


    奇怪, 这网站经常自己加密码
https://send.cm/d/8aoa

TOP

回复 5# 5i365


    4楼改了

TOP

回复 6# idwma


    大侠技术太牛X了,

同时感觉Powershell也太强大了, 别的语言, 近百行代码, 用Ps, 也就二十行, 碉堡了

TOP

返回列表