This commit is contained in:
Lillian Skinner 2023-12-10 21:03:31 -05:00 committed by GitHub
parent 99495f22f0
commit 57f5a6c07e

View File

@ -4,14 +4,9 @@ from binascii import hexlify, unhexlify
from Crypto.Cipher import AES #pip install pycryptodome
import sys
def generate_key(string):
key_hex = int(string, 16)
key_add = int(b"1" * 32, 16)
combine = key_hex + key_add
return unhexlify(b"%032X" % combine)
dsi_common_key = generate_key(b"9E0AE40596F6C109D934873DF3631750")
wii_debug_key = generate_key(b"904F39596012A4189D7ADB21B705EB99")
dsi_common_key = unhexlify(b"%032X" % 0xAF1BF516A807D21AEA45984F04742861) # DSi common key
debugger_common_key = unhexlify(b"%032X" % 0xA2FDDDF2E423574AE7ED8657B5AB19D3) # DSi debugger common key (used for `maketad.updater` TADs)
wii_debug_key = unhexlify(b"%032X" % 0xA1604A6A7123B529AE8BEC32C816FCAA) # Wii debug key
def align(val): #Tads have 64-byte alignment between sections
return val + (64 - (val % 64))
@ -75,6 +70,8 @@ with open(sys.argv[1], "rb") as f:
obj = AES.new(dsi_common_key, AES.MODE_CBC, title_id)
dsi_dec_title_key = obj.decrypt(enc_title_key)
obj = AES.new(debugger_common_key, AES.MODE_CBC, title_id)
debugger_dec_title_key = obj.decrypt(enc_title_key)
obj = AES.new(wii_debug_key, AES.MODE_CBC, title_id)
wii_dec_title_key = obj.decrypt(enc_title_key)
@ -95,6 +92,21 @@ with open(sys.argv[1], "rb") as f:
o.write(decrypted_content.read())
sys.exit(1)
obj = AES.new(debugger_dec_title_key, AES.MODE_CBC, b"\x00" * 16)
decrypted_content = BytesIO(obj.decrypt(content.read()))
content.seek(0)
decrypted_content.seek(0x15) #reserved bytes
if decrypted_content.read(7) == b"\x00" * 7: #this is an srl
decrypted_content.seek(0xC)
print("Debugger Common Key Used")
game_code = decrypted_content.read(6).decode("UTF-8") #for export filename
print("Game Code: %s" % game_code)
decrypted_content.seek(0)
print("Output file name: %s.srl" % game_code)
with open("%s.srl" % game_code, "wb") as o:
o.write(decrypted_content.read())
sys.exit(1)
obj = AES.new(wii_dec_title_key, AES.MODE_CBC, b"\x00" * 16)
decrypted_content = BytesIO(obj.decrypt(content.read()))
content.seek(0)
@ -110,4 +122,4 @@ with open(sys.argv[1], "rb") as f:
o.write(decrypted_content.read())
sys.exit(1)
raise BaseException("Was not able to decrypt the content, oops")
raise BaseException("Was not able to decrypt the content, oops")