diff --git a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c index c0590710..18ac209d 100644 --- a/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c +++ b/build/libraries_sysmenu/ds/common/src/ds_wlpatch.c @@ -32,7 +32,6 @@ #define PATCH3_OFFSET_IN_PATTERN 0x04 // function's prototype------------------------------------------------- -static int DSi_ExistNitroCard(void); static void* DSi_GetPatchBaseAddr( void ); static BOOL DSi_IsPatchedSDKVersion( void ); static u32 DSi_SearchBinaryCore( const u32 *patp, int pat_word_size, int patch_offset ); @@ -283,44 +282,3 @@ asm void DSi_CopyWLPatch( void ) (u8 *)(destp), \ ( DMA_SRC_INC | ( (size)/(32/8) & 0x1fffff ) ) ) */ - -// クローンブート判定 -void DS_CheckROMCloneBoot( void ) -{ - s32 lockCardID; - u8 *buffp = (u8 *)&mbSignBuf; - u32 auth_offset = dh->s.rom_valid_size ? dh->s.rom_valid_size : 0x01000000; - u32 page_offset = auth_offset & 0xFFFFFE00; - - if( !DSi_ExistNitroCard() ) { - return; - } - - if ((lockCardID = OS_GetLockID()) > 0) { - (void)OS_LockCard( (u16 )lockCardID ); -// DC_FlushRange( buffp, sizeof(mbSignBuf) ); -// IPL2_ReadCard( (void *)page_offset, buffp, sizeof(mbSignBuf) ); - (void)OS_UnLockCard( (u16 )lockCardID ); - OS_ReleaseLockID( (u16 )lockCardID ); - } - - buffp += auth_offset & 0x000001FF; - if( *buffp++ == 'a' && *buffp == 'c' ) { - SYSMi_GetWork()->cloneBootMode = SYSM_CLONE_BOOT_MODE; - }else { - SYSMi_GetWork()->cloneBootMode = SYSM_OTHER_BOOT_MODE; - } -} - -// NITROカード存在チェック 「リターン 1:カード認識 0:カードなし」 -static int DSi_ExistNitroCard(void) -{ - if((dh->s.nintendo_logo_crc16 == 0xcf56) - &&(dh->s.header_crc16 == SYSMi_GetWork()->cardHeaderCrc16)) { - return TRUE; // NITROカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合) - // ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。 - }else { - return FALSE; // NITROカードなし - } -} - diff --git a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h index 7c91ac3a..97756aaf 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h +++ b/build/libraries_sysmenu/hotsw/ARM7/include/hotswTypes.h @@ -239,7 +239,8 @@ typedef enum HotSwState{ HOTSW_TIME_OUT, HOTSW_CARD_LOCK_ERROR, HOTSW_CRC_CHECK_ERROR, - HOTSW_HASH_CHECK_ERROR, + HOWSW_REGION_CHECK_ERROR, + HOTSW_HASH_CHECK_ERROR, HOTSW_ID_CHECK_ERROR, HOTSW_PULLED_OUT_ERROR, HOTSW_DATA_DECRYPT_ERROR, diff --git a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c index 1f161313..8710fad9 100644 --- a/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c +++ b/build/libraries_sysmenu/hotsw/ARM7/src/hotsw.c @@ -404,16 +404,18 @@ static HotSwState LoadCardData(void) } SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam; - // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 - SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); - OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n", - SYSMi_GetWork()->cardHeaderCrc16_bak, s_cbData.pBootSegBuf->rh.s.header_crc16 ); - - if( ( SYSMi_GetWork()->cardHeaderCrc16_bak != s_cbData.pBootSegBuf->rh.s.header_crc16 ) || - ( 0xcf56 != s_cbData.pBootSegBuf->rh.s.nintendo_logo_crc16 ) ){ - retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; - } - + + + // CRCチェック + if( !UTL_CheckAppCRC16( &s_cbData.pBootSegBuf->rh.s ) ) { + retval = (retval == HOTSW_SUCCESS) ? HOTSW_CRC_CHECK_ERROR : retval; + } + + // リージョンチェック + if( !UTL_CheckAppRegion( s_cbData.pBootSegBuf->rh.s.card_region_bitmap ) ) { + retval = (retval == HOTSW_SUCCESS) ? HOWSW_REGION_CHECK_ERROR : retval; + } + // アプリジャンプのデバッグ時にROMエミュレーション情報だけ必要な場合 if(SYSMi_GetWork()->flags.hotsw.isLoadRomEmuOnly){ SYSMi_GetWork()->flags.hotsw.isExistCard = TRUE; @@ -2382,6 +2384,10 @@ static void DebugPrintErrorMessage(HotSwState state) OS_PutString(" - Error 3 : CRC Check\n"); break; + case HOWSW_REGION_CHECK_ERROR: + OS_PutString(" - Error 3 : Region Check\n"); + break; + case HOTSW_HASH_CHECK_ERROR: OS_PutString(" - Error 4 : Hash Check\n"); break; diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 62c1b1eb..cc0a11f2 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -34,7 +34,6 @@ static void SYSMi_CopyLCFGDataSettings( void ); static TitleProperty *SYSMi_CheckDebuggerBannerViewModeBoot( void ); static TitleProperty *SYSMi_CheckShortcutBoot1( void ); static TitleProperty *SYSMi_CheckShortcutBoot2( void ); -static void SYSMi_CheckCardCloneBoot( void ); void SYSMi_SendKeysToARM7( void ); static OSTitleId SYSMi_getTitleIdOfMachineSettings( void ); @@ -556,26 +555,6 @@ static TitleProperty *SYSMi_CheckShortcutBoot2( void ) } -// クローンブート判定 -static void SYSMi_CheckCardCloneBoot( void ) -{ -#if 0 - u8 *buffp = (u8 *)&pTempBuffer; - u32 total_rom_size = SYSM_GetCardRomHeader()->rom_valid_size ? SYSM_GetCardRomHeader()->rom_valid_size : 0x01000000; - u32 file_offset = total_rom_size & 0xFFFFFE00; - - DC_FlushRange( buffp, BNR_IMAGE_SIZE ); - CARD_ReadRom( 4, (void *)file_offset, buffp, BNR_IMAGE_SIZE ); - - buffp += total_rom_size & 0x000001FF; - if( *buffp++ == 'a' && *buffp == 'c' ) { - SYSMi_GetWork()->flags.common.cloneBootMode = CLONE_BOOT_MODE; - }else { - SYSMi_GetWork()->flags.common.cloneBootMode = OTHER_BOOT_MODE; - } -#endif -} - // NAM_Initされるようになったので、NAMで本体設定のID取得 // それらしきものがインストールされていない場合は0(NULL)をリターン static OSTitleId SYSMi_getTitleIdOfMachineSettings( void ) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index 44e982db..792654a2 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -281,9 +281,6 @@ TitleProperty *SYSM_GetCardTitleList( BOOL *changed ) // ロード開始していたら、もうヘッダやタイトル情報は変更しない return pTitleList_Card; } - // [TODO:] ROMヘッダの platform_code がNTR,TWL-HYB,TWL-LTD以外のもの - // region_codeが本体情報と違うもの - // の場合は、正常に認識できないタイトルであることを示す。 if( SYSMi_GetWork()->flags.hotsw.isCardStateChanged ) { u16 id = (u16)OS_GetLockID(); @@ -335,7 +332,6 @@ BOOL SYSMi_CopyCardRomHeader( void ) // ROMヘッダのリード DC_InvalidateRange( (void *)SYSM_CARD_ROM_HEADER_BAK, SYSM_APP_ROM_HEADER_SIZE ); // キャッシュケア MI_CpuCopyFast( (void *)SYSM_CARD_ROM_HEADER_BAK, (void *)SYSM_APP_ROM_HEADER_BUF, SYSM_APP_ROM_HEADER_SIZE ); // ROMヘッダコピー - SYSMi_GetWork()->cardHeaderCrc16 = SYSMi_GetWork()->cardHeaderCrc16_bak; // ROMヘッダCRCコピー retval = TRUE; } diff --git a/build/libraries_sysmenu/sysmenu/common/src/status.c b/build/libraries_sysmenu/sysmenu/common/src/status.c index f2f3f1f9..17a48c24 100644 --- a/build/libraries_sysmenu/sysmenu/common/src/status.c +++ b/build/libraries_sysmenu/sysmenu/common/src/status.c @@ -22,7 +22,6 @@ // define data----------------------------------------------------------------- // extern data----------------------------------------------------------------- // function's prototype------------------------------------------------------- -static int SYSMi_IsValidCard( void ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- // const data------------------------------------------------------------------ @@ -68,7 +67,7 @@ BOOL SYSMi_IsDebuggerBannerViewMode( void ) { #if 0 return ( SYSM_IsRunOnDebugger() && - SYSMi_IsValidCard() && + SYSMi_IsExistCard() && SYSM_GetCardRomHeader()->dbgRomSize == 0 ) ? TRUE : FALSE; #else return FALSE; @@ -120,19 +119,6 @@ BOOL SYSM_IsNTRCard( void ) } -// NTR,TWLカード存在チェック 「リターン 1:カード認識 0:カードなし」 -static int SYSMi_IsValidCard( void ) -{ - if( ( SYSM_GetCardRomHeader()->nintendo_logo_crc16 == 0xcf56 ) && - ( SYSM_GetCardRomHeader()->header_crc16 == SYSMi_GetWork()->cardHeaderCrc16 ) ) { - return TRUE; // NTR,TWLカードあり(NintendoロゴCRC、カードヘッダCRCが正しい場合) - // ※Nintendoロゴデータのチェックは、特許の都合上、ロゴ表示ルーチン起動後に行います。 - }else { - return FALSE; // NTR,TWLカードなし - } -} - - // エントリアドレスの正当性チェック BOOL SYSMi_CheckEntryAddress( void ) { diff --git a/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c b/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c index 4d5136b2..5fd9bc38 100644 --- a/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c +++ b/build/libraries_sysmenu/util/ARM9/src/util_menuAppManager.c @@ -477,6 +477,18 @@ static void AMNi_getAndAddNandTitleData( NAMTitleId titleID, BOOL readShowData ) return; } + // ROMヘッダのリージョンチェックとCRCチェックを行い、不正なアプリは無視する。 + if( !UTL_CheckAppRegion( s_AllRomHeaderArray[rhArrayLen].card_region_bitmap ) ) { + OS_TPrintf( "Region Check NG : %llx\n", titleID ); + FS_CloseFile(file); + return; + } + if( !UTL_CheckAppCRC16( &s_AllRomHeaderArray[rhArrayLen] ) ) { + OS_TPrintf( "CRC16 Check NG : %llx\n", titleID ); + FS_CloseFile(file); + return; + } + sNandAppRomHeaderArrayLength++; // もうランチャー表示用情報は数がオーバーしてるか、表示用情報を読まない設定 diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index e181c924..f509b058 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -22,6 +22,7 @@ SUBDIRS = \ ../../../libraries_sysmenu/sysmenu \ ../../../libraries_sysmenu/boot \ ../../../libraries_sysmenu/hotsw \ + ../../../libraries_sysmenu/util \ # ../../../libraries_sysmenu/sharedFont \ # ../../../libraries_sysmenu/reloc_info \ # ../../../libraries_sysmenu/mcu \ diff --git a/docs/format_TitleID.xls b/docs/format_TitleID.xls index d7622bac..668897ba 100644 Binary files a/docs/format_TitleID.xls and b/docs/format_TitleID.xls differ diff --git a/docs/繝ェ繝ェ繝シ繧ケ_SDK_5_0_RC/TwlSDK 5.0 rc 繧ソ繧ケ繧ッ.mmap b/docs/繝ェ繝ェ繝シ繧ケ_SDK_5_0_RC/TwlSDK 5.0 rc 繧ソ繧ケ繧ッ.mmap index 05980fe1..8cc0c64d 100644 Binary files a/docs/繝ェ繝ェ繝シ繧ケ_SDK_5_0_RC/TwlSDK 5.0 rc 繧ソ繧ケ繧ッ.mmap and b/docs/繝ェ繝ェ繝シ繧ケ_SDK_5_0_RC/TwlSDK 5.0 rc 繧ソ繧ケ繧ッ.mmap differ diff --git a/docs/骰オ邂。逅.xls b/docs/骰オ邂。逅.xls index 1991f315..e8f78f33 100644 Binary files a/docs/骰オ邂。逅.xls and b/docs/骰オ邂。逅.xls differ diff --git a/include/sysmenu/ds/common/ds.h b/include/sysmenu/ds/common/ds.h index 64693a01..479fe350 100644 --- a/include/sysmenu/ds/common/ds.h +++ b/include/sysmenu/ds/common/ds.h @@ -29,7 +29,6 @@ extern "C" { #define DS_WLPATCH_COPYCODE_SIZE (10*4) void DS_InsertWLPatch( void* romHeaderNTR ); -void DS_CheckROMCloneBoot( void ); #ifdef __cplusplus diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 0e0469d9..8d25f32b 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -122,9 +122,6 @@ typedef struct SYSM_work { }hotsw; }flags; // 8B - u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16(ARM9側でコピーして使用する側) - u16 cardHeaderCrc16_bak; // カード検出時に算出したROMヘッダCRC16(ARM7側ライブラリでダイレクトに書き換わる側) - OSLockWord lockCardRsc ATTRIBUTE_ALIGN(8); // カードリソース排他制御用 OSLockWord lockHotSW; // カードリソース排他制御用 u32 appCardID; // カードID diff --git a/include/sysmenu/util.h b/include/sysmenu/util.h index df636827..b56d8f5d 100644 --- a/include/sysmenu/util.h +++ b/include/sysmenu/util.h @@ -119,6 +119,24 @@ extern void UTL_SetFatalError( FatalErrorCode error ); // FATAL extern u64 UTL_GetFatalError( void ); // FATALエラー状態の取得(FatalErrorCodeをビットに割り当てて格納しています。) +// リージョンチェック +static inline BOOL UTL_CheckAppRegion( u32 card_region_bitmap ) +{ + return ( card_region_bitmap & ( 0x00000001 << OS_GetRegion() ) ) ? TRUE : FALSE; +} + +// CRCチェック +static BOOL UTL_CheckAppCRC16( ROM_Header_Short *pROMH ) +{ + u16 calc_crc = SVC_GetCRC16( 65535, pROMH, 0x015e ); + if( ( calc_crc != pROMH->header_crc16 ) || + ( 0xcf56 != pROMH->nintendo_logo_crc16 ) ){ + return FALSE; + } + return TRUE; +} + + #ifdef __cplusplus } #endif diff --git a/include/sysmenu/util_menuAppManager.h b/include/sysmenu/util_menuAppManager.h index 2e1a89be..42fa2bba 100644 --- a/include/sysmenu/util_menuAppManager.h +++ b/include/sysmenu/util_menuAppManager.h @@ -25,6 +25,7 @@ #include <../build/libraries/os/common/include/application_jump_private.h> #include +#include typedef struct AMNBannerCounter {