Skip to content

Instantly share code, notes, and snippets.

@symant233
Last active October 11, 2023 10:47
Show Gist options
  • Save symant233/74c14d6a01a4d4c078659a4e9c54aab9 to your computer and use it in GitHub Desktop.
Save symant233/74c14d6a01a4d4c078659a4e9c54aab9 to your computer and use it in GitHub Desktop.
PRGMV decryptor by unkonw
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)
with open('exploit.txt','w+') as file:
file.write(str(sys.argv))
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)
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment