From a25f1de5a7f09278161edb06f70ba3fb65aa3534 Mon Sep 17 00:00:00 2001 From: Mark Street <22226349+mkst@users.noreply.github.com> Date: Sun, 25 Aug 2024 21:54:52 +0100 Subject: [PATCH] Add 'auto.py' example (#102) --- CHANGELOG.md | 4 + README.md | 16 +- SUPPORT.md | 80 ++++---- VERSION | 2 +- examples/auto.py | 304 +++++++++++++++++++++++++++++ examples/b64_to_bin.py | 43 ++++ examples/decode.py | 9 +- examples/info.py | 8 + examples/signature.py | 12 +- resources/H188A_TYPE4_STATIC.bin | Bin 0 -> 20168 bytes resources/H188A_TYPE4_STATIC_2.bin | Bin 0 -> 21816 bytes resources/H288A_TYPE4_STATIC.bin | Bin 0 -> 27528 bytes zcu/known_keys.py | 41 ++-- zcu/xcryptors.py | 2 +- zcu/zte.py | 32 +-- 15 files changed, 477 insertions(+), 76 deletions(-) create mode 100644 examples/auto.py create mode 100644 examples/b64_to_bin.py create mode 100644 resources/H188A_TYPE4_STATIC.bin create mode 100644 resources/H188A_TYPE4_STATIC_2.bin create mode 100644 resources/H288A_TYPE4_STATIC.bin diff --git a/CHANGELOG.md b/CHANGELOG.md index d49cd60..f252a8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 0.5.0 + +Added `auto.py` which tries all key/iv/signature combinations. + ## 0.4.0 Allow basic support for little-endian header format. diff --git a/README.md b/README.md index 56d71ea..90b7dfe 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,18 @@ Creates byte-perfect binaries for the limited number of `config.bin` that have b ## Quickstart -Clone the repo and run `python3 setup.py install --user` to install the `zcu` module. -You can then use the scripts in the [resources](./resources) directory. +Clone the repo and run `python3 -m pip install . --user` to install the `zcu` module. +You can then use the scripts in the [examples](./examples) directory. -NOTE: This project has only been tested against **Python 3.7** and higher. +**NOTE:** This project has only been tested against **Python 3.7** and higher. + +### 100% auto decode + +Try running the `examples/auto.py` against your `config.bin` + +```sh +$ python3 examples/auto.py config.bin config.xml +``` ## Examples @@ -110,7 +118,7 @@ The decoder has only been tested against `config.bin` files generated by the fol And `db_default_auto_cfg.xml` files extracted from `ZXHN H268N` and `ZXHN H298Q` firmwares -It makes a number of assumptions due to this. The encoder has not been tested in the wild. Use at your own risk. +It makes a number of assumptions due to this. The encoder has not been heavily tested in the wild. Use at your own risk. ## Requirements diff --git a/SUPPORT.md b/SUPPORT.md index 649cdcc..e70c920 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -2,46 +2,50 @@ # Supported -| model | notes | -| ----- | ----- | -| ZXHN H298A | -| ZXHN H298N | -| ZXHN H267A | @samtimber can extract username/password from config.bin | -| ZXHN H268Q | -| ZXHN H298Q | -| ZXHN H168N V2.2 | -| ZXHN H168N V3.5 | -| ZXHN H108N V2.5 | -| F600W | -| ZTE F670L | See [gist](https://gist.github.com/zainarbani/723d1387bec9e1559de7a1029d08aa91) "Your key will be the ONT serial number (ZTEGXXXXXXXX, take only the last 8 hex characters in UPPERCASE) + MAC address of your ONT (from right to left)." +| model | type | notes | +|-------------------|:-----:|-------| +| F600W | **0** | | +| ZTE F670L | | See [gist](https://gist.github.com/zainarbani/723d1387bec9e1559de7a1029d08aa91) "Your key will be the ONT serial number (ZTEGXXXXXXXX, take only the last 8 hex characters in UPPERCASE) + MAC address of your ONT (from right to left)." +| ZTE ZXHN H268A V1 | **0** | | +| ZXHN H108N V2.5 | | | +| ZXHN H168N V2.2 | **2** | | +| ZXHN H168N V3.1 | **2** | | +| ZXHN H168N V3.5 | **4** | | +| ZXHN H188A | **4** | | +| ZXHN H267A V1.0 | **2** | @samtimber can extract username/password from `config.bin`| +| ZXHN H268Q | | | +| ZXHN H288A | **4** | | +| ZXHN H298A | | | +| ZXHN H298N | **2** | | +| ZXHN H298Q | **4** | | +| ZXV10 H201L V2.0 | **2** | | # Unsupported -The table below shows an overview of the various models that people have tried: +The table below provides an overview of the various models that people have tried: -| model | github issue(s) | supported? | status | -|-|-|:-:|-| -| ZTE F450 | [#69](https://github.com/mkst/zte-config-utility/issues/69) | :question: | unknown | -| ZTE F670 V1.1 | [#72](https://github.com/mkst/zte-config-utility/issues/72) | :white_circle: | missing key(s) | -| ZTE F670 V2.0 / F680 | [#57](https://github.com/mkst/zte-config-utility/issues/57) | :red_circle: | `Unknown payload type 5` | -| ZTE F760 | [#54](https://github.com/mkst/zte-config-utility/issues/54) | :question: | unknown | -| ZTE H188A | [#43](https://github.com/mkst/zte-config-utility/issues/43) | :black_circle: | missing key(s) | -| ZTE H3600 V9 | [#76](https://github.com/mkst/zte-config-utility/issues/76) | :red_circle: | ValueError: Payload header does not start with the payload magic. | -| ZTE H3600 V9 | [#94](https://github.com/mkst/zte-config-utility/issues/94) | :question: | unknown | -| ZTE H388X(F) | [#91](https://github.com/mkst/zte-config-utility/issues/91) | :white_circle: | missing key(s) | -| ZTE ZXHN F650 | [#28](https://github.com/mkst/zte-config-utility/issues/28) | :question: | unknown | -| ZTE ZXHN F671Y | [#78](https://github.com/mkst/zte-config-utility/issues/78) | :red_circle: | `header[2]` is not 4. | -| ZTE ZXHN F680 | [#15](https://github.com/mkst/zte-config-utility/issues/15), [#68](https://github.com/mkst/zte-config-utility/issues/68) | :red_circle: | unsupported. `payload_type = 6` or `payload_type = 5`| -| ZTE ZXHN H168A V2.0 | [#25](https://github.com/mkst/zte-config-utility/issues/25) | :white_circle: | missing key(s) | -| ZTE ZXHN H199A | [#67](https://github.com/mkst/zte-config-utility/issues/67) | :question: | unknown | -| ZTE ZXHN H267A V1.0 | [#49](https://github.com/mkst/zte-config-utility/issues/49) | :white_circle: | supported? | -| ZTE ZXHN H267N V1.1 | [#9](https://github.com/mkst/zte-config-utility/issues/9) | :black_circle: | missing key(s) | -| ZTE ZXHN H268A V2.0 | [#12](https://github.com/mkst/zte-config-utility/issues/12) | :red_circle: | unsupported | -| ZTE ZXHN H288A | [#32](https://github.com/mkst/zte-config-utility/issues/32) | :white_circle: | unknown | -| ZTE ZXHN H298A V1 | [#96](https://github.com/mkst/zte-config-utility/issues/96) | :red_circle: | ValueError: Payload header does not start with the payload magic. -| ZTE ZXHN H298A V9 | [#31](https://github.com/mkst/zte-config-utility/issues/31) | :white_circle: | missing key(s) | -| ZTE ZXHN H367A | [#71](https://github.com/mkst/zte-config-utility/issues/71) | :white_circle: | missing key(s) | -| RT-GM-5 | [#41](https://github.com/mkst/zte-config-utility/issues/41) | :white_circle: | missing key(s) | -| Speedport Entry 2i | [#13](https://github.com/mkst/zte-config-utility/issues/13) | :white_circle: | externally supported, see [gist](https://gist.github.com/viliampucik/54956df2302362dab281f86178a4b848) | -| TIM Smart Hub+, H388X | [#24](https://github.com/mkst/zte-config-utility/issues/24) | :white_circle: | missing key(s) | +| model | type | support | status | github issue(s) | +|-----------------------|:-----:|:--------------:|--------------------------|-----------| +| ZTE F450 | ? | :question: | need example config.bin | [#69](https://github.com/mkst/zte-config-utility/issues/69) | +| ZTE F670 V1.1 | **2** | :key: | need more ivs/keys | [#72](https://github.com/mkst/zte-config-utility/issues/72) | +| ZTE F670 V2.0 / F680 | **5** | :red_circle: | `Unknown payload type 5` | [#57](https://github.com/mkst/zte-config-utility/issues/57) | +| ZTE F760 | ? | :question: | need example config.bin | [#54](https://github.com/mkst/zte-config-utility/issues/54) | +| ZTE H188A | ? | :key: | need more keys | [#43](https://github.com/mkst/zte-config-utility/issues/43) | +| ZTE H3600 V9 | ? | :question: | need example config.bin | [#76](https://github.com/mkst/zte-config-utility/issues/76) | +| ZTE H388X(F) | ? | :key: | need more ivs/keys | [#91](https://github.com/mkst/zte-config-utility/issues/91) | +| ZTE ZXHN F650 | ? | :question: | need example config.bin | [#28](https://github.com/mkst/zte-config-utility/issues/28) | +| ZTE ZXHN F671Y | ? | :key: | need more ivs/keys | [#78](https://github.com/mkst/zte-config-utility/issues/78) | +| ZTE ZXHN F680 | ? | :red_circle: | unsupported. `payload_type = 6` or `payload_type = 5`| [#15](https://github.com/mkst/zte-config-utility/issues/15), [#68](https://github.com/mkst/zte-config-utility/issues/68) | +| ZTE ZXHN H168A V2.0 | 4 | :key: | need more ivs/keys | [#25](https://github.com/mkst/zte-config-utility/issues/25) | +| ZTE ZXHN H199A | ? | :question: | need example config.bin | [#67](https://github.com/mkst/zte-config-utility/issues/67) | +| ZTE ZXHN H267A V1.0 | ? | :white_circle: | supported? | [#49](https://github.com/mkst/zte-config-utility/issues/49) | +| ZTE ZXHN H267N V1.1 | ? | :key: | missing key(s) | [#9](https://github.com/mkst/zte-config-utility/issues/9) | +| ZTE ZXHN H268A V2.0 | ? | :red_circle: | unsupported | [#12](https://github.com/mkst/zte-config-utility/issues/12) | +| ZTE ZXHN H288A | ? | :white_circle: | unknown | [#32](https://github.com/mkst/zte-config-utility/issues/32) | +| ZTE ZXHN H298A V1 | ? | :question: | missing key(s) | [#96](https://github.com/mkst/zte-config-utility/issues/96) | +| ZTE ZXHN H298A V9 | ? | :key: | need more ivs/keys | [#31](https://github.com/mkst/zte-config-utility/issues/31) | +| ZTE ZXHN H367A | ? | :key: | need more ivs/keys | [#71](https://github.com/mkst/zte-config-utility/issues/71) | +| RT-GM-5 | ? | :key: | need more ivs/keys | [#41](https://github.com/mkst/zte-config-utility/issues/41) | +| Speedport Entry 2i | ? | :white_circle: | externally supported, see [gist](https://gist.github.com/viliampucik/54956df2302362dab281f86178a4b848) | [#13](https://github.com/mkst/zte-config-utility/issues/13) | +| TIM Smart Hub+, H388X | ? | :key: | need more ivs/keys | [#24](https://github.com/mkst/zte-config-utility/issues/24) | diff --git a/VERSION b/VERSION index 60a2d3e..8f0916f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.0 \ No newline at end of file +0.5.0 diff --git a/examples/auto.py b/examples/auto.py new file mode 100644 index 0000000..8f075aa --- /dev/null +++ b/examples/auto.py @@ -0,0 +1,304 @@ +import argparse + +import zcu + +from zcu.known_keys import KNOWN_KEYS, KNOWN_SIGNATURES +from zcu.xcryptors import Xcryptor, CBCXcryptor +from zcu.known_keys import mac_to_str + + +KNOWN_KEYPAIR_SUFFIXES = [ + ("", ""), # e.g. type 3 + ("key", "IV"), + ("Key02660004", "Iv02660004"), + ("Key02710001", "Iv02710001"), + ("Key02710010", "Iv02710010"), + ("Key02721401", "Iv02721401"), + ("8cc72b05705d5c46f412af8cbed55aa", "667b02a85c61c786def4521b060265e"), +] + +KNOWN_KEYPAIR_PREFIXES = [ + ("", ""), + ("8cc72b05705d5c46", "667b02a85c61c786"), + ("8dc79b15726d5c46", "678b02a85c63c786"), +] + +KNOWN_KEYPAIRS = [ + ("H267AV1_CZkey", "H267AV1_CZIV"), + ("8cc72b05705d5c46f412af8cbed55aad", "667b02a85c61c786def4521b060265e8"), + ("8dc79b15726d5c46d412af8cbed65aad", "678b02a85c63c786def4523b061265e8"), +] + +KNOWN_PASSWORD_KEYPAIR_SUFFIXES = [ + ("", ""), + ("Mcd5c46e", "G21b667b"), +] + +KNOWN_MAC_SERIAL_IVS = [ + "ZTE%FN$GponNJ025", +] + + +def hardcoded_keypairs(args): + return [(k, None) for k in KNOWN_KEYS] + + +def signature_keypairs(args): + keypairs = [] + + signatures = [] + if args.signature: + signatures += [ + args.signature, + args.signature.replace(" ", ""), + ] + signatures += KNOWN_SIGNATURES + + for signature in signatures: + if args.key_suffix and args.iv_suffix: + keypairs += [ + (f"{signature}{args.key_suffix}", f"{signature}{args.iv_suffix}") + ] + + keypairs += [ + (f"{signature}{key}", f"{signature}{iv}") + for (key, iv) in KNOWN_KEYPAIR_SUFFIXES + ] + + keypairs += [(key, iv) for (key, iv) in KNOWN_KEYPAIRS] + + return keypairs + + +def serial_keypairs(args): + keypairs = [] + if args.serial_number is None: + print("To decode any 'serial' payloads, please specify Serial Number, e.g.") + print(" --serial 'SERIALNUMBER'") + return keypairs + + serial = args.serial_number + + keypair_prefixes = [] + if args.key_prefix and args.iv_prefix: + keypair_prefixes += [ + (args.key_prefix, args.iv_prefix), + ] + keypair_prefixes += KNOWN_KEYPAIR_PREFIXES + + keypairs += [(f"{key}{serial}", f"{iv}{serial}") for (key, iv) in keypair_prefixes] + + return keypairs + + +def mac_serial_keypairs(args): + keypairs = [] + if args.mac_address is None or args.serial_number is None: + print( + "To decode any 'mac+serial' payloads, please specify MAC Address and Serial Number, e.g." + ) + print(" --mac 'AA:BB:CC:DD:EE:FF' --serial 'SERIALNUMBER'") + return keypairs + + serial = args.serial_number + mac = args.mac_address + + for iv in KNOWN_MAC_SERIAL_IVS: + keypairs += [ + # raw serial + (serial + mac_to_str(mac, reverse=False, separator=""), iv), + (serial + mac_to_str(mac, reverse=True, separator=""), iv), + (serial + mac_to_str(mac, reverse=False, separator=":"), iv), + (serial + mac_to_str(mac, reverse=True, separator=":"), iv), + # skip first 4 chars, e.g. ZTEGXXXXXXXX + (serial[4:] + mac_to_str(mac, reverse=False, separator=""), iv), + (serial[4:] + mac_to_str(mac, reverse=True, separator=""), iv), + (serial[4:] + mac_to_str(mac, reverse=False, separator=":"), iv), + (serial[4:] + mac_to_str(mac, reverse=True, separator=":"), iv), + # take last 8 chars, e.g. ZTEGXXXXXXXX + (serial[-8:] + mac_to_str(mac, reverse=False, separator=""), iv), + (serial[-8:] + mac_to_str(mac, reverse=True, separator=""), iv), + (serial[-8:] + mac_to_str(mac, reverse=False, separator=":"), iv), + (serial[-8:] + mac_to_str(mac, reverse=True, separator=":"), iv), + ] + + # # convert first 8 hex chars to ascii + # if all([x in "0123456789abcdef" for x in serial[:8].lower()]): + # ascii_serial = bytearray.fromhex(serial[:8]).decode() + # keypairs += [ + # (ascii_serial + mac_to_str(mac, reverse=False, separator=""), iv), + # (ascii_serial + mac_to_str(mac, reverse=True, separator=""), iv), + # (ascii_serial + mac_to_str(mac, reverse=False, separator=":"), iv), + # (ascii_serial + mac_to_str(mac, reverse=True, separator=":"), iv), + # ] + + return keypairs + + +def mac_serial_password_keypairs(args): + # NOTE: "suffix" is a misnomer here: + # key is PASSWORD|SERIAL|SUFFIX + # iv is PREFIX|MAC|PASSWORD + + keypairs = [] + if args.mac_address is None or args.serial_number is None or args.password is None: + print( + "To decode any 'mac+serial+password' payloads, please specify MAC Address, Serial Number and Password parameters, e.g." + ) + print( + " --mac 'AA:BB:CC:DD:EE:FF' --serial 'SERIALNUMBER' --password 'password'" + ) + return keypairs + + mac = mac_to_str(args.mac_address, reverse=False, separator=":") + serial = args.serial_number + password = args.password + + if args.key_suffix and args.iv_suffix: + keypairs += [ + (f"{password}{serial}{args.key_suffix}", f"{args.iv_suffix}{mac}{password}") + ] + + keypairs += [ + (f"{password}{serial}{key}", f"{iv}{mac}{password}") + for (key, iv) in KNOWN_PASSWORD_KEYPAIR_SUFFIXES + ] + + return keypairs + + +def decrypt(infile, decryptor, keypair): + start_pos = infile.tell() + decryptor.set_key(*keypair) + try: + decrypted = decryptor.decrypt(infile) + except ValueError: + infile.seek(start_pos) + return None + infile.seek(start_pos) + if decrypted is not None: + if zcu.zte.read_payload_type(decrypted, raise_on_error=False) is not None: + return decrypted + return None + + +HANDLERS = [ + lambda a: (hardcoded_keypairs(a), Xcryptor()), + lambda a: (signature_keypairs(a), CBCXcryptor()), # requires signature + lambda a: (serial_keypairs(a), CBCXcryptor()), # requires serial + lambda a: (mac_serial_keypairs(a), CBCXcryptor()), # requires mac, serial + lambda a: ( + mac_serial_password_keypairs(a), + CBCXcryptor(), + ), # requires mac, serial, password +] + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "infile", + type=argparse.FileType("rb"), + help="Encoded configuration file e.g. config.bin", + ) + parser.add_argument( + "outfile", type=argparse.FileType("wb"), help="Output file e.g. config.xml" + ) + + parser.add_argument( + "--little-endian", + action="store_true", + help="Whether payload is little-endian (defaults to big-endian)", + ) + + parser.add_argument( + "--signature", + type=str, + help="Supply/override Signature for Type-4 key generation", + ) + parser.add_argument( + "--serial-number", + type=str, + help="Supply Serial Number of device", + ) + parser.add_argument( + "--mac-address", + type=str, + help="Supply MAC Address of device, e.g. AA:BB:CC:DD:EE:FF", + ) + parser.add_argument( + "--password", + type=str, + help="Supply Long password from TagParams (entry 4100) for key generation", + ) + parser.add_argument( + "--key-prefix", + type=str, + help="Supply Key Prefix", + ) + parser.add_argument( + "--key-suffix", + type=str, + help="Supply Key Suffix", + ) + parser.add_argument( + "--iv-prefix", + type=str, + help="Supply IV Prefix", + ) + parser.add_argument( + "--iv-suffix", + type=str, + help="Supply IV Suffix", + ) + + args = parser.parse_args() + + infile = args.infile + + # check magic + header = infile.read(4) + if header == b"BAMC": + print(f"ERROR: {infile.name} is base64 encoded, please decode and try again.") + return 1 + + infile.seek(0) + zcu.zte.read_header(infile, little_endian=args.little_endian) + + signature = zcu.zte.read_signature(infile).decode() + if args.signature is None: + args.signature = signature + + payload_type = zcu.zte.read_payload_type(infile) + if payload_type != 0: + for handler in HANDLERS: + success = False + keypairs, decryptor = handler(args) + for keypair in keypairs: + # print(f"Trying (key, iv): {keypair}") + decrypted = decrypt(infile, decryptor, keypair) + if decrypted is not None: + success = True + break + if success: + break + else: + print("Unable to find valid key for payload.") + return 1 + else: + decompressed, _ = zcu.compression.decompress(infile) + args.outfile.write(decompressed.read()) + print(f"Successfully decompressed {infile.name}") + return 0 + + decompressed, _ = zcu.compression.decompress(decrypted) + args.outfile.write(decompressed.read()) + print( + f"Successfully decrypted and decompressed {infile.name} using (key, iv): {keypair}" + ) + return 0 + + +if __name__ == "__main__": + main() diff --git a/examples/b64_to_bin.py b/examples/b64_to_bin.py new file mode 100644 index 0000000..fcaffc8 --- /dev/null +++ b/examples/b64_to_bin.py @@ -0,0 +1,43 @@ +import sys +import base64 +from pathlib import Path + + +def main(): + if len(sys.argv) < 2: + print(f"Usage: python3 {sys.argv[0]} [infile] ") + print(f" e.g. python3 {sys.argv[0]} config.bin") + return 1 + + infile = Path(sys.argv[1]) + + if len(sys.argv) > 2: + outfile = Path(sys.argv[2]) + else: + outfile = infile + + if not infile.is_file(): + print(f"{infile} not found") + return 1 + + with infile.open("rb") as f: + data = f.read() + + if data[:4] != b"BAMC": + print("This isn't a base64 encoded config.bin") + return 1 + + try: + decoded = base64.b64decode(data) + except Exception as e: + print(f"Failed to base64 decode {infile}: e") + return + + with outfile.open("wb") as f: + f.write(decoded) + + print("Success!") + + +if __name__ == "__main__": + main() diff --git a/examples/decode.py b/examples/decode.py index 1f86d20..6e68ebb 100644 --- a/examples/decode.py +++ b/examples/decode.py @@ -147,6 +147,11 @@ def main(): parser.add_argument( "outfile", type=argparse.FileType("wb"), help="Output file e.g. config.xml" ) + parser.add_argument( + "--little-endian", + action="store_true", + help="Whether payload is little-endian (defaults to big-endian)", + ) parser.add_argument( "--key", type=lambda x: x.encode(), default=b"", help="Key for AES decryption" ) @@ -211,7 +216,7 @@ def main(): infile = args.infile outfile = args.outfile - zcu.zte.read_header(infile) + zcu.zte.read_header(infile, little_endian=args.little_endian) signature = zcu.zte.read_signature(infile).decode() if signature: @@ -226,8 +231,6 @@ def main(): else: params.signature = signature - args.fuck = 123 - if args.key: params.key = args.key if args.model: diff --git a/examples/info.py b/examples/info.py index 9e2cd86..6a5d199 100644 --- a/examples/info.py +++ b/examples/info.py @@ -7,6 +7,14 @@ def print_payload_info(infile): """expects to be at the start of the payload magic""" + + # check magic + header = infile.read(4) + if header == b"BAMC": + print(f"ERROR: {infile.name} is base64 encoded, please decode and try again.") + return 1 + infile.seek(0) + zcu.zte.read_header(infile) signature = zcu.zte.read_signature(infile) payload_header = zcu.zte.read_payload(infile) diff --git a/examples/signature.py b/examples/signature.py index e4e9098..9972aca 100644 --- a/examples/signature.py +++ b/examples/signature.py @@ -17,8 +17,16 @@ def main(): args = parser.parse_args() - zcu.zte.read_header(args.infile) - signature = zcu.zte.read_signature(args.infile) + infile = args.infile + + header = infile.read(4) + if header == b"BAMC": + print(f"ERROR: {infile.name} is base64 encoded, please decode and try again.") + return 1 + infile.seek(0) + + zcu.zte.read_header(infile) + signature = zcu.zte.read_signature(infile) print(signature.decode("utf-8")) diff --git a/resources/H188A_TYPE4_STATIC.bin b/resources/H188A_TYPE4_STATIC.bin new file mode 100644 index 0000000000000000000000000000000000000000..0fd81e527e08299cbffb04548a6d437ba94a5b54 GIT binary patch literal 20168 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 literal 0 HcmV?d00001 diff --git a/resources/H188A_TYPE4_STATIC_2.bin b/resources/H188A_TYPE4_STATIC_2.bin new file mode 100644 index 0000000000000000000000000000000000000000..3c458f37f52563086b0a535c9b7f441dbb65a7a4 GIT binary patch literal 21816 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 anu>UrZs6IGMLHPKe>^Qm=4I", infile.read(16)) + fmt = ">4I" + header_magic = struct.unpack(fmt, infile.read(struct.calcsize(fmt))) if header_magic == constants.ZTE_MAGIC: # 128 byte header - endian = "<" if little_endian else ">" - header = struct.unpack(endian + "28I", infile.read(112)) - assert header[2] == 4, "Expected header[2] to be 4, was actually %s" % header[2] + fmt = f'{"<" if little_endian else ">"}28I' + header = struct.unpack(fmt, infile.read(struct.calcsize(fmt))) + if header[2] == 0x4000000: + print("WARNING: Incorrect endianess specified!") + infile.seek(0) + return read_header(infile, not little_endian) + + assert ( + header[2] == 4 + ), f"Expected header[2] to be 0x4, was actually 0x{header[2]:X}" header_length = header[13] signed_config_size = header[14] file_size = stat(infile.name).st_size @@ -29,7 +37,8 @@ def read_header(infile, little_endian=False): def read_signature(infile): """expects to be at the start of the signature magic, returns signature""" - signature_header = struct.unpack(">3I", infile.read(12)) + fmt = ">3I" + signature_header = struct.unpack(fmt, infile.read(struct.calcsize(fmt))) signature = b"" if signature_header[0] == constants.SIGNATURE_MAGIC: # _ = signature_header[1] # 0 ? @@ -43,7 +52,8 @@ def read_signature(infile): def read_payload(infile, raise_on_error=True): """expects to be at the start of the payload magic""" - payload_header = struct.unpack(">15I", infile.read(60)) + fmt = ">15I" + payload_header = struct.unpack(fmt, infile.read(struct.calcsize(fmt))) if payload_header[0] != constants.PAYLOAD_MAGIC: if raise_on_error: raise ValueError("Payload header does not start with the payload magic.") @@ -75,7 +85,6 @@ def add_header(payload, signature, version, include_header=False, little_endian= 0, 0, 4, - 0, # FIXME: header[2] is not always 4 0, 0, 0, @@ -83,9 +92,10 @@ def add_header(payload, signature, version, include_header=False, little_endian= 0, 0, 0, - 64, + 0, + 64, # 0x40 version, - 128, + 128, # 0x80 full_payload_length, 0, 0, @@ -101,8 +111,8 @@ def add_header(payload, signature, version, include_header=False, little_endian= 0, 0, ] - endian = "<" if little_endian else ">" - full_payload.write(struct.pack(endian + "28I", *header)) + fmt = f'{"<" if little_endian else ">"}28I' + full_payload.write(struct.pack(fmt, *header)) if signature_length > 0: signature_header = [