modder2
Mikhail Yudin 2023-05-14 14:18:12 +07:00
rodzic f0f1940ecd
commit fdf002bc13
1 zmienionych plików z 45 dodań i 25 usunięć

Wyświetl plik

@ -1,51 +1,70 @@
#!/usr/bin/env python3
from itertools import cycle
import os
from pathlib import Path
from itertools import cycle
from sys import argv, stderr
# Structure of pre-encoded payload
# 8196 | 16 | ... | 2 |
# data D1 | version V | data D2 | crc |
# 8196 | 16 | ... | 2 |
# data | version | data | crc |
KEY = Path('./key.bin').read_bytes()
D1_LEN = 8192
V_OFFSET = 8192
V_LEN = 16
CRC_LEN = 2
def eprint(*args, **kwargs):
print(*args, **kwargs, file=stderr)
def xor(var, key):
return bytes(a ^ b for a, b in zip(var, cycle(key)))
def decrypt(data):
def eprint_crc(crc):
eprint('crc:', ['0x%02x' % x for x in crc], f'{crc[0]*crc[1]}')
def make_16yte_version(version):
return bytes([ord(c) for c in version] + [0] * (16 - len(version)))
def decrypt(data):
decr = xor(data, KEY)
d1 = decr[:D1_LEN]
v = decr[D1_LEN:D1_LEN+V_LEN]
d2 = decr[D1_LEN+V_LEN:-2]
crc = decr[-2:]
v = decr[V_OFFSET:V_OFFSET+V_LEN]
decr_data = decr[:-CRC_LEN]
crc = decr[-CRC_LEN:]
print('version:', v, file=stderr)
print('crc:', ['0x%02x' % x for x in crc], f'{crc[0]*crc[1]}', file=stderr)
eprint('version:', v)
eprint_crc(crc)
return d1 + d2
return decr_data
def encrypt(data, version='2.01.19'):
v = make_16yte_version(version)
data = data[:V_OFFSET] + v + data[V_OFFSET+V_LEN:]
crc = b'\xd9\xab' # here will be some crc
eprint('version:', v)
eprint_crc(crc)
return xor(data + crc, KEY)
def encrypt(data, version='2.01.26'):
D1_LEN = 8192
v = bytes([ord(c) for c in version] + [0] * (16 - len(version)))
print('version:', v, file=stderr)
return xor(data[:D1_LEN] + v + data[D1_LEN:] + b'\xd8\x7f', KEY)
def usage(info = None):
if info:
print(info, file=stderr)
print(f'Usage: {argv[0]} <e|d> filename.bin > raw.bin', file=stderr)
print(f' Example decode: {argv[0]} d k5_26_encrypted.bin > k5_26_raw.bin', file=stderr)
print(f' Example encode: {argv[0]} e k5_26_raw.bin > k5_26_encrypted.bin', file=stderr)
eprint(info)
eprint(f'Usage: {argv[0]} <e|d> filename.bin > raw.bin')
eprint(f' Example decode: {argv[0]} d k5_26_encrypted.bin > k5_26_raw.bin')
eprint(f' Example encode: {argv[0]} e k5_26_raw.bin > k5_26_encrypted.bin')
exit(128)
def main():
if len(argv) != 3:
usage()
@ -57,14 +76,15 @@ def main():
encrypted = Path(fname).read_bytes()
decrypted = decrypt(encrypted)
os.write(1, bytes(decrypted))
print('Success!', file=stderr)
eprint('Success!')
return
if encdec == 'e':
print('WARNING! encoding not working for now, as CRC not valid', file=stderr)
eprint('WARNING! encoding not working for now, as CRC not valid')
decrypted = Path(fname).read_bytes()
encrypted = encrypt(decrypted)
os.write(1, bytes(encrypted))
print('Success!', file=stderr)
eprint('Success!')
return
usage()