对方微信撤回的图片怎么恢复,关键词B?

1 回顾

自从发布“寻找微信撤回图片”这篇文章后,取得了不少读者的好评。

之前,我们提出了一种方法,可以找到微信撤回图片

2 真相

工程师最初并未彻底删除撤回的图片,而是将其加密并隐藏起来。但后续测试表明,PC端的情况确实如此,而手机端(Android)撤回的图片是被删除了,只是删除不够彻底。

2.1 PC端

所有接收到的微信图片都储存在[X]:\Users\[USER]\Documents\WeChat Files\[WECHAT_USER]\Data文件夹下。在该文件夹里会有一系列以.dat为后缀的文件,它们的大小各不相同,并且都经过了加密处理。而这些文件的加密方法是对每个字节逐一进行“异或”操作。

之前提到的是,加密后的字节等于原始字节与0x51进行异或操作。为了方便,我们将0x51称为“魔数”。

有人反馈称,magic码并非一定是0x51,有些设备的magic码为0x50。经过一些测试,结论是,magic码与微信号相关。不同的微信号在同一台设备上可能得到不同的magic码,而同一微信号在不同设备上得到相同的magic码。有猜测认为,magic码可能是由微信号或微信ID计算得出的。

其实,我们无需关心magic码的计算方式。因为,我们可以肯定的是,.dat文件是图片,而对于JPEG的图片,其对应二进制的第一个字节是0xFF。

因此,我们现在的问题是,已知.dat文件的第一个字节为0xFF异或魔术数,要求魔术数是多少。

根据已知条件,如果C=A^B,则A^C=(A^A)^B。由于A^A=0,所以A^C=B,即B=A^C。

magic码=0xFF ^ 已知.dat文件对应二进制的第一个字节。

这是一个通过异或运算获取文件的魔术数字的示例。

修改后的解密代码:

def _decode_pc_dat(self, datfile):
with open(datfile, 'rb') as f:
    buf=bytearray(f.read())

magic=0xff ^ list(buf)[0] if buf else 0x00 #important
imgfile=re.sub(r'.dat$', '.jpg', datfile)
with open(imgfile, 'wb') as f:
    newbuf=bytearray(map(lambda b: b ^ magic, list(buf)))
    f.write(str(newbuf))

2.2 手机端(Android)

在/sdcard/tencent/MicroMsg/diskcache目录下存放着类似cache.data.10这样的文件,大小大约在2MB左右。有趣的是,如果将文件的后缀改为.jpg,是可以打开这些文件的。这是因为JPEG文件实际上"串联"了一系列图片,通过以下代码就可以把这些图片拆分出来:

 def _decode_android_dat(self, datfile):
with open(datfile, 'rb') as f:
    buf=f.read()

last_index=0
for i, m in enumerate(re.finditer(b'\xff\xd8\xff\xe0\x00\x10\x4a\x46', buf)):
    if m.start()==0:
        continue

    imgfile='%s_%d.jpg' % (datfile, i)
    with open(imgfile, 'wb') as f:
        f.write(buf[last_index: m.start()])
    last_index=m.start()

经过实验发现,这些拆分出来的图片并不包含被撤回的图片。不幸的是,在手机端没有找到被撤回的图片。幸运的是,在微信的缓存文件夹中找到了被撤回图片的“缩略图”。尽管可能没有高清大图那么清晰,但至少可以辨认出对方发送的是什么内容,就像我们早年观看3GP格式视频一样。

路径为:/sdcard/tencent/MicroMsg/[USER_HASH]/image2/[HASH1]/[HASH2]/th_[HASH],比如这样:/sdcard/tencent/MicroMsg/202cb962ac59075b964b07152d234b70/image2/6b/3a/th_c4ca4238a0b923820dcc509a6f75849b。给文件名加上.jpg后缀就可以打开啦。

基于缓存文件夹中文件的数量庞大,建议可以根据文件的修改时间来查找HASH1和HASH2。

3 并不神奇的0x51

之前提到的一个主要问题是,工程师在对PC端图片进行加密时选择了一个特殊的数字0x51,然后对每个字节进行异或操作。此外,我还曾经辩解说0x51代表了“Q”的ASCII码。选择“Q”的原因是因为“QQ”。

抱歉,这个情况很棘手,因为magic码并不是固定的。不过还是可以使用以下工具解密微信图片以及找回已撤回的图片:http://www.sdxlp.cn/tool/wechatdat。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.dasum.com/254624.html