diff --git a/RomHeader/0DTA/libsyscall.a b/RomHeader/0DTA/libsyscall.a new file mode 100644 index 00000000..11de5155 Binary files /dev/null and b/RomHeader/0DTA/libsyscall.a differ diff --git a/RomHeader/0DTA/libsyscall_c.bin b/RomHeader/0DTA/libsyscall_c.bin new file mode 100644 index 00000000..b9e55bc1 Binary files /dev/null and b/RomHeader/0DTA/libsyscall_c.bin differ diff --git a/RomHeader/0DTA/rom_header_0dta.template.sbin b/RomHeader/0DTA/rom_header_0dta.template.sbin new file mode 100644 index 00000000..245475a6 Binary files /dev/null and b/RomHeader/0DTA/rom_header_0dta.template.sbin differ diff --git a/build/tests/HashCheckTemplate/ARM9/Makefile b/build/tests/HashCheckTemplate/ARM9/Makefile index b5f7047a..62b8a859 100644 --- a/build/tests/HashCheckTemplate/ARM9/Makefile +++ b/build/tests/HashCheckTemplate/ARM9/Makefile @@ -29,9 +29,11 @@ TWL_ARCHGEN = LIMITED TARGET_NAME = HashCheckTemplate TARGET_BIN = $(TARGET_NAME).tad -TITLEID_LO = CTMP +TITLEID_LO = 0DTA ROM_SPEC = main.rsf +ROM_HEADER_TEMPLATE = $(SYSMENU_ROM_HEADER_DIR)/$(TITLEID_LO)/rom_header_$(call toLower,$(TITLEID_LO)).template.sbin +LIBSYSCALL = $(SYSMENU_ROM_HEADER_DIR)/$(TITLEID_LO)/libsyscall.a MISC_DIR = $(SYSMENU_ROOT)/build/systemMenu_RED/misc @@ -40,10 +42,20 @@ SRCS = main.c HashCheckTemplate.c \ LINCLUDES = $(MISC_DIR)/include -MAKEROM_FLAGS += -F -DTITLEID_LO='$(TITLEID_LO)' +MAKEROM_FLAGS += -F -DTITLEID_LO='$(TITLEID_LO)' \ + -DROM_HEADER_TEMPLATE='$(call empath,$(ROM_HEADER_TEMPLATE))' + +#デバッグ用パラメータ追加 +MAKEROM_FLAGS += -DSYSCALL_C='$(call empath,$(LIBSYSCALL:.a=_c.bin))' \ + -DARM9FLX_EXPAND=0x27c000 \ + -DARM7FLX_EXPAND=0x40000 \ + -DARM9LTD_EXPAND=0x280000 \ + -DARM7LTD_EXPAND=0x108000 include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs +MAKEROM = $(TWL_TOOLSDIR)/bin/makerom.TWL.DEBUG.exe + DEFAULT_COMP_ARM7 = racoon_hct DEFAULT_MAKEROM_ARM7_BASE = ../ARM7/bin/$(TWL_BUILDTYPE_ARM7)/$(DEFAULT_COMP_ARM7) DEFAULT_MAKEROM_ARM7 = $(DEFAULT_MAKEROM_ARM7_BASE).$(TWL_ELF_EXT) diff --git a/build/tests/HashCheckTemplate/ARM9/main.rsf b/build/tests/HashCheckTemplate/ARM9/main.rsf index 82ee6f38..8f742b9a 100644 --- a/build/tests/HashCheckTemplate/ARM9/main.rsf +++ b/build/tests/HashCheckTemplate/ARM9/main.rsf @@ -89,7 +89,7 @@ Property # # ROM HEADER TEMPLATE: Provided to every product by NINTENDO # - #RomHeaderTemplate ./etc/rom_header.template.sbin + RomHeaderTemplate $(ROM_HEADER_TEMPLATE) # # BANNER FILE: generated from Banner Spec File diff --git a/build/tests/HashCheckTemplate/ARM9/src/HashCheckTemplate.c b/build/tests/HashCheckTemplate/ARM9/src/HashCheckTemplate.c index daf4d241..3764fe64 100644 --- a/build/tests/HashCheckTemplate/ARM9/src/HashCheckTemplate.c +++ b/build/tests/HashCheckTemplate/ARM9/src/HashCheckTemplate.c @@ -48,6 +48,7 @@ static BOOL s_switch = TRUE; // 再配置チェッカー(多分ここからやる事は表示のみ) //====================================================== +/* static void draw_sub1(u8 *ram_addr, u8 *header_addr, int y) { int l; @@ -62,6 +63,7 @@ static void draw_sub1(u8 *ram_addr, u8 *header_addr, int y) } } } +*/ static void draw_sub2(u8 *ram_addr, u8 *header_addr, int y, const u16 *str) { @@ -95,8 +97,7 @@ static void draw() PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"SelfDigestChecker"); PutStringUTF16( 3 * 8, 1 * 12, TXT_COLOR_BLACK, (const u16 *)L"Press A to Check Digest...."); - draw_sub1((u8 *)0x02000100, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x300), 12*2+4 ); - + draw_sub2((u8 *)0x02000100, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x38c), 12*2+4, (const u16 *)L"ARM9FLX :" ); draw_sub2((u8 *)0x02000120, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x314), 12*5+8, (const u16 *)L"ARM7FLX :" ); draw_sub2((u8 *)0x02000140, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x350), 12*8+12, (const u16 *)L"ARM9LTD :" ); draw_sub2((u8 *)0x02000160, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x364), 12*11+16, (const u16 *)L"ARM7LTD :" ); diff --git a/build/tests/HashCheckTemplate/crt/ARM7/src/crt0_hct.LTD.c b/build/tests/HashCheckTemplate/crt/ARM7/src/crt0_hct.LTD.c index 880f1255..110841fd 100644 --- a/build/tests/HashCheckTemplate/crt/ARM7/src/crt0_hct.LTD.c +++ b/build/tests/HashCheckTemplate/crt/ARM7/src/crt0_hct.LTD.c @@ -337,36 +337,31 @@ _start(void) static void INITi_SetHMACSHA1ToAppParam(void) { - u32 *arm9_flx_addr = (u32 *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x028)); - u32 *p_arm9encryObjVerify = (u32 *)(DGT_TGT_ADDR + 4 * 32); - int l; SVCHMACSHA1Context *pCon = ( SVCHMACSHA1Context * ) (0x2000300 - sizeof(SVCHMACSHA1Context)); - //SVCHMACSHA1Context *pCon = &Con; - + ROM_Header_Short *pROMH = (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF; + u32 bak; + // arm9_flx - for( l=0; lmain_autoload_done; + *(u32 *)pROMH->main_autoload_done = 0xE12FFF1E; SVC_HMACSHA1Init(pCon, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1); - SVC_HMACSHA1Update(pCon, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x028)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x02c))); + SVC_HMACSHA1Update(pCon, pROMH->main_ram_address, pROMH->main_size); SVC_HMACSHA1GetHash(pCon, (void *)DGT_TGT_ADDR); + *(u32 *)pROMH->main_autoload_done = bak; // arm7_flx + bak = *(u32 *)pROMH->sub_autoload_done; + *(u32 *)pROMH->sub_autoload_done = 0xE12FFF1E; SVC_HMACSHA1Init(pCon, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1); - SVC_HMACSHA1Update(pCon, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x038)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x03c))); + SVC_HMACSHA1Update(pCon, pROMH->sub_ram_address, pROMH->sub_size); SVC_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 32)); + *(u32 *)pROMH->sub_autoload_done = bak; // arm9_ltd SVC_HMACSHA1Init(pCon, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1); - SVC_HMACSHA1Update(pCon, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1c8)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1cc))); + SVC_HMACSHA1Update(pCon, pROMH->main_ltd_ram_address, pROMH->main_ltd_size); SVC_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 2 * 32)); // arm7_ltd SVC_HMACSHA1Init(pCon, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1); - SVC_HMACSHA1Update(pCon, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1d8)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1dc))); + SVC_HMACSHA1Update(pCon, pROMH->sub_ltd_ram_address, pROMH->sub_ltd_size); SVC_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 3 * 32)); } diff --git a/build/tests/HashCheckTemplate/memo.txt b/build/tests/HashCheckTemplate/memo.txt index e8091d57..cf41343d 100644 --- a/build/tests/HashCheckTemplate/memo.txt +++ b/build/tests/HashCheckTemplate/memo.txt @@ -1,15 +1,49 @@ -【デバッガでうまく動かない】 -どうやらデバッガはコードにいろいろ埋めるらしいので、起動時には既にロード済みROMの内容が違うっぽい→SHA1計算アウト。 -単体ブートならOK。 +【ISデバッガがコードを変更する箇所】 +・ARM9.flx.static, ARM7.flx.static + _start_AutoloadDoneCallbackの先頭コードをISデバッガのモニタプログラムへの分岐に書き換えるので、 + ハッシュを正しく計算する場合は、そのアドレスのコードを元々の値である0xE12FFF1E(= BX LR)にアプリで書き換えてやる + 必要がある。 +・ブレークポイント設定箇所 + ブレークポイント設定箇所は、デバッガによって未定義命令が埋め込まれるので、ハッシュを正しく計算する場合は、全ての + ブレークポイントを無効にする必要がある。 -【暗号化領域】 -ARM9FLXの先頭0x800バイト(2kバイト)は暗号化されている(暗号化領域)。で、ランチャーがブート直前に暗号化を解除する。 +なお、これらは、単体ブートなら何もケアしなくてOK. + + + +【blowfish暗号化システムコール】 +ARM9FLXの先頭0x800バイト(2kバイト)はシステムコールが配置され、Blowfish暗号化されている(暗号化領域)。 +で、ランチャーがブート直前に暗号化を解除する。 ヘッダに埋め込まれているARM9FLXのハッシュは、暗号化された状態でのハッシュである。 HashCheckTemplateでARM9FLXのハッシュを計算する時点では、すでに暗号化が解除されているため、計算が合わない。 どうにかして解除前の暗号化領域を手に入れる必要がある。 -が、実はHashCheckTemplateでは、この領域を00で埋めれば計算が合う。 -HashCheckTemplateのようなテストプログラムでは、暗号化領域は00で埋められるためである。 -【暗号化領域が00であった事の確認】 -暗号解除時、先頭0x800バイトのうち先頭2バイトの暗号解除結果が"encryObj"でない場合は全体の暗号解除をせず、特殊処理として未定義命令コード(0xe7ffdeff)で埋められる。 -よって、暗号化領域に当たる部分が実行時に未定義命令コードで埋まってるのを確認すれば良い。 + +・ROMヘッダが"NTRJ"の場合 + アプリケーション上で上記暗号領域を00で埋めれば計算が合う。 + HashCheckTemplateのようなテストプログラムでは、暗号化領域は00で埋められるためである。 + <暗号化領域が00であった事の確認> + 1)暗号解除時、先頭0x800バイトのうち先頭2バイトの暗号解除結果が"encryObj"でない場合は全体の暗号解除をせず、特殊処理 +  として未定義命令コード(0xe7ffdeff)で埋められる。 +  よって、暗号化領域に当たる部分が実行時に未定義命令コードで埋まってるのを確認すれば良い。 + + 2)makerom特別版のmakerom.TWL.DEBUG.exe/makerom.TWL.sys.DEBUG.exe/makerom.TWL.secure.DEBUG.exeを使用する。(SDKに添付) +  このmakeromを使用して、MAKEROM_FLAGSで、-DSYSCALL_Cの指定をしなかった場合、ROMヘッダのnitro_whitelist_phase2_diegstに +  上記暗号領域を除いた状態のARM9.FLX.staticのハッシュ値が格納される。 + +・ROMヘッダが"NTRJ"以外の正式ROMヘッダを使用している場合 + makerom特別版のmakerom.TWL.DEBUG.exe/makerom.TWL.sys.DEBUG.exe/makerom.TWL.secure.DEBUG.exeを使用する。(SDKに添付) + このmakeromを使用して、MAKEROM_FLAGS += -DSYSCALL_C='hoge/libsyscall_c.bin'の形式で、正式版ROMヘッダに添付している + クローンブート用のデコード済みシステムコールバイナリを指定することで、ROMヘッダのnitro_whitelist_phase2_diegstに + 上記暗号領域をデコードした状態のARM9.FLX.staticのハッシュ値が格納される。 + + + +【staticサイズ拡張】 + makerom特別版のmakerom.TWL.DEBUG.exe/makerom.TWL.sys.DEBUG.exe/makerom.TWL.secure.DEBUG.exeを使用する。(SDKに添付) + MAKEROM_FLAGSに下記定義を追加することで、対象セグメントを指定サイズ分ランダム値で拡張できる。 + ARM9.FLX.static : -DARM9FLX_EXPAND=拡張サイズ (ランチャーで正常ブート可能 max サイズ = 0x27c000) + ARM7.FLX.static : -DARM7FLX_EXPAND=拡張サイズ (  〃           max サイズ = 0x40000) + ARM9.LTD.static : -DARM9LTD_EXPAND=拡張サイズ (  〃           max サイズ = 0x280000) + ARM7.LTD.static : -DARM7LTD_EXPAND=拡張サイズ (  〃           max サイズ = 0x108000) +