diff --git a/XenonUtils/xex.cpp b/XenonUtils/xex.cpp index d1972c0..ac2a7d9 100644 --- a/XenonUtils/xex.cpp +++ b/XenonUtils/xex.cpp @@ -126,7 +126,8 @@ Image Xex2LoadImage(const uint8_t* data, size_t dataSize) { auto* header = reinterpret_cast(data); auto* security = reinterpret_cast(data + header->securityOffset); - const auto* fileFormatInfo = reinterpret_cast(getOptHeaderPtr(data, XEX_HEADER_FILE_FORMAT_INFO)); + const auto* fileFormatInfo = static_cast(getOptHeaderPtr(data, XEX_HEADER_FILE_FORMAT_INFO)); + const auto* execInfo = static_cast(getOptHeaderPtr(data, XEX_HEADER_EXECUTION_INFO)); Image image{}; std::unique_ptr result{}; @@ -147,7 +148,11 @@ Image Xex2LoadImage(const uint8_t* data, size_t dataSize) uint8_t decryptedKey[KeySize]; memcpy(decryptedKey, security->aesKey, KeySize); - AES_init_ctx_iv(&aesContext, Xex2RetailKey, AESBlankIV); + if (!execInfo || !execInfo->titleId) { + AES_init_ctx_iv(&aesContext, Xex2DevkitKey, AESBlankIV); + } else { + AES_init_ctx_iv(&aesContext, Xex2RetailKey, AESBlankIV); + } AES_CBC_decrypt_buffer(&aesContext, decryptedKey, KeySize); decryptedData = std::make_unique(dataSize - header->headerSize); diff --git a/XenonUtils/xex.h b/XenonUtils/xex.h index 9ab831e..2da0b96 100644 --- a/XenonUtils/xex.h +++ b/XenonUtils/xex.h @@ -3,6 +3,7 @@ #include "xbox.h" inline constexpr uint8_t Xex2RetailKey[16] = { 0x20, 0xB1, 0x85, 0xA5, 0x9D, 0x28, 0xFD, 0xC3, 0x40, 0x58, 0x3F, 0xBB, 0x08, 0x96, 0xBF, 0x91 }; +inline constexpr uint8_t Xex2DevkitKey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; inline constexpr uint8_t AESBlankIV[16] = {}; enum Xex2ModuleFlags @@ -186,6 +187,19 @@ struct Xex2OptFileFormatInfo be compressionType; }; +struct Xex2OptExecutionInfo +{ + be mediaId; + be version; + be versionBase; + be titleId; + uint8_t platform; + uint8_t executableTable; + uint8_t discNumber; + uint8_t discTotal; + be savedGameId; +}; + struct Xex2ImportHeader { be sizeOfHeader;