diff --git a/build/tests/RelocateChecker/ARM7/hyena_rc.lsf b/build/tests/RelocateChecker/ARM7/hyena_rc.lsf index 1961d19c..f60809bd 100644 --- a/build/tests/RelocateChecker/ARM7/hyena_rc.lsf +++ b/build/tests/RelocateChecker/ARM7/hyena_rc.lsf @@ -22,6 +22,7 @@ Static $(TARGET_NAME) { Address $(ADDRESS_FLXMAIN) Library $(CRT0_O) \ + libmi_sp$(LIBSUFFIX).a \ libsyscall_sp.twl.a StackSize 1024 1024 } @@ -34,7 +35,6 @@ Autoload WRAM Library libsubpsyscall.a \ $(CW_LIBS) \ libos_sp$(LIBSUFFIX).a \ - libmi_sp$(LIBSUFFIX).a \ libpad_sp$(LIBSUFFIX).a \ libpxi_sp$(LIBSUFFIX).a \ libstd_sp$(LIBSUFFIX).a \ diff --git a/build/tests/RelocateChecker/ARM9/ARM9-TS.lsf b/build/tests/RelocateChecker/ARM9/ARM9-TS.lsf index eba30ab9..17f40824 100644 --- a/build/tests/RelocateChecker/ARM9/ARM9-TS.lsf +++ b/build/tests/RelocateChecker/ARM9/ARM9-TS.lsf @@ -20,7 +20,7 @@ Static $(TARGET_NAME) { - Address 0x02900000 + Address 0x02800000 Object $(OBJS_STATIC) Library $(LLIBS) $(GLIBS) $(CW_LIBS) } diff --git a/build/tests/RelocateChecker/ARM9/src/RelocateChecker.c b/build/tests/RelocateChecker/ARM9/src/RelocateChecker.c index f8e827bd..06f1e2b8 100644 --- a/build/tests/RelocateChecker/ARM9/src/RelocateChecker.c +++ b/build/tests/RelocateChecker/ARM9/src/RelocateChecker.c @@ -36,6 +36,7 @@ RTCDrawProperty g_rtcDraw = { }; // static variable ------------------------------------- +static BOOL s_switch = FALSE; // const data ----------------------------------------- @@ -43,32 +44,66 @@ RTCDrawProperty g_rtcDraw = { // 再配置チェッカー(多分ここからやる事は表示のみ) //====================================================== +static void draw_sub1(u8 *ram_addr, u8 *header_addr, int y) +{ + int l; + PrintfSJIS(8,y,TXT_UCOLOR_DARKGREEN, "ARM9FLX ( VERIFY %s ) :",( (*(BOOL *)0x02000280) ? "OK" : "NG" )); + + for (l=0; l<20; l++) + { + PrintfSJIS(24+(l%10)*19, y+12+12*(l/10), TXT_COLOR_BLACK, "%.2x", *(ram_addr+l)); + if(s_switch) + { + PrintfSJIS(24+(l%10)*19, y+12+12*(l/10), (*(ram_addr+l) != *(header_addr+l)) ? TXT_COLOR_RED : TXT_COLOR_BLUE, "%.2x", *(header_addr+l)); + } + } +} + +static void draw_sub2(u8 *ram_addr, u8 *header_addr, int y, const u16 *str) +{ + int l; + PutStringUTF16(8,y,TXT_UCOLOR_DARKGREEN, str); + for (l=0; l<20; l++) + { + PrintfSJIS(24+(l%10)*19, y+12+12*(l/10), TXT_COLOR_BLACK, "%.2x", *(ram_addr+l)); + if(s_switch ) + { + PrintfSJIS(24+(l%10)*19, y+12+12*(l/10), (*(ram_addr+l) != *(header_addr+l)) ? TXT_COLOR_RED : TXT_COLOR_BLUE, "%.2x", *(header_addr+l)); + } + } +} + +static void encryObjdraw(void) +{ + int l; + NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE ); + for (l=0; l<0x200; l++) + { + PrintfSJIS(24+(l%3)*66, 12*2+4+12+12*(l/3), TXT_COLOR_BLACK, "%.8x", *(((u32 *)0x02000280)+l) ); + } +} + +static void draw() +{ + NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE ); + + PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"RelocateChecker"); + PutStringUTF16( 3 * 8, 1 * 12, TXT_COLOR_BLACK, (const u16 *)L"Press A to Check Digest...."); + + draw_sub1((u8 *)0x02000200, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x300), 12*2+4 ); + + draw_sub2((u8 *)0x02000220, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x314), 12*5+8, (const u16 *)L"ARM7FLX :" ); + draw_sub2((u8 *)0x02000240, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x350), 12*8+12, (const u16 *)L"ARM9LTD :" ); + draw_sub2((u8 *)0x02000260, (u8 *)(HW_TWL_ROM_HEADER_BUF + 0x364), 12*11+16, (const u16 *)L"ARM7LTD :" ); +} + // 初期化 void RelocateCheckerInit( void ) { - u32 *test; GX_DispOff(); GXS_DispOff(); - NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE ); - - //PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"RelocateChecker"); - //PutStringUTF16( 4 * 8, 8 * 8, TXT_COLOR_BLACK, (const u16 *)L"Under Construction..."); - - test = (u32 *)0x02000400; - PrintfSJIS(0,0*8,TXT_COLOR_BLUE, "%8x %8x %8x",*(test+0),*(test+1),*(test+2)); - PrintfSJIS(0,2*8,TXT_COLOR_BLUE, "%8x %8x:arm9",*(test+3),*(test+4)); - - test = (u32 *)0x02000420; - PrintfSJIS(0,6*8,TXT_COLOR_BLUE, "%8x %8x %8x",*(test+0),*(test+1),*(test+2)); - PrintfSJIS(0,8*8,TXT_COLOR_BLUE, "%8x %8x:arm7",*(test+3),*(test+4)); - - test = (u32 *)0x02000440; - PrintfSJIS(0,12*8,TXT_COLOR_BLUE, "%8x %8x %8x",*(test+0),*(test+1),*(test+2)); - PrintfSJIS(0,14*8,TXT_COLOR_BLUE, "%8x %8x:arm9ltd",*(test+3),*(test+4)); - test = (u32 *)0x02000460; - PrintfSJIS(0,18*8,TXT_COLOR_BLUE, "%8x %8x %8x",*(test+0),*(test+1),*(test+2)); - PrintfSJIS(0,20*8,TXT_COLOR_BLUE, "%8x %8x:arm7ltd",*(test+3),*(test+4)); + draw(); GetAndDrawRTCData( &g_rtcDraw, TRUE ); @@ -91,6 +126,15 @@ void RelocateCheckerMain(void) RETURN_BUTTON_BOTTOM_X * 8, RETURN_BUTTON_BOTTOM_Y * 8 - 4, &tpd.disp ); } + if( ( pad.trg & PAD_BUTTON_A )) { + s_switch = !s_switch; + draw(); + } + + if( ( pad.trg & PAD_BUTTON_X )) { + encryObjdraw(); + } + if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) { // SYSM_RebootLauncher(); } diff --git a/build/tests/RelocateChecker/crt/ARM7/src/crt0_rc.LTD.c b/build/tests/RelocateChecker/crt/ARM7/src/crt0_rc.LTD.c index 102e6acd..12ade7cd 100644 --- a/build/tests/RelocateChecker/crt/ARM7/src/crt0_rc.LTD.c +++ b/build/tests/RelocateChecker/crt/ARM7/src/crt0_rc.LTD.c @@ -212,6 +212,9 @@ _start(void) mov lr, pc bx r2 + // ロードされたアプリのダイジェストを計算してアプリ間パラメータに格納 + bl INITi_SetHMACSHA1ToAppParam + @010: /* スタックポインタ設定 */ mov r0, #HW_PSR_SVC_MODE // SuperVisor mode @@ -235,9 +238,6 @@ _start(void) @011: cmp r1, r2 strlt r0, [r1], #4 blt @011 - - // ロードされたアプリのダイジェストを計算してアプリ間パラメータに格納 - bl INITi_SetHMACSHA1ToAppParam /* TWL ハードウェア上で動作しているかどうかを調査 */ ldr r1, =REG_CLK_ADDR @@ -268,6 +268,10 @@ _start(void) str r0, [r1] /* [TODO] ARM7 側でしか設定できない追加 I/O レジスタの初期設定を行う */ + + /* Autoload を実施 */ + bl INITi_DoAutoload + @020: /* STATIC ブロックの .bss セクションを 0 クリア */ ldr r0, =_start_ModuleParams @@ -278,9 +282,6 @@ _start(void) strlt r0, [r1], #4 blt @021 - /* Autoload を実施 */ - bl INITi_DoAutoload - //---- detect main memory size bl detect_main_memory_size @@ -316,38 +317,56 @@ _start(void) #include #include -#include +#include /*---------------------------------------------------------------------------* Name: INITi_SetHMACSHA1ToAppParam - Description: ROMがロードされた各アプリ領域のHMACSHA1を計算し、アプリ間パラ - メタとして保存(暫定的) + Description: ROMがロードされた各アプリ領域のHMACSHA1を計算し、特定のアドレ + スに保存 Arguments: なし。 Returns: なし。 *---------------------------------------------------------------------------*/ +#define UNDEF_CODE 0xe7ffdeff +#define ENCRYPT_DEF_SIZE 0x800 +#define DGT_TGT_ADDR ( HW_MAIN_MEM + 0x0200 ) static void INITi_SetHMACSHA1ToAppParam(void) { -#define DGT_TGT_ADDR ( HW_MAIN_MEM + 0x0400 ) -/* - SVCHMACSHA1Context con; + 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 * ) 0x037c0000; + // arm9_flx - SVC_HMACSHA1Init(&con, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1); - SVC_HMACSHA1Update(&con, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x028)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x02c))); - SVC_HMACSHA1GetHash(&con, (void *)DGT_TGT_ADDR); + *p_arm9encryObjVerify = TRUE; + for( l=0; l