-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUnpack_firmware.py
More file actions
61 lines (43 loc) · 1.34 KB
/
Copy pathUnpack_firmware.py
File metadata and controls
61 lines (43 loc) · 1.34 KB
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
from lib.StaticVars import *
from lib.utils import DataReader, size_human
import os
FIRMWARE = 'firmware.fw'
OUTPUT = '_UNPACKED_FW'
if not os.path.exists(OUTPUT):
os.mkdir(OUTPUT)
class FirmwareException(BaseException):
pass
fw = DataReader(FIRMWARE)
magic = fw.read_string(16)
header_size = fw.read_int(4)
unknw_1 = fw.read_int(16)
items_count = fw.read_int(4)
unknw_2 = fw.read_int(24)
print(f">> {fw.file_name} ({size_human(fw.file_size)}), {items_count} items:")
print('-' * 64)
if magic != FWU_MAGIC_WF:
raise FirmwareException("Wrong magic string in file!")
items = []
for i in range(0, items_count):
name = fw.read_string(16)
filesystem = fw.read_string(8)
offset = fw.read_int(8)
size = fw.read_int(8)
reserved = fw.read_bytes(24)
print(f"{(name + '.' + filesystem):<24} {offset:>12} {size:>12} ({size_human(size):>9})")
items.append((name, filesystem, offset, size))
if fw.get_pos() != header_size:
raise FirmwareException("Wrong header size!")
print('-' * 64)
for item in items:
name, fs, offset, size = item
print(f"Unpacking {name:<16}", end=" ")
# Go to file start position
fw.set_pos(offset)
try:
with open(f"{OUTPUT}/{name}.{fs}.bin", "wb") as f:
f.write(fw.read_bytes(size))
except FirmwareException as e:
print('ERROR', e)
else:
print('[DONE]')