8.0.27 大库(1243 条)× 8.0.69 小库(26 条)
两份检材是两个极端:一份 119 GiB 真机、1243 条消息;一份 64 GiB 模拟器、只有 26 条消息却藏着一条完整证据链。同一套方法在两个极端上都成立——这才是最有说服力的地方。
| 逍遥安卓模拟器 | ||
| 8.0.27 | 8.0.69 | |
| -692417256 | 851368963 | |
| 1243 | 26 | |
$ ewfinfo 手机镜像.E01
如果确实要挂:ewfmount xxx.E01 /mnt/ewf 必须 -u root 且挂载点可写,否则报 user has no write access to mountpoint。
fsstat -o <offset> image.E01 # 找挂载点为 /data 的 ext4
| -692417256 | 851368963 | ||
检材 B 的 851368963 是正数——不要因为见过负数就习惯性加负号。
md5("A250f5016ec6f558" + "-692417256")[:7] # 5a96855 ✗
md5("1234567890ABCDEF" + "-692417256")[:7] # 2c45652 ✓
# 检材 B
md5("Aa486cd166f3ef31" + "851368963")[:7] # 88a81d8 ✗
md5("1234567890ABCDEF" + "851368963")[:7] # b21f44d ✓
· offset 16-17 = 04 00 → page size 1024
· offset 18-19 = 01 01 → 写/读版本
· offset 20 = 10 → reserved = 16
对上了就是它。这比什么都快。
| 关闭 | |
明文 = b"SQLite format 3\x00" + AES-CBC(key, iv=页尾16B, ct=file[16:1008])
# 其他页
明文 = AES-CBC(key, iv=页尾16B, ct=page[0:1008]) + b"\x00" * 16
原因:页内所有偏移都是按 usable = page_size - reserve = 1008 组织的,你把 reserve 抹了,SQLite 算出来的 cell 位置全错。
| 1243 | 26 | |
sqlite> SELECT count(*) FROM message; -- A: 1243 B: 26
sqlite> SELECT count(*) FROM rcontact; -- A: 364 B: 32
sqlite> PRAGMA integrity_check; -- ok
| 我彩打出来 | ||

| PNG · 1222×864 | |
| 已删除 ✔ 恢复成功 | |

2. 微信 image2 目录的扩展名不可信。文件名后缀是 .jpg,实际魔数是 PNG——一定要看 magic,不要看后缀。
3. ImgInfo2 里的 origImgMD5 是"服务器原图"哈希,跟本地恢复文件的 MD5 对不上是正常的——微信下到本地会转码压缩。校验要用本地文件自己的哈希。

· 检材 A lihh_Phone.E01 — 微信 8.0.27 / UIN -692417256 / 密钥 2c45652 / 主库 + 379 帧 WAL / 1243 条消息 / 675 个附件
· 检材 B 手机镜像.E01 — 微信 8.0.69 / UIN 851368963 / 密钥 b21f44d / 249 表 / 26 条消息 / 2 张关键图片(含 1 张已删除)
环境:WSL2 Ubuntu + libewf + Sleuth Kit 4.x + Python3(cryptography),封装工具为本地离线 .exe


敬请各位大佬关注:小谢取证


扫取二维码获取
更多精彩
小谢取证
