-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmodder.py
executable file
·51 lines (36 loc) · 1.42 KB
/
modder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
import os
from pathlib import Path
from sys import argv
from configparser import ConfigParser
from uvk5 import decrypt, encrypt, eprint
ADDR_DIR = Path(__file__).parent / 'addresses'
MODS_DIR = Path(__file__).parent / 'mods'
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)
mods_file = MODS_DIR / ('%s.ini' % version)
addresses = ConfigParser()
mods = ConfigParser()
addresses.read(addr_file)
mods.read(mods_file)
for section_name in addresses:
eprint('[%s]' % section_name)
section_values = addresses[section_name]
for k in section_values:
addr = int(section_values.get(k), 16)
value = int.from_bytes(decrypted[addr:addr+4], 'little')
eprint(k, addr, value)
if mods[section_name] and mods[section_name].get(k):
new_value = mods[section_name].get(k)
eprint('new:', new_value)
decrypted = decrypted[:addr] + int(new_value).to_bytes(4, 'little') + decrypted[addr+4:]
encrypted = encrypt(decrypted, version)
if len(file_bytes) != len(encrypted):
eprint('Something goes wrong. Check values or open issue.')
exit(255)
os.write(1, encrypted)
if __name__ == "__main__":
main(argv[1])