Browse Source

much faster :)

pull/16/head
Nzix 6 years ago
parent
commit
abf63a166d
  1. 30
      ncmdump.py

30
ncmdump.py

@ -11,6 +11,7 @@ import base64
import json import json
import os import os
from Crypto.Cipher import AES from Crypto.Cipher import AES
from Crypto.Util.strxor import strxor as XOR
from mutagen import mp3, flac, id3 from mutagen import mp3, flac, id3
def dump(input_path, output_path = None, skip = True): def dump(input_path, output_path = None, skip = True):
@ -20,7 +21,7 @@ def dump(input_path, output_path = None, skip = True):
meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728') meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728')
unpad = lambda s : s[0:-(s[-1] if type(s[-1]) == int else ord(s[-1]))] unpad = lambda s : s[0:-(s[-1] if type(s[-1]) == int else ord(s[-1]))]
f = open(input_path,'rb') f = open(input_path, 'rb')
# magic header # magic header
header = f.read(8) header = f.read(8)
@ -44,7 +45,7 @@ def dump(input_path, output_path = None, skip = True):
j = 0 j = 0
for i in range(256): for i in range(256):
j = (j + S[i] + key[i % key_length]) % 256 j = (j + S[i] + key[i % key_length]) & 0xFF
S[i], S[j] = S[j], S[i] S[i], S[j] = S[j], S[i]
# meta data # meta data
@ -72,21 +73,26 @@ def dump(input_path, output_path = None, skip = True):
# media data # media data
output_path = output_path(input_path, meta_data) output_path = output_path(input_path, meta_data)
if skip and os.path.exists(output_path): return if skip and os.path.exists(output_path): return
m = open(output_path,'wb')
data = bytearray(f.read()) data = bytearray(f.read())
f.close()
# stream cipher (modified RC4 Pseudo-random generation algorithm) # stream cipher (modified RC4 Pseudo-random generation algorithm)
i = 0 # i = 0
j = 0 # j = 0
for k, _ in enumerate(data): # for k, _ in enumerate(data):
i = (i + 1) % 256 # i = (i + 1) % 256
j = (i + S[i]) % 256 # in RC4, is j = (j + S[i]) % 256 # j = (i + S[i]) % 256 # in RC4, is j = (j + S[i]) % 256
# S[i], S[j] = S[j], S[i] # no swapping # # S[i], S[j] = S[j], S[i] # no swapping
data[k] ^= S[(S[i] + S[j]) % 256] # data[k] ^= S[(S[i] + S[j]) % 256]
stream = [S[(S[i] + S[(i + S[i]) & 0xFF]) & 0xFF] for i in range(256)]
stream = bytearray(stream * (len(data) // 256 + 1))[1:1 + len(data)]
data = XOR(data, stream)
m = open(output_path, 'wb')
m.write(data) m.write(data)
m.close() m.close()
f.close()
# media tag # media tag
if meta_data['format'] == 'flac': if meta_data['format'] == 'flac':

Loading…
Cancel
Save