-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathslb2.py
89 lines (70 loc) · 3.16 KB
/
slb2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python
import os
from construct import *
from utils import _create_working_dir
class SLB2:
def __init__(self, file, filename):
self.file = filename
self.block_size = 512
pup_file = Struct(
'pup_data' / Pointer(lambda this: this._.pup_entries[this._index].pup_offset * self.block_size,
Bytes(lambda this: this._.pup_entries[this._index].pup_data_size)),
)
pup_checksum = Struct(
'pup_checksum' / Pointer(lambda this: this._index + 1 * self.block_size, Bytes(32)),
)
pup_entry = Struct(
'pup_offset' / Int32ul,
'pup_data_size' / Int32ul,
Padding(8),
'pup_name' / PaddedString(32, 'utf-8'),
)
slb2_header = Struct(
'signature' / Const(b'SLB2'),
'version' / Int32ul,
Padding(2),
'unknown_static' / Int8ub,
'type' / Enum(Int8ub,
SYSTEM = 0x00,
RECOVERY = 0x01,
),
'file_count' / Int32ul,
'data_size' / Int32ul,
Padding(12),
'pup_entries' / Array(this.file_count, pup_entry),
'pup_checksums' / Array(this.file_count, pup_checksum),
'pup_files' / Array(this.file_count, pup_file),
)
self.slb2 = slb2_header.parse(file)
def info(self, verbose):
print('PS5 SLB2 iNFO')
print('#############')
if verbose:
print(self.slb2)
else:
print('Filename: ' + os.path.basename(self.file))
print('Version: 0x%X' % self.slb2.version)
print('Type: ' + self.slb2.type)
print('File Count: 0x%X' % self.slb2.file_count)
print('Data Size: 0x%X' % self.slb2.data_size)
print('Contains:')
for i in range(self.slb2.file_count):
print('')
print('Name: ' + self.slb2.pup_entries[i].pup_name)
print('Offset: 0x%X' % (self.slb2.pup_entries[i].pup_offset * self.block_size))
print('Bytes: 0x%X' % self.slb2.pup_entries[i].pup_data_size)
def extract(self):
print('')
print('PS5 SLB2 EXTRACTiON')
print('###################')
working_dir = _create_working_dir(os.path.basename(self.file))
for i in range(self.slb2.file_count):
with open(working_dir + '/' + self.slb2.pup_entries[i].pup_name, 'wb') as f:
f.write(self.slb2.pup_files[i].pup_data)
print('EXTRACTED #%i: %s (0x%X Bytes)' % (
i,
self.slb2.pup_entries[i].pup_name,
self.slb2.pup_entries[i].pup_data_size
)
)
print('%i files extracted...' % self.slb2.file_count)