软件 | 微信图片解密小工具
使用 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 //主任务结束标志
}
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。