go实现文档中保存的微信图片.dat格式解密为可视图片(jpg,png)

问题:在微信文档中想要查找一些图片发现不能直接浏览都为.dat格式如图

现在通过go语言实现将dat文件转化为jpg和png格式方便直接浏览删除或者保存.结果:

原理:

图片被微信采用每个字节异或的方式加密,所以只要再异或同样的密码便得到了原来的字节编码
(异或运算的规则是0⊕0=0,0⊕1=1 ,1⊕0=1,1⊕1=0)
公式:A^密码=B
A^密码 ^密码=A
所以首先我们需要求密码是多少(每个人不相同),但是图片以16进制打开

png图片开头为0x89, 0x50
加密dat(原本为png) 16进制打开:

头两位为 0x32,0xeb
(1) 0x89^密码=0x32
(2) 0x89 ^ 0x89 ^密码 = 密码
结果:(1)替换(2)中的部分 可得 0x89^0x32=密码=0xbb

通过 第二位验证: 0x50 ^ 0xbb=0xeb 正确

所以该图片格式为png,我的密码为0xbb(每个人不一样)

得到密码后,只需要将dat文件读入内存,对每个字节进行异或操作再写入新文件即可.

go语言实现主要步骤:

  1. 定义图片类型结构体 及初始化
type Dic struct {name       string  //名称firstIndex uint8  //第一个字节lastIndex  uint8 //第二个字节
}var dicList = []Dic{Dic{".jpg", 0xff, 0xd8},Dic{".png", 0x89, 0x50},Dic{".gif", 0x47, 0x49},Dic{"error", 0x00, 0x00},}

文件结构体:

type FileInfo struct {filePath   string  //文件路径fileName   string  //文件名称 不包括后缀 .datfileSuffix string  // 文件后缀
}//初始化 文件切片
var fileInfoArr = make([]FileInfo, 5)
  1. 计算密码
/*** arr dat文件字节切片*  返回 密码addcode 类型dic ,错误*/
func getAddCode(arr []uint8) (addCode uint8, dic Dic, err error) {//遍历 diclist 看dat原本格式for _, dic := range dicList {//第一个字节和字典中固定编码异或得到密码addCode = arr[0] ^ dic.firstIndex//判断第二个字节和密码异或是否等于字典的字节 相同则密码正确,不相同则继续循环if arr[1]^addCode == dic.lastIndex {return addCode, dic, nil}}//遍历完成循环没有符合的return 0, dicList[3], errors.New("不是jpg,png,gif")
}
  1. 遍历文件夹路径下所有dat文件
 func getAllDatFileList(parentPath string) {parentFileInfo, err := ioutil.ReadDir(parentPath)if err != nil {log.Fatalln(err)}for _, fi := range parentFileInfo {if fi.IsDir() {getAllDatFileList(parentPath + "\\" + fi.Name())} else {if strings.Contains(fi.Name(), ".dat") {fileInfoArr = append(fileInfoArr, FileInfo{parentPath, strings.TrimRight(fi.Name(), ".dat"), ".dat"})}}}}
  1. 异或字符重写文件
func writeXORAddCodeIntoNewFile(arr []uint8, addCode uint8, info FileInfo, dic Dic) {//生成目标路径var pos= strings.LastIndex(info.filePath,"\\")var willReplace=info.filePath[pos:]targetPath := strings.ReplaceAll(info.filePath,willReplace,"\\target"+willReplace+"\\")err := os.MkdirAll(targetPath, os.ModePerm)//打开文件f, err := os.OpenFile(targetPath+info.fileName+dic.name, os.O_RDWR|os.O_CREATE, 0777)defer f.Close()if err != nil {log.Fatalln(err)}//对字节切片每个字节异或for i, v := range arr {arr[i] = v ^ addCode}//写入文件f.Write(arr)
}
  1. 主要流程
func main() {start := time.Now()getAllDatFileList(".\\")var wg sync.WaitGroupfor _, v := range fileInfoArr {wg.Add(1)go changeDat(v, &wg)}wg.Wait()end := time.Now()ms := (end.Sub(start).Milliseconds())s := (end.Sub(start).Seconds())fmt.Printf(" 文件数:%d 总共耗时 %d ms (%f s)   \n", len(fileInfoArr), ms, s)
}
func changeDat(info FileInfo, wg *sync.WaitGroup) {defer wg.Done()data, err := ioutil.ReadFile(info.filePath + "\\" + info.fileName + info.fileSuffix)if err != nil {fmt.Println(err)return}addCode, dic, err := getAddCode(data)if err != nil {fmt.Println(err)return}writeXORAddCodeIntoNewFile(data, addCode, info, dic)
}

全部代码:https://github.com/ygr000/wxwxDatTrans
生成的exe可以直接执行 https://github.com/ygr000/wxwxDatTrans/releases/tag/v1.0.0

或者 csdn下载

初学go,有问题欢迎指正

go实现文档中保存的微信图片.dat格式解密为图片相关推荐

  1. 文档中根元素后面的标记格式必须正确。

    文档中根元素后面的标记格式必须正确. php或其它语言动态输出的xml,最开始<标记 前面有空格,最后面>标记 后面有 空格 导致xml解析出错 解决办法: var data:String ...

  2. word文档中全选所有图片并修改格式

    word文档中全选所有图片并修改格式 问题引入 日常生活中我们经常会写一些文档:学生写论文,工作了写项目文档,里面免不了会贴图片,图片少还没啥问题,要是图片多了上百张的样子,我们要想修改图片的格式,比 ...

  3. aip格式转化为pdf_python提取pdf文档中的表格数据、svg格式转换为pdf

    提取pdf文件中的表格数据原文链接 https://www.analyticsvidhya.com/blog/2020/08/how-to-extract-tabular-data-from-pdf- ...

  4. python svg2rlg_python提取pdf文档中的表格数据、svg格式转换为pdf

    提取pdf文件中的表格数据原文链接 https://www.analyticsvidhya.com/blog/2020/08/how-to-extract-tabular-data-from-pdf- ...

  5. 写论文时,Word文档修改保存后,文件越来越大的解决方法

    写论文时,Word文档经过反复修改保存后,文件会越来越大,十分烦人,网上找了很多解决办法,按个尝试,现在总结分享出来,让大家少走弯路. 缩小word文件大小第一招: Word在保存DOC文件时只是把一 ...

  6. 去掉图题注 空格_在Word 2010文档中为图表插入形如“图一,图二”的题注时,删除标签与编号之间自动出现的空格的最优操作方法是( )_学小易找答案...

    [判断题]矛盾有两个基本属性,一个是同一性另一个是特殊性. [单选题]小王利用Word撰写专业学术论文时,需要在论文结尾处罗列出所有参考文献或书目,最优的操作方法是( ). [单选题]"九层 ...

  7. 使用OpenXML更新Word文档中的表格

    博文来自 pengqianhe CSDN账户 介绍 这篇文章包含了怎么样使用OpenXML 2.0去更新Word文档中的图表的方法. 背景 假设你有一个Word文档,并且你想要更新其中一个图表的一些值 ...

  8. 如何清除Word文档中的格式

    If you've applied various formatting changes to the content in your document, and they either don't ...

  9. python读取word文档中的图片_【Python 3 获取Word所有图片】

    上次讲到如何手动快速提取Word文档中的所有图片.这次我们用Python-3基于图片提取原理,写代码实现自动获取. Python 3实现代码import os,zipfile,shutil #引入os ...

  10. word涂改涂掉图片_修正Word文档中太多不一致的格式-word技巧-电脑技巧收藏家

    修正Word文档中太多不一致的格式 您是否收到过一篇包含成打的字体和字号的MicrosoftWord2003文档,然后不得不将其修正一致?或者需要将他人处理的小文档合并为一个长文档?或者只是偶然在一个 ...

最新文章

  1. MySQL基础篇:数据操作语言DML
  2. 中石油大学计算机二在线作业答案,中国石油大学计算机应用基础第二阶段在线作业答案2018年.doc...
  3. 调整注释_解读!加工贸易禁止类目录调整
  4. 真相残酷:如何衡量自己是否适合做科研?
  5. C#之获取网页标题...
  6. 循环服务器,并发服务器模型以及I/O多路转接模型
  7. Retrofit请求数据对错误以及网络异常的处理
  8. net执行oracle的存储过程
  9. Flutter 基础系列篇
  10. 02 ARM存储控制器   SDRAM操作 实验
  11. JQ 按钮实现两种功能
  12. 成都单片机开发-STC15F2K60S2-LQFP44引脚含义以及1号引脚实物位置
  13. 使用毫秒单位来进行计算程序执行时间
  14. 回头再说--赶紧说两句
  15. mysql一张表100亿条数据_一个表有100亿条记录,如何优化
  16. 利用Selenium秒填朋友圈各种问卷星调查问卷
  17. px、pt、dpi、dip、分辨率、屏幕尺寸等等概念
  18. 笔试题-武汉珞珈德毅笔试题
  19. 简历类个人网站如何制作?
  20. pickle.load()和pickle.dump()

热门文章

  1. Hadoop研发工程师_岗位职责和技能要求
  2. sloth(标点工具)使用说明
  3. Sloth组件之NetRisc.Configuration源代码发布
  4. 我的框架-Unity3d中的用户数据储存模块UserDB
  5. 《期货大作手风云录》读书笔记
  6. MySQL相关知识整理
  7. 小程序中点击二维码图片预览、长按转发、保存、识别图中二维码
  8. 计算机常用英语单词(带音标)
  9. 进程间通信方式有哪些?各自有哪些优缺点?
  10. 订单管理_01新增订单信息流程