diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb index bb67e85..b95690b 100644 Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.ncb differ diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo index 0fc635e..82bf2fa 100644 Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL.suo differ diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm index a99f3e2..0b52b1a 100644 Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Debug/BuildLog.htm differ diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm index 87bd6ba..c9277d6 100644 Binary files a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm and b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/Release/BuildLog.htm differ diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp index 82503a5..4902833 100644 --- a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp +++ b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.cpp @@ -56,14 +56,15 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename ) (void)fseek( fp, 0, SEEK_SET ); // ROMヘッダはsrlの先頭から // 1バイトをsizeof(~)だけリード (逆だと返り値がsizeof(~)にならないので注意) - if( fread( (void*)(this->pRomHeader), 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) + ROM_Header tmprh; + if( fread( (void*)&tmprh, 1, sizeof(ROM_Header), fp ) != sizeof(ROM_Header) ) { return (ECSrlResult::ERROR_FILE_READ); } #ifdef METWL_WHETHER_SIGN_DECRYPT // まず署名チェック - r = this->decryptRomHeader(); + r = this->decryptRomHeader( &tmprh ); if( r != ECSrlResult::NOERROR ) { (void)fclose(fp); @@ -71,6 +72,10 @@ ECSrlResult RCSrl::readFromFile( System::String ^filename ) } #endif //#ifdef METWL_WHETHER_SIGN_DECRYPT + // 署名チェックを通ってからフィールドのROMヘッダにコピー + // (そうしないと不正SRLを読み込んだときにROMヘッダが上書きされてしまう) + memcpy( this->pRomHeader, &tmprh, sizeof(ROM_Header) ); + { // ファイルを閉じる前にROMヘッダ以外の領域から設定を取り出す (void)this->hasDSDLPlaySign( fp ); @@ -687,13 +692,12 @@ ECSrlResult RCSrl::signRomHeader(void) // // ROMヘッダの署名を外す // -ECSrlResult RCSrl::decryptRomHeader(void) +ECSrlResult RCSrl::decryptRomHeader( ROM_Header *prh ) { u8 original[ RSA_KEY_LENGTH ]; // 署名外した後のデータ格納先 s32 pos = 0; // ブロックの先頭アドレス u8 digest[ DIGEST_SIZE_SHA1 ]; // ROMヘッダのダイジェスト u8 *publicKey = (u8*)g_devPubKey_DER; - ROM_Header rh; // <データの流れ> // (1) 公開鍵で復号した結果(ブロック)をローカル変数(original)に格納 @@ -730,7 +734,7 @@ ECSrlResult RCSrl::decryptRomHeader(void) #endif //METWL_VER_APPTYPE_USER // 署名の解除 = 公開鍵で復号 - if( !ACSign_Decrypto( original, publicKey, this->pRomHeader->signature, RSA_KEY_LENGTH ) ) + if( !ACSign_Decrypto( original, publicKey, prh->signature, RSA_KEY_LENGTH ) ) { return ECSrlResult::ERROR_SIGN_DECRYPT; } @@ -745,8 +749,8 @@ ECSrlResult RCSrl::decryptRomHeader(void) } // ベリファイ // ROMヘッダのダイジェストを算出(先頭から証明書領域の直前までが対象) - ACSign_DigestUnit( digest, this->pRomHeader, (u32)&(rh.certificate) - (u32)&(rh) ); - // this->pRomHeader はマネージヒープ上にあるので実アドレスを取得できない + ROM_Header tmprh; // マネージヒープ上にある場合実アドレスを取得できないのでサイズ計算用のROMヘッダを用意 + ACSign_DigestUnit( digest, prh, (u32)&(tmprh.certificate) - (u32)&(tmprh) ); if( memcmp( &(original[pos+1]), digest, DIGEST_SIZE_SHA1 ) != 0 ) { return ECSrlResult::ERROR_SIGN_VERIFY; diff --git a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h index 1519e9f..61cff12 100644 --- a/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h +++ b/build/tools/MasterEditor/MasterEditorTWL/MasterEditorTWL/srl.h @@ -372,9 +372,9 @@ namespace MasterEditorTWL void setRatingRomHeader( u32 region ); // ROMヘッダにフィールドの値を反映させる // ROMヘッダの更新 - ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算 - ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名 - ECSrlResult decryptRomHeader(void); // ROMヘッダの署名を外す + ECSrlResult calcRomHeaderCRC(void); // ROMヘッダのCRCを再計算 + ECSrlResult signRomHeader(void); // ROMヘッダ更新後の再署名 + ECSrlResult decryptRomHeader( ROM_Header *prh ); // ROMヘッダの署名を外す // SRLバイナリから特殊な設定を調べる ECSrlResult hasDSDLPlaySign( FILE *fp ); diff --git a/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml b/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml index 6e04fb4..335f3f5 100644 --- a/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml +++ b/build/tools/MasterEditor/MasterEditorTWL/resource/sheet_templete.xml @@ -69,28 +69,6 @@ - - + +