You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动