Browse Source

optimize

pull/3/head
Nzix 6 years ago
parent
commit
264640c76d
  1. 36
      ncmdump.py

36
ncmdump.py

@ -29,13 +29,8 @@ def dump(file_path):
key_length = f.read(4) key_length = f.read(4)
key_length = struct.unpack('<I', bytes(key_length))[0] key_length = struct.unpack('<I', bytes(key_length))[0]
key_data = f.read(key_length) key_data = bytearray(f.read(key_length))
key_data_array = bytearray(key_data) key_data = bytes(bytearray([byte ^ 0x64 for byte in key_data]))
i = 0
while i < len(key_data_array):
key_data_array[i] ^= 0x64
i += 1
key_data = bytes(key_data_array)
cryptor = AES.new(core_key, AES.MODE_ECB) cryptor = AES.new(core_key, AES.MODE_ECB)
key_data = unpad(cryptor.decrypt(key_data))[17:] key_data = unpad(cryptor.decrypt(key_data))[17:]
@ -44,31 +39,18 @@ def dump(file_path):
# key box # key box
key_data = bytearray(key_data) key_data = bytearray(key_data)
key_box = bytearray(range(256)) key_box = bytearray(range(256))
c = 0 j = 0
last_byte = 0
key_offset = 0
for i in range(256): for i in range(256):
swap = key_box[i] j = (key_box[i] + j + key_data[i % key_length]) & 0xff
c = (swap + last_byte + key_data[key_offset]) & 0xff key_box[i], key_box[j] = key_box[j], key_box[i]
key_offset += 1
if key_offset >= key_length:
key_offset = 0
key_box[i] = key_box[c]
key_box[c] = swap
last_byte = c
# meta data # meta data
meta_length = f.read(4) meta_length = f.read(4)
meta_length = struct.unpack('<I', bytes(meta_length))[0] meta_length = struct.unpack('<I', bytes(meta_length))[0]
meta_data = f.read(meta_length) meta_data = bytearray(f.read(meta_length))
meta_data_array = bytearray(meta_data) meta_data = bytes(bytearray([byte ^ 0x63 for byte in meta_data]))
i = 0
while i < len(meta_data_array):
meta_data_array[i] ^= 0x63
i += 1
meta_data = bytes(meta_data_array)
meta_data = base64.b64decode(meta_data[22:]) meta_data = base64.b64decode(meta_data[22:])
cryptor = AES.new(meta_key, AES.MODE_ECB) cryptor = AES.new(meta_key, AES.MODE_ECB)
@ -86,7 +68,7 @@ def dump(file_path):
image_data = f.read(image_size) image_data = f.read(image_size)
# media data # media data
file_name = meta_data['musicName'] + '.' + meta_data['format'] file_name = meta_data['artist'][0][0] + ' - ' + meta_data['musicName'] + '.' + meta_data['format']
m = open(os.path.join(os.path.split(file_path)[0],file_name),'wb') m = open(os.path.join(os.path.split(file_path)[0],file_name),'wb')
chunk = bytearray() chunk = bytearray()
@ -97,7 +79,7 @@ def dump(file_path):
break break
for i in range(chunk_length): for i in range(chunk_length):
j = (i + 1) & 0xff; j = (i + 1) & 0xff
chunk[i] ^= key_box[(key_box[j] + key_box[(key_box[j] + j) & 0xff]) & 0xff] chunk[i] ^= key_box[(key_box[j] + key_box[(key_box[j] + j) & 0xff]) & 0xff]
m.write(chunk) m.write(chunk)

Loading…
Cancel
Save