feat: fw library ++

main
Mikhail Yudin 2023-06-14 01:16:58 +07:00
rodzic 9232a29a1f
commit 04fa5f08a2
2 zmienionych plików z 39 dodań i 3 usunięć

18
fw.py
Wyświetl plik

@ -2,11 +2,16 @@
from uvk5 import UVK5, argv, eprint, Firmware
def main(path):
fw = Firmware.load(path)
def main(cmd):
argc = len(argv)
fw = Firmware.load(argv[2])
eprint('Version:', fw.version)
if argc >= 4 and argv[2] == 'mod':
if argc < 3:
return
if cmd == 'mod':
eprint('mods:', argv[3])
fw.apply_mods(argv[3].split(','))
fw.write()
@ -14,6 +19,13 @@ def main(path):
with UVK5(argv[4]) as uvk5:
uvk5.get_version()
uvk5.send_firmware(fw)
return
if cmd == 'cmp':
fw2 = Firmware.load(argv[3])
fw.compare(fw2)
if __name__ == '__main__':
main(argv[1])

24
uvk5.py
Wyświetl plik

@ -104,6 +104,30 @@ class Firmware(bytearray):
self.version = version
def compare(self, fw):
a = None
la = len(self)
lb = len(fw)
changes = {}
for i in range(min(la, lb)):
differ = self[i] != fw[i]
if not differ:
a = None
continue
if not a:
a = '0x%x' % i
changes[a] = [bytearray(), bytearray()]
changes[a][0].append(self[i])
changes[a][1].append(fw[i])
for addr, ch in changes.items():
print(addr, ch[0].hex(), ch[1].hex())
def patch_single(self, addr, new_value, size=4):
old_bytes = self[addr:addr+size]
old_value = int.from_bytes(old_bytes, 'little')