diff --git a/fw.py b/fw.py index 12c7560..f2d7d14 100755 --- a/fw.py +++ b/fw.py @@ -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]) diff --git a/uvk5.py b/uvk5.py index 5bb4601..0d5bd9f 100755 --- a/uvk5.py +++ b/uvk5.py @@ -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')