go实现文档中保存的微信图片.dat格式解密为图片
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语言实现主要步骤:
- 定义图片类型结构体 及初始化
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)
- 计算密码
/*** 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")
}
- 遍历文件夹路径下所有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"})}}}}
- 异或字符重写文件
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)
}
- 主要流程
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格式解密为图片相关推荐
- 文档中根元素后面的标记格式必须正确。
文档中根元素后面的标记格式必须正确. php或其它语言动态输出的xml,最开始<标记 前面有空格,最后面>标记 后面有 空格 导致xml解析出错 解决办法: var data:String ...
- word文档中全选所有图片并修改格式
word文档中全选所有图片并修改格式 问题引入 日常生活中我们经常会写一些文档:学生写论文,工作了写项目文档,里面免不了会贴图片,图片少还没啥问题,要是图片多了上百张的样子,我们要想修改图片的格式,比 ...
- aip格式转化为pdf_python提取pdf文档中的表格数据、svg格式转换为pdf
提取pdf文件中的表格数据原文链接 https://www.analyticsvidhya.com/blog/2020/08/how-to-extract-tabular-data-from-pdf- ...
- python svg2rlg_python提取pdf文档中的表格数据、svg格式转换为pdf
提取pdf文件中的表格数据原文链接 https://www.analyticsvidhya.com/blog/2020/08/how-to-extract-tabular-data-from-pdf- ...
- 写论文时,Word文档修改保存后,文件越来越大的解决方法
写论文时,Word文档经过反复修改保存后,文件会越来越大,十分烦人,网上找了很多解决办法,按个尝试,现在总结分享出来,让大家少走弯路. 缩小word文件大小第一招: Word在保存DOC文件时只是把一 ...
- 去掉图题注 空格_在Word 2010文档中为图表插入形如“图一,图二”的题注时,删除标签与编号之间自动出现的空格的最优操作方法是( )_学小易找答案...
[判断题]矛盾有两个基本属性,一个是同一性另一个是特殊性. [单选题]小王利用Word撰写专业学术论文时,需要在论文结尾处罗列出所有参考文献或书目,最优的操作方法是( ). [单选题]"九层 ...
- 使用OpenXML更新Word文档中的表格
博文来自 pengqianhe CSDN账户 介绍 这篇文章包含了怎么样使用OpenXML 2.0去更新Word文档中的图表的方法. 背景 假设你有一个Word文档,并且你想要更新其中一个图表的一些值 ...
- 如何清除Word文档中的格式
If you've applied various formatting changes to the content in your document, and they either don't ...
- python读取word文档中的图片_【Python 3 获取Word所有图片】
上次讲到如何手动快速提取Word文档中的所有图片.这次我们用Python-3基于图片提取原理,写代码实现自动获取. Python 3实现代码import os,zipfile,shutil #引入os ...
- word涂改涂掉图片_修正Word文档中太多不一致的格式-word技巧-电脑技巧收藏家
修正Word文档中太多不一致的格式 您是否收到过一篇包含成打的字体和字号的MicrosoftWord2003文档,然后不得不将其修正一致?或者需要将他人处理的小文档合并为一个长文档?或者只是偶然在一个 ...
最新文章
- MySQL基础篇:数据操作语言DML
- 中石油大学计算机二在线作业答案,中国石油大学计算机应用基础第二阶段在线作业答案2018年.doc...
- 调整注释_解读!加工贸易禁止类目录调整
- 真相残酷:如何衡量自己是否适合做科研?
- C#之获取网页标题...
- 循环服务器,并发服务器模型以及I/O多路转接模型
- Retrofit请求数据对错误以及网络异常的处理
- net执行oracle的存储过程
- Flutter 基础系列篇
- 02 ARM存储控制器 SDRAM操作 实验
- JQ 按钮实现两种功能
- 成都单片机开发-STC15F2K60S2-LQFP44引脚含义以及1号引脚实物位置
- 使用毫秒单位来进行计算程序执行时间
- 回头再说--赶紧说两句
- mysql一张表100亿条数据_一个表有100亿条记录,如何优化
- 利用Selenium秒填朋友圈各种问卷星调查问卷
- px、pt、dpi、dip、分辨率、屏幕尺寸等等概念
- 笔试题-武汉珞珈德毅笔试题
- 简历类个人网站如何制作?
- pickle.load()和pickle.dump()