一个electron打包的项目,除了asar还有pak文件,解包后感觉类似资源文件,使用到的工具如下:
pak_mingw64
推荐pak_mingw64
:https://github.com/myfreeer/chrome-pak-customizer
pak_mingw64.exe -u *.pak ./unpack
UnrealPakViewer
https://github.com/jashking/UnrealPakViewer/releases/tag/v1.1
umodel
PakerUnpaker
grit
参考:
https://blog.csdn.net/weixin_30894583/article/details/97602164
https://stackoverflow.com/questions/10633357/how-to-unpack-resources-pak-from-google-chrome
https://www.cnblogs.com/jeason1997/p/6853737.html
git clone https://chromium.googlesource.com/chromium/src/tools/grit
直接可使用
python data_pack.py *.pak
但解压出来就2个文件,应该跟代码中读取数量或者其他参数有关,有兴趣的可以看一下,且目前代码跟参考文件中不一样,可能有些关系
[Python] pak文件解析代码
import os import struct class Binary: def __init__(self, data: [bytearray, bytes, str]): self.index = 0 if isinstance(data, bytearray): self.data = data elif isinstance(data, bytes): self.data = bytearray(data) elif isinstance(data, str): self.data = bytearray(data.encode(encoding='utf-8')) else: raise TypeError('data type is invalid:', data.__class__.__name__) self.size = len(self.data) def read_int8(self) -> int: ret = self.data[self.index] self.index += 1 return ret def read_int16(self) -> int: ret, = struct.unpack('h', self.data[self.index:self.index + 2]) self.index += 2 return ret def read_int32(self) -> int: ret, = struct.unpack('i', self.data[self.index:self.index + 4]) self.index += 4 return ret def read_int64(self) -> int: ret, = struct.unpack('q', self.data[self.index:self.index + 8]) self.index += 8 return ret def read_string(self) -> str: pass def read_bytes(self, size: int) -> bytearray: if size > self.rest(): ret = self.data[self.index:] self.index += self.rest() return ret ret = self.data[self.index:self.index + size] self.index += size return ret def __len__(self): return len(self.data) def rest(self) -> int: return len(self.data) - self.index @staticmethod def bytes2str(data: [bytearray, bytes]): out = '' if data is None or len(data) == 0: return 'Null' for b in data: if out: out += ',' out += '0x%02X' % b out += '\n' out += data.decode('utf-8') return out class PakData: def __init__(self, br: Binary): self.version = br.read_int32() self.count = br.read_int32() self.coding = br.read_int8() self.resources = list() for i in range(self.count): item = { 'id': br.read_int16(), 'offset': br.read_int32(), 'data': bytearray(), 'size': 0 } self.resources.append(item) for i, item in enumerate(self.resources): if i + 1 < self.count: item['size'] = self.resources[i + 1]['offset'] - item['offset'] else: item['size'] = len(br) - item['offset'] item['data'] = br.data[item['offset']:item['offset'] + item['size']] class PakFile: def __init__(self, path: str): self.path = path if os.path.exists(path): self.decode() return self.data = None def set_path(self, path): self.path = path def decode(self) -> int: if os.path.exists(self.path) is False: return -1 with open(self.path, mode='rb') as file: raw = bytearray(file.read()) file.close() br = Binary(raw) self.data = PakData(br) def main(): pak = PakFile(r'.\zh-CN.pak') if isinstance(pak.data, PakData): print('版本:', pak.data.version) print('数量:', pak.data.count) print('编码:', pak.data.coding) for i in range(pak.data.count): print('ID:', pak.data.resources[i]['id']) print('偏移:', pak.data.resources[i]['offset']) print('大小:', pak.data.resources[i]['size']) print('内容:', Binary.bytes2str(pak.data.resources[i]['data'])) if __name__ == '__main__': main()
代码来自52pojie,不过测试的时候报字符错,修改了gbk gbk2312都不行,先记录下: