本帖最后由 红叶落尽 于 2021-5-16 08:46 编辑
自己媳妇要整理微信图片文件夹里的文件,发现里面是.dat文件的,网上找了一下,发现这个东西是加密了滴,但是解密并不复杂。本来想偷懒用网上的工具,发现效率太低,一个文件夹里面都是上万的文件。然后就打算用golang重新写一个,因为golang有协程,能大大加快处理速度。废话不多说,直接上代码。
[Golang] 纯文本查看 复制代码 package main
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"runtime"
"strings"
)
var fg string
var secKey byte
var decPath string
var dPath string
var workCount = 0 //工作中工人数
var maxWorker = 32 //最大工人数
var mainWorkerDone = false
var getFileWork = make(chan string) //分配工作
var workDone = make(chan bool) //是否结束工作
func main() {
//var rootpath string
fmt.Println("说明:文件夹路径最后请勿带斜杠,请确认保存路径为已存在空文件夹!")
fmt.Println("请输入待解密图片文件夹路径:")
dscanner := bufio.NewScanner(os.Stdin) //用此方法可以获取带空格路径
dscanner.Scan()
dPath = dscanner.Text()
fmt.Println("请输入待解密图片保存路径:")
secscanner := bufio.NewScanner(os.Stdin)
secscanner.Scan()
decPath = secscanner.Text()
systype := runtime.GOOS //获取操作系统类型
if systype == "windows" {
fg = "\\"
} else {
fg = "/"
}
secKey = getkey(dPath)
fmt.Println(secKey)
go getFileList()
waitForWorkers()
}
func getkey(p string) (key byte) { //获取解密key
dir_list, err := ioutil.ReadDir(p)
if err == nil {
for _, v := range dir_list { //循环查找文件,需要找到jpg加密特征码
if v.IsDir() == false { //判断是否是文件夹
fio, err := ioutil.ReadFile(p + fg + v.Name())
if fio[0] == fio[2] && err == nil {
key = fio[0] ^ '\xFF' //异或运算获取解密key
return key
}
}
}
}
return
}
func decodepic() { //解密图片
fname := <-getFileWork //向通道获取任务
fpath := dPath + fg + fname
ffio, err := ioutil.ReadFile(fpath)
if err == nil {
for i, val := range ffio {
ffio[i] = val ^ secKey
}
var hz string
if ffio[0] == '\xFF' && ffio[1] == '\xD8' { //jpg格式
hz = "jpg"
} else if ffio[0] == '\x89' && ffio[1] == '\x50' { //PNG格式
hz = "png"
} else if ffio[0] == '\x42' && ffio[1] == '\x4D' { //bmp格式
hz = "bmp"
} else if ffio[0] == '\x47' && ffio[1] == '\x49' { //gif格式
hz = "gif"
} else { //未知格式
hz = "dat"
}
fname := strings.TrimRight(fname, "dat") + hz //生成新的名称
decf := decPath + fg + fname
ioutil.WriteFile(decf, ffio, 0666)
//reFileName <- decf //向通道反馈解密的文件名
fmt.Println(decf)
workDone <- true //报告任务已经完成
}
}
func waitForWorkers() { //任务循环监听进程
for {
if workCount < maxWorker { //布置新工作
go decodepic()
workCount++ //加个工人
}
select {
case <-workDone:
workCount-- //工人减少
}
if mainWorkerDone == true && workCount == 0 { //所有工作完成,退出循环
return
}
}
}
func getFileList() { //任务发布者,根据获取的文件列表发送任务
flist, err := ioutil.ReadDir(dPath)
if err == nil {
for _, ff := range flist {
if ff.IsDir() == false && strings.Contains(ff.Name(), ".dat") == true {
//t := dPath+fg+ff.Name()
getFileWork <- ff.Name()
}
}
mainWorkerDone = true //主任务结束标志
}
}
最后附上编译好的exe,双击直接运行
UI版本来了(mac和win的)
链接:https://pan.baidu.com/s/1oNxzE3RM6npKLaNWrYrBFQ
提取码:1lj1
UI版采用的是原生UI 我不大会美化 将就用吧 exe文件是用rar打包的自解压程序 里面的dll 是govcl的链接库。UI界面文件我就不放了 我也没整明白。
注:代码我都是在MAC下面编写和编译的,应该是不会出现啥兼容性问题,就是界面丑【用的跨平台库】,后来发现 mac的wechat竟然没有使用加密,可以直接看图片,真是有意思咧。突然看到有群友写了一个UI界面非常好看的工具,挺不错的,而且好像有人测试gif无法解密,我这个小工具估计也无法解密gif,因为解密方法我是从网上找的,我的测试文件里面也没有发现gif文件,如果以后找到方法了我再更新吧。 |