Chrome 65版本resources.pak结构变更后,如何修改data_pack.py实现解压?
如何修改data_pack.py以解压Chrome 65+版本的resources.pak文件
嘿,我刚好研究过Chrome 65之后resources.pak文件结构的变动——之前老版本的解压脚本完全用不了了,下面一步步教你修改data_pack.py来适配新版格式:
先搞懂Chrome 65+的resources.pak结构变化
跟老版本比,核心变化有两点:
- 魔法数从原来的
DataPack改成了Cr24,这是脚本识别文件格式的关键标识; - 索引表结构彻底变了:老版本是「4字节ID + 4字节偏移量」的8字节条目,新版本改成了「4字节ID + 4字节偏移量 + 4字节长度」的12字节条目,而且所有数值的字节序从大端改成了小端。
具体修改步骤
1. 更新魔法数检测
找到脚本里定义魔法数的行,把原来的b'DataPack'替换成b'Cr24':
# 原代码 # MAGIC = b'DataPack' # 修改后 MAGIC = b'Cr24'
2. 重构索引表读取逻辑
原来的索引读取是按8字节大端解析,现在要改成12字节小端解析,同时记录每个条目的长度:
import struct # 先找到读取索引的循环部分,替换成下面的逻辑 entries = {} num_entries = struct.unpack('<I', f.read(4))[0] # 条目数也是小端字节序了 for _ in range(num_entries): entry_id = struct.unpack('<I', f.read(4))[0] offset = struct.unpack('<I', f.read(4))[0] length = struct.unpack('<I', f.read(4))[0] entries[entry_id] = (offset, length)
注意:老版本的条目数是大端解析,新版本也要改成小端哦。
3. 修改文件内容读取逻辑
老版本是靠下一个条目的偏移量计算当前文件长度,新版本直接从索引里拿到了长度,读取起来更简单:
# 原代码可能是靠下一个偏移量算长度,现在替换成直接用索引里的length for entry_id, (offset, length) in entries.items(): f.seek(offset) data = f.read(length) # 后续处理保存逻辑
4. 完善文件保存逻辑
可以创建一个输出目录,把解压后的文件按ID命名(如果需要映射成真实文件名,可以从Chrome源码里找到ID和文件名的对应表):
import os output_dir = "unpacked_chrome_resources" os.makedirs(output_dir, exist_ok=True) for entry_id, (offset, length) in entries.items(): f.seek(offset) data = f.read(length) # 按ID命名文件,也可以根据内容类型重命名(比如识别HTML/JS后缀) file_path = os.path.join(output_dir, f"resource_{entry_id}") with open(file_path, "wb") as out_file: out_file.write(data)
额外注意事项
- 部分资源可能用了LZ4压缩,如果解压出来的是乱码,可以试试用
lz4库解压数据; - 如果需要把二进制资源转成可读文本(比如HTML、JS),大部分用UTF-8编码解码即可;
- 后续Chrome版本可能还会调整格式,建议定期查看Chrome官方源码里的data_pack实现,保持脚本同步。
内容的提问来源于stack exchange,提问作者Iliy Vasin




