diff --git a/addresses/2.01.26.ini b/addresses/2.01.26.ini new file mode 100644 index 0000000..0f2e5f7 --- /dev/null +++ b/addresses/2.01.26.ini @@ -0,0 +1,16 @@ +# thanks to gabizro +[bands] +B1_1=0xE074 +B1_2=0xE090 +B2_1=0xE078 +B2_2=0xE094 +B3_1=0xE07C +B3_2=0xE098 +B4_1=0xE080 +B4_2=0xE09C +B5_1=0xE084 +B5_2=0xE0A0 +B6_1=0xE088 +B6_2=0xE0A4 +B7_1=0xE08C +B7_2=0xE0A8 diff --git a/key.bin b/data/key.bin similarity index 100% rename from key.bin rename to data/key.bin diff --git a/encdec.py b/encdec.py index d285d2d..0ff5751 100755 --- a/encdec.py +++ b/encdec.py @@ -1,45 +1,10 @@ #!/usr/bin/env python3 -from binascii import crc_hqx as crc16 -from itertools import cycle import os from pathlib import Path from sys import argv -from sys import stderr -# Structure of pre-encoded payload -# 8196 | 16 | ... | 2 | -# data | version | data | crc | - -KEY = Path('./key.bin').read_bytes() - -V_START = 8192 -V_END = V_START + 16 -CRC_LEN = 2 - -def eprint(*args, **kwargs): - print(*args, **kwargs, file=stderr) - - -def xor(var): - return bytes(a ^ b for a, b in zip(var, cycle(KEY))) - - -def make_16byte_version(version): - return bytes([ord(c) for c in version] + [0] * (16 - len(version))) - - -def decrypt(data): - decrypted = xor(data) - eprint('version:', decrypted[V_START:V_END].decode()) - return decrypted[:V_START] + decrypted[V_END:-CRC_LEN] - - -def encrypt(data, version='2.01.26'): - v = make_16byte_version(version) - encrypted = xor(data[:V_START] + v + data[V_START:]) - checksum = crc16(encrypted, 0).to_bytes(2, 'little') - return encrypted + checksum +from lib.encdec import eprint, encrypt, decrypt def usage(info = None): @@ -57,7 +22,9 @@ def main(): file_bytes = Path(argv[2]).read_bytes() if mode == 'd': - os.write(1, decrypt(file_bytes)) + decrypted, version = decrypt(file_bytes) + eprint('version:', version) + os.write(1, decrypted) eprint('Success!') return diff --git a/lib/encdec.py b/lib/encdec.py new file mode 100644 index 0000000..8013ccc --- /dev/null +++ b/lib/encdec.py @@ -0,0 +1,41 @@ +from binascii import crc_hqx as crc16 +from itertools import cycle +from sys import stderr +from pathlib import Path + +# Structure of pre-encoded payload +# 8196 | 16 | ... | 2 | +# data | version | data | crc | + +LIB_DIR = Path(__file__).parent +DATA_DIR = LIB_DIR / '..' / 'data' +KEY = (DATA_DIR / 'key.bin').read_bytes() + +V_START = 8192 +V_END = V_START + 16 +CRC_LEN = 2 + +def eprint(*args, **kwargs): + print(*args, **kwargs, file=stderr) + + +def xor(var): + return bytes(a ^ b for a, b in zip(var, cycle(KEY))) + + +def make_16byte_version(version): + return bytes([ord(c) for c in version] + [0] * (16 - len(version))) + + +def decrypt(data): + decrypted = xor(data) + version = decrypted[V_START:V_END].decode().rstrip('\x00') + return (decrypted[:V_START] + decrypted[V_END:-CRC_LEN], version) + + +def encrypt(data, version='2.01.26'): + v = make_16byte_version(version) + encrypted = xor(data[:V_START] + v + data[V_START:]) + checksum = crc16(encrypted, 0).to_bytes(2, 'little') + return encrypted + checksum + diff --git a/modder.py b/modder.py new file mode 100644 index 0000000..107858c --- /dev/null +++ b/modder.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +from pathlib import Path +from sys import argv +from configparser import ConfigParser + +from lib.encdec import decrypt, eprint + +ADDR_DIR = Path(__file__).parent / 'addresses' + +def main(encrypted_file_path): + file_bytes = Path(encrypted_file_path).read_bytes() + decrypted, version = decrypt(file_bytes) + eprint('version:', version) + + addr_file = ADDR_DIR / ('%s.ini' % version) + addresses = ConfigParser() + addresses.read(addr_file) + + bands_addr = addresses['bands'] + for k in bands_addr: + addr = int(bands_addr.get(k), 16) + value = int.from_bytes(decrypted[addr:addr+4], 'little') + eprint(k, addr, value) + + +if __name__ == "__main__": + main(argv[1]) diff --git a/freq-bounds-finder.py b/tools/freq-bounds-finder.py old mode 100755 new mode 100644 similarity index 100% rename from freq-bounds-finder.py rename to tools/freq-bounds-finder.py diff --git a/int-valies-finder.py b/tools/int-values-finder.py old mode 100755 new mode 100644 similarity index 100% rename from int-valies-finder.py rename to tools/int-values-finder.py diff --git a/read-settings.py b/tools/read-from-station.py old mode 100755 new mode 100644 similarity index 100% rename from read-settings.py rename to tools/read-from-station.py diff --git a/searcher.py b/tools/searcher.py similarity index 100% rename from searcher.py rename to tools/searcher.py