自从发表了《寻找被微信撤回的图片》这篇文章,我骗了不少粉。
总之,之前提出了一个查找微信撤回图片的方法。
2 真相之前说工程师并不是真的删除撤回的图片,而是加密隐藏。其实这并不严谨。后续测试后发现,在PC端确实如此,而手机(安卓)撤回的图片已经被删除,但删除不干净。

微信收到的所有图片都存储在[x]:users[用户]documents we chat files[微信_用户]数据中。有一堆带后缀的文件。在里面。都是不同大小的加密。加密方法是逐个字节异或。
以前,加密字节=原始字节0x51。为方便起见,我们称0x51为“魔码”。
据网友反馈,魔码不一定是0x51,但有的机器是0x50。经过一番测试,结论是魔码和微信号有关,即不同的微信号在同一台机器上可能得到不同的魔码,而同一微信号在不同的机器上得到相同的魔码。这里猜测一下,魔码是通过微信号或者微信ID计算出来的。
其实我们不需要关心魔码的计算方法。因为,我们可以确定。dat文件是图片,对于JPEG图片,对应二进制的第一个字节是0xFF。
因此,问题变成已知:。dat文件对应binary = 0xff魔码的第一个字节,找到魔码。
我们已经知道,如果C = A B,那么A C = (A A) B,而A A = 0,那么A C = B,也就是B = A C。
幻码= 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)def _decode_pc_dat(self,datfile): with open(datfile,& # 39;rb & # 39)as f: buf = bytearray(f . read()) magic = 0x ff ^列表(buf)[0]if buf else 0x 00 # important img file = re . sub(r & # 39;。dat $ & # 39, '。jpg & # 39,datfile) with open(imgfile,& # 39;wb & # 39)as f: new buf = bytearray(map(lambda b:b magic,list(buf)) f . write(str(new buf))2.2手机(Android)
如前所述,/SD card/Tencent/micromsg/disk cache存储了一个类似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'xffxd8xffxe0x00x10x4ax46', 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格式的视频的话,这些缩略图的品质还是可以接受的。至少能知道对方发的是什么。def _decode_android_dat(self,datfile): with open(datfile,& # 39;rb & # 39)as f: buf = f . read() last _ index = 0 for I,m in enumerate(re . finditer(b & # 39;xff xd 8 xff xe 0x 00 x 10 x 4 ax 46 & # 39;,buf)): if m . start()= = 0: continue img file = & # 39;% s _ % d.jpg & # 39% (datfile,i) with open(imgfile,& # 39;wb & # 39)如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之前提到的一个最大的bug是,对于PC端的图片加密,工程师选择了一个幻数0x51与每个字节进行异或。另外,我自己解释了一下,0x51是“Q”的ASCII码。为什么选“q”?因为“QQ”。
我不忍直视,如上所述,魔码不固定。最后,给出了一个对修改后的微信图片进行解密和对撤回的图片进行检索的工具:http://www.sdxlp.cn/tool/wechatdat.








