首页 > 其他分享 >qq闪照恢复--go

qq闪照恢复--go

时间:2023-06-25 23:46:49浏览次数:24  
标签:qq return -- fmt key time byte 闪照 encData

闪照缓存目录:

文件管理/Android/data/com.tencent.mobileqq/xxx/Cache_xxxxxxxxx_fp

code

爆破DES 8字节密钥,每一位仅需考虑9种字符("02468@BDF"),9**8=43046721 种可能

// reference: https://keuin.cc/blog/cracking-encrypted-qq-flash-photos
//
//	https://github.com/keuin/mobileqq-flash-photo-cracker
package main

import (
	"bufio"
	"bytes"
	"crypto/cipher"
	"crypto/des"
	"crypto/md5"
	"flag"

	"fmt"
	"io"
	"os"
	"time"
)

const (
	keychars      string = "02468@BDF"
	KEYSPACE_SIZE int    = 43046721 //9**8

)

var (
	jpg_magic    = []byte{0xff, 0xd8, 0xff}
	// png_magic    = []byte{0x89, 0x50, 0x4e, 0x47}
	fp_magic     = []byte{0x45, 0x4E, 0x43, 0x52, 0x59, 0x50, 0x54, 0x3A} //ENCRYPT:
	bruteThreads int

	outPath   string
	fpPath    string
	isFindKey bool = false

	done chan int
)

func checkPad(block *cipher.Block, lastData []byte) (bool, []byte) {
	buf := make([]byte, 8)
	(*block).Decrypt(buf, lastData[:8])
	var pad_size = buf[7]
	if pad_size > 8 {
		return false, nil
	}
	for i := byte(8 - pad_size); i < pad_size; i++ {
		if buf[i] != pad_size {
			return false, nil
		}
	}
	return true, buf[:8-pad_size]
}
func testDec(key, encData []byte) bool {
	block, err := des.NewCipher(key)
	if err != nil {
		return false
	}
	headerData := make([]byte, 8)
	block.Decrypt(headerData, encData[:8])
	// if bytes.Equal(headerData[:4], png_magic) || bytes.Equal(headerData[:3], jpg_magic) {
	if  bytes.Equal(headerData[:3], jpg_magic) {
		fmt.Printf("[+]DES key:%s <---dec---> magic:%s\n", key, headerData)
		isPad, lastpart := checkPad(&block, encData[len(encData)-8:])
		if !isPad {
			fmt.Println("[!]DES key Incorrect!")
			return false
		}
		if isFindKey {
			return false
		}
		isFindKey = true
		// fmt.Printf("[*]DES key:%s\n", key)
		buf := make([]byte, len(encData)-16)
		bs := block.BlockSize()
		dst := buf
		data := encData[8 : len(encData)-8]
		for len(data) > 0 {
			block.Decrypt(dst, data[:bs])
			data = data[bs:]
			dst = dst[bs:]
		}
		x := append(headerData, buf...)
		x = append(x, lastpart...)
		writeData(outPath, x)
		fmt.Printf("[*]key:%s<--------->md5:%X\n", key, md5.Sum(x))
		fmt.Println("[*]save to:", outPath)
		return true
	}
	return false
}

func worker(a, b int, encData []byte) {
	var (
		isFind bool
		// k      []byte
	)
	start := time.Now()
	for i := a; i < b; i++ {
		if isFindKey {
			break
		}
		// isFind, k = testDec([]byte(Keys[i]))
		isFind = testDec(genKey(i), encData)
		if isFind {
			isFindKey = true
			fmt.Printf("[+]genKey(%v)\n", i)
			// fmt.Println("[-]find key:", hex.EncodeToString(k))
			break
		}
	}
	elapsed := time.Since(start)
	fmt.Printf("[-][%v-%v] time:%v\n", a, b, elapsed)
	done <- 1
}

// #define FILL_KEY(buf, key, i) \
//         do { ((buf)[7-(i)] = keychars[(key)%9u]); (key) /= 9u; } while(0)

func genKey(a int) []byte {
	var s [8]byte
	for i := 0; i < 8; i++ {
		s[7-i] = keychars[a%9]
		a /= 9
	}
	return s[:]
}
func writeData(fpath string, data []byte) {
	fi, err := os.Create(fpath)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer fi.Close()
	_, err = fi.Write(data)
	if err != nil {
		fmt.Println(err)
		return
	}
}
func readData(fpath string) []byte {
	fi, err := os.Open(fpath)
	if err != nil {
		fmt.Println(err)
		return nil
	}
	defer fi.Close()

	r := bufio.NewReader(fi)
	tmp := make([]byte, 8)
	n, err := r.Read(tmp)
	if err != nil && err != io.EOF && n != 8 {
		fmt.Println(err)
		return nil
	}
	if !bytes.Equal(tmp, fp_magic) {
		return nil
	}
	var chunks []byte
	buf := make([]byte, 4096)
	for {
		n, err := r.Read(buf)
		if err != nil && err != io.EOF {
			panic(err)
		}
		if n == 0 {
			break
		}
		chunks = append(chunks, buf[:n]...)
	}
	return chunks
}
func doRun() {
	done = make(chan int, bruteThreads)
	range_size := int(KEYSPACE_SIZE / bruteThreads)
	encData := readData(fpPath)
	if encData == nil {
		return
	}
	for i := 0; i < bruteThreads-1; i++ {
		go worker(range_size*i, range_size*i+range_size, encData)
	}
	go worker(range_size*(bruteThreads-1), KEYSPACE_SIZE, encData)
	//wait
	for i := 0; i < cap(done); i++ {
		<-done
	}
	fmt.Println("end")
}

func init() {
	flag.StringVar(&outPath, "out", "", "(op)-->out path")
	flag.StringVar(&fpPath, "in", "", "[must]-->in path")
	flag.IntVar(&bruteThreads, "threads", 10, "(op)-->brute threads(Goroutine)")
	flag.Parse()
	if fpPath == "" {
		flag.Usage()
		os.Exit(-1)
	}
	if outPath == "" {
		outPath = fpPath + "_dec.png"
	}
}
func main() {
	doRun()
}

log

main.exe -in pic.xb -out out.png -threads 40
[+]DES key:2B0F2880 <---dec---> magic:���� �Ex
[-][31208872-32285040] time:20.0654193s
[-][40894384-41970552] time:20.0654193s
[-][3228504-4304672] time:20.0947397s
[-][19371024-20447192] time:20.0684109s
[-][16142520-17218688] time:20.0684109s
[-][0-1076168] time:20.0947397s
[-][29056536-30132704] time:20.0670064s
[-][4304672-5380840] time:20.0953299s
[-][35513544-36589712] time:20.0670064s
[-][5380840-6457008] time:20.0947397s
[-][8609344-9685512] time:20.0953299s
[-][2152336-3228504] time:20.0953299s
[-][9685512-10761680] time:20.0947397s
[-][1076168-2152336] time:20.0953299s
[-][21523360-22599528] time:20.0680023s
[-][36589712-37665880] time:20.0670064s
[-][18294856-19371024] time:20.0690011s
[-][34437376-35513544] time:20.0680023s
[-][39818216-40894384] time:20.0670064s
[-][25828032-26904200] time:20.0883133s
[-][32285040-33361208] time:20.0654193s
[-][22599528-23675696] time:20.0685076s
[-][12914016-13990184] time:20.0726921s
[-][30132704-31208872] time:20.0675117s
[-][13990184-15066352] time:20.0715966s
[-][20447192-21523360] time:20.0695064s
[-][17218688-18294856] time:20.0695064s
[-][23675696-24751864] time:20.0685076s
[-][6457008-7533176] time:20.0958352s
[-][11837848-12914016] time:20.0715966s
[-][27980368-29056536] time:20.0685076s
[-][37665880-38742048] time:20.0685076s
[-][33361208-34437376] time:20.0685076s
[-][15066352-16142520] time:20.0695064s
[-][41970552-43046721] time:20.0953316s
[-][38742048-39818216] time:20.0664162s
[-][24751864-25828032] time:20.0685076s
[-][26904200-27980368] time:20.0685076s
[-][10761680-11837848] time:20.0958352s
[*]key:2B0F2880<--------->md5:2B1F2980A362CBD2A67251C2229BBEF5
[*]save to: out.png
[+]genKey(8025192)
[-][7533176-8609344] time:20.1167501s
end

标签:qq,return,--,fmt,key,time,byte,闪照,encData
From: https://www.cnblogs.com/DirWang/p/17504262.html

相关文章

  • Windows Server操作系统中的DHCP Server Service是一种集成在操作系统中的功能,用于提
    WindowsServer操作系统中的DHCPServerService是一种集成在操作系统中的功能,用于提供DHCP服务器服务。它可以在WindowsServer上设置和管理DHCP服务器,实现自动分配IP地址和其他网络配置信息给连接到网络的设备。DHCPServerService在WindowsServer中提供以下功能和特性:IP地......
  • 使用 Debian、Docker 和 Nginx 部署 Web 应用
    前言本文将介绍基于Debian的系统上使用Docker和Nginx进行Web应用部署的过程。着重介绍了Debian、Docker和Nginx的安装和配置。第1步:更新和升级Debian系统通过SSH连接到服务器。更新软件包列表:sudoaptupdate升级已安装的软件包:sudoaptupgrade第2步......
  • UTF-8 和 UTF-8MB4 有什么区别?
    当今的Web应用程序中,数据存储和处理是至关重要的。在数据库中存储文本数据时,选择正确的字符编码是非常重要的。在这篇博客中,我们将探讨UTF-8和UTF-8MB4字符编码之间的区别,以及如何选择适当的字符编码来存储和处理文本数据。UTF-8和UTF-8MB4有什么区别?UTF-8和UTF-8MB4......
  • 第二天
    #include<stdio.h>intmain(){ longlonga,b,i,j,i1,j1; scanf("%lld%lld%lld%lld",&a,&i,&b,&j); i1=0,j1=0; while(a){ if(a%10==i){ i1=i1*10+i; } a/=10; } while(b){ if(b%10==j){ j1=j1*10+j; } b/=10;......
  • Microsoft PostScript和PCL6 Class打印机驱动是Windows操作系统提供的标准打印机驱动
    MicrosoftPostScript和PCL6Class打印机驱动是Windows操作系统提供的标准打印机驱动程序,用于支持PostScript和PCL6语言的打印机设备。这些类打印机驱动程序是为了方便用户在Windows操作系统上使用广泛的打印机设备而开发的。它们可以与各种厂商的打印机兼容,并为用户提供基本的打......
  • 中考邮寄
    省流:估分120+145+130+74+65+40+40+50=664这么垃圾怎么办,银翔都考不起,怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办怎么办。反正考的垃圾所以随便写一写语文是不懂的不知道,啥也......
  • Git分支策略
    团队如何选择合适的Git分支策略? 合集-DevOps实践之路(6) 1.都说DevOps落地难,到底难在哪里?也许你还没找到套路05-132.DevOps落地实践点滴和踩坑记录-(2)-聊聊企业内部DevOps平台建设2022-08-163.DevOps落地实践点滴和踩坑记录-(1)-迷茫与焦虑2022-06-124.聊聊DevOps制......
  • Windows Common Log File System (CLFS) Driver,也称为CLFS.sys,是Windows操作系统中的
    WindowsCommonLogFileSystem(CLFS)Driver,也称为CLFS.sys,是Windows操作系统中的一个驱动程序。它提供了一个通用的日志文件系统框架,用于记录和管理系统、应用程序和服务的日志。CLFS.sys文件的路径通常位于Windows操作系统的系统目录中。具体的路径取决于安装Windows的......
  • spring boot graalvm native 试用
    核心是体验下新版本支持情况同时体验下企业特性(g1gc)参考示例就是基于springstart提供的web,添加了graalvmnative构建支持,graalvmoracle发行版直接可以官方下载pom.xml核心信息<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apach......
  • 官宣!2023云原生编程挑战赛正式启动
    随着越来越多的企业上云,企业的核心关注点转变为如何更好地利用云的能力,将产品快速推向市场,从而实现业务成功。但是,如果算力的呈现形式仍然是服务器这样的资源形态,它的使用门槛依然很高。让算力像电力一样的普及,云计算需要新的形态,就是Serverless。随着用好云成为关键,开发范式也......