Bugku 微信Dat文件隐写术:从原理到实战的CTF取证分析 1. 微信Dat文件的前世今生第一次在CTF比赛中遇到微信Dat文件题目时我盯着那个.keli.dat后缀发呆了十分钟。这玩意儿既不像图片也不像文档用WinHex打开全是乱码。后来才知道微信会把聊天图片用异或加密后存成这种特殊格式就像把可乐倒进雪碧瓶里——看起来是饮料喝起来却别有风味。微信的FileStorage目录就像个神秘的保险箱里面存放着所有聊天图片的加密副本。这些dat文件有个特点原始图片的每个字节都与特定密钥进行异或运算XOR。比如原始PNG文件头是89 50 4E 47加密后可能变成17 CE 9E 9E。这种加密方式简单却有效就像用同一把钥匙给所有文件上锁。异或运算在CTF中堪称万金油算法。它的神奇之处在于A XOR B C那么 C XOR B 又能变回 A。我常跟新手说这就像小时候玩的数字魔术——先加5再减5数字就回来了。微信用的正是这个原理只是把5换成了加密密钥。2. 破解Dat文件的三板斧2.1 手工爆破密钥我最推荐新手先尝试手工计算这能真正理解原理。以比赛常见的keli.dat为例用WinHex查看文件头两个字节是17 CE列出常见图片的文件头JPG:FF D8PNG:89 50BMP:42 4D用计算器程序员模式计算89 XOR 17 9E50 XOR CE 9E发现两次结果都是9E确认密钥是0x9E# 手工验证密钥的Python代码 key 0x9E original_byte 0x89 encrypted_byte original_byte ^ key # 得到0x17 decrypted_byte encrypted_byte ^ key # 变回0x892.2 使用现成工具当你在比赛中时间紧迫时GitHub上的 WeChatDatFileDecoder 能救命。我实测过它的使用步骤下载Release版本的zip包解压后进入bin/Debug目录运行WpfApp1.exe会出现GUI界面输入文件路径时注意路径中不能有中文点击转换后输出的PNG可能被微信自动缓存建议用Hex编辑器确认文件头注意部分比赛会魔改文件格式这时工具可能失效。我就遇到过文件头被故意破坏的情况最后还是得回归手工分析。2.3 Python脚本批量处理对于需要批量解密的情况这个脚本我用了三年都没翻车import os def decrypt_dat(dat_path, output_path, key0x9E): with open(dat_path, rb) as f: with open(output_path, wb) as out: for byte in f.read(): out.write(bytes([byte ^ key])) # 示例解密当前目录所有dat文件 for file in os.listdir(): if file.endswith(.dat): decrypt_dat(file, file.replace(.dat,.png))曾经有个比赛题目把密钥藏在文件第1024字节处我改进脚本实现了自动探测def auto_find_key(dat_path): with open(dat_path, rb) as f: header f.read(20) for common_header in [b\x89PNG, b\xFF\xD8, bBM]: possible_key header[0] ^ common_header[0] if all(header[i] ^ possible_key common_header[i] for i in range(len(common_header))): return possible_key return None # 未找到合适密钥3. 实战中的那些坑去年省赛就出了道变形题给的不是标准dat文件而是微信数据库的RAW字段。我花了两个小时才想到用dd命令提取dd ifencrypted.db bs1 skip1234 count2048 ofextracted.dat还有几个常见陷阱多层加密先用异或再用Base64需要先用CyberChef测试密钥变异每10个字节密钥1需要动态调整解密脚本文件拼接前半段是真实dat后半段藏了flag要用binwalk分离最坑的是有次比赛给的文件密钥是0x00相当于没加密。全队人都想复杂了最后新手同事直接改后缀名发现了flag...4. 进阶技巧从CTF到实战在真实取证中微信Dat文件往往藏在手机存储的/data/data/com.tencent.mm/MicroMsg/.../image2/路径下。我常用的取证组合拳先用ADB提取整个FileStorage目录用frida脚本hook微信的解密函数获取实时密钥对加密文件批量运行解密脚本使用exiftool检查解密后图片的元数据有个企业取证案例让我印象深刻嫌疑人把犯罪证据图片通过微信传输后删除了聊天记录。我们正是通过恢复dat文件最终在/data/data/com.tencent.mm/MicroMsg/32位哈希值/FileStorage/Image/2023-07路径下找到了关键证据。对于想深入研究的同学建议用010 Editor的模板功能解析微信DB文件。我自用的模板能自动识别MMDB结构比SQLite浏览器更高效。有时候一个EnMicroMsg.db文件里就藏着整个案件的钥匙。