appo icon

rpgmvp, rpgmvo , rpgmvm , rpgmvw (decoder decrypter unpaker)

appo | PRO | 12/31/16 09:38:18 PM UTC | 0 ⭐ | 38244 👁️ | Never ⏰ | []
Python |

2.19 KB

|

None

|

0 👍

/

0 👎

#!/usr/bin/env python3
 
import glob
import json
import sys
import shutil
import os
 
#this might change, not sure, but probably not since 16 is a great number
HEADER_LENGTH = 16
 
def decrypt_image(enc_png, key, path):
    print("Decrypting %s" % enc_png)
    dec_name = os.path.splitext(os.path.basename(enc_png))[0] + ".png"
    dec_data = decrypt_generic(enc_png, key)
    dec_file = open(os.path.join(path, "dump/img", dec_name), 'wb')
    dec_file.write(dec_data)
    dec_file.close()
 
def decrypt_audio(enc_ogg, key, path):
    print("Decrypting %s" % enc_ogg)
    dec_name = os.path.splitext(os.path.basename(enc_ogg))[0] + ".ogg"
    dec_data = decrypt_generic(enc_ogg, key)
    dec_file = open(os.path.join(path, "dump/audio", dec_name), 'wb')
    dec_file.write(dec_data)
    dec_file.close()
 
def decrypt_generic(file_name, key):
    enc_data = bytearray(open(file_name, 'rb').read())
    dec_data = enc_data[16:]
    for i in range(0, HEADER_LENGTH):
        dec_data[i] ^= key[i]
    return dec_data
 
if __name__ == "__main__":
    if len(sys.argv) == 1:
        print("Please supply path to Game.exe(s) to unpack")
        sys.exit(1)
 
    for i in range(1, len(sys.argv)):
        if os.path.basename(sys.argv[i]) != 'Game.exe':
            print("Please supply path to Game.exe(s) to unpack")
            sys.exit(1)
 
    for i in range(1, len(sys.argv)):
        game_path = os.path.dirname(sys.argv[i])
        sysjson_p = open(os.path.join(game_path, "www/data/System.json"), 'r')
        sysjson = json.loads(sysjson_p.read())
        enc_key = sysjson['encryptionKey']
        enc_key = bytearray.fromhex(enc_key)
        sys.stdout.write(enc_key)
        has_images = sysjson['hasEncryptedImages']
        has_audio = sysjson['hasEncryptedAudio']
        sysjson_p.close()
 
        if os.path.exists(os.path.join(game_path, "dump")):
            shutil.rmtree(os.path.join(game_path, "dump"))
 
        os.mkdir(os.path.join(game_path, "dump"))
 
        if has_images:
            os.mkdir(os.path.join(game_path, "dump/img"))
            for enc_png in glob.iglob(os.path.join(game_path, "www/img/**/*.rpgmvp")):
                decrypt_image(enc_png, enc_key, game_path)
        if has_audio:
            os.mkdir(os.path.join(game_path, "dump/audio"))
            for enc_ogg in glob.iglob(os.path.join(game_path, "www/audio/**/*.rpgmvo")):
                decrypt_audio(enc_ogg, enc_key, game_path)

Comments