本帖最后由 梦新 于 2021-05-16 21:20 编辑
自己媳妇要整理微信图片文件夹里的文件,发现里面是.dat文件的,网上找了一下,发现这个东西是加密了滴,但是解密并不复杂。本来想偷懒用网上的工具,发现效率太低,一个文件夹里面都是上万的文件。然后就打算用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 //主任务结束标志 } }
UI版采用的是原生UI 我不大会美化 将就用吧 exe文件是用rar打包的自解压程序 里面的dll 是govcl的链接库。UI界面文件我就不放了 我也没整明白。 注:代码我都是在MAC下面编写和编译的,应该是不会出现啥兼容性问题,就是界面丑【用的跨平台库】,后来发现 mac的wechat竟然没有使用加密,可以直接看图片,真是有意思咧。突然看到有群友写了一个UI界面非常好看的工具,挺不错的,而且好像有人测试gif无法解密,我这个小工具估计也无法解密gif,因为解密方法我是从网上找的,我的测试文件里面也没有发现gif文件,如果以后找到方法了我再更新吧。
下方隐藏内容为本帖所有文件或源码下载链接:
游客你好,如果您要查看本帖隐藏链接需要登录才能查看,
请先登录
|