Skip to content

Instantly share code, notes, and snippets.

@kiri-e
Created February 26, 2022 09:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kiri-e/f66c8fb071072360d1d7e0b86d28182d to your computer and use it in GitHub Desktop.
Save kiri-e/f66c8fb071072360d1d7e0b86d28182d to your computer and use it in GitHub Desktop.
a23_decpak.py
from struct import unpack
from sys import argv, exit
import os
from itertools import cycle
def xor(a,b):
return bytes([i ^ j for i,j in zip(a, cycle(b))])
f = open(argv[1], 'rb')
base_header_size = 4 * 4
file_entry_size = 184
magic, num_files, hunk1, hunk2 = unpack("<IIII", f.read(base_header_size))
offset_base = base_header_size + num_files * file_entry_size
if magic != 0x20000 or hunk1 != 0x10 or hunk2 != 0x0d:
print('bad magic', hex(magic), hex(hunk1), hex(hunk2))
exit(0)
file_entries = []
print("Number of files:", num_files)
for i in range(num_files):
f.seek(base_header_size + i * file_entry_size, 0)
s = f.read(file_entry_size)
name, flen, file_key, offset, feunk1, feunk2, feunk3 = unpack("<128sI32sQIII", s)
key = bytes([int(i, 16) for i in "64 47 47 4B 58 4C 48 4C 75 43 4A 77 76 38 61 42 63 33 59 51 58 36 58 36 73 52 45 56 50 63 68 73".split(' ')])
final_key = xor(key, file_key)
xored = xor(name, final_key)
name = xored.split(b'\x00')[0]
file_entries.append({'name':name, 'len':flen, 'offset':offset, 'key':final_key})
for i, fe in enumerate(file_entries):
name, flen, offset, key = fe['name'], fe['len'], fe['offset'], fe['key']
base, fname = os.path.split(name)
base = b"." + base
print(name)
if not os.path.exists(base):
os.makedirs(base)
with open(b'.'+ name, 'wb') as out:
out.write(xor(f.read(flen), key))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment