再配置チェッカプログラム暫定版

・デバッガからの起動には未対応
・ARM9の先頭0x800バイトの仕様が不明瞭なため、その部分の初期値チェックは動作せず
・0x2000200から0x2000280までを暫定的にダイジェストハッシュ値の記憶領域として使用しているため、この領域へROMをロードするようなマッピングの再配置チェックは不可

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@335 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2007-12-07 05:00:53 +00:00
parent ecd52da240
commit c65c34395a
4 changed files with 111 additions and 48 deletions

View File

@ -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 \

View File

@ -20,7 +20,7 @@
Static $(TARGET_NAME)
{
Address 0x02900000
Address 0x02800000
Object $(OBJS_STATIC)
Library $(LLIBS) $(GLIBS) $(CW_LIBS)
}

View File

@ -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();
}

View File

@ -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 <nitro/mi/stream.h>
#include <twl/os/common/systemCall.h>
#include <nitro/math/dgt.h>
#include <nitro/mi.h>
/*---------------------------------------------------------------------------*
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<ENCRYPT_DEF_SIZE/4; l++ )
{
if(arm9_flx_addr[l] != UNDEF_CODE)
{
if((u32)p_arm9encryObjVerify < 0x2000400)
{
*p_arm9encryObjVerify = arm9_flx_addr[l];
p_arm9encryObjVerify++;
}
}
}
MI_CpuClear8( (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x028)), ENCRYPT_DEF_SIZE);// 折角MI使えるので、4バイト境界で困らないように8で
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_HMACSHA1GetHash(pCon, (void *)DGT_TGT_ADDR);
// arm7_flx
SVC_HMACSHA1Init(&con, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1);
SVC_HMACSHA1Update(&con, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x038)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x03c)));
SVC_HMACSHA1GetHash(&con, (void *)(DGT_TGT_ADDR + SVC_SHA1_DIGEST_SIZE));
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_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 32));
// arm9_ltd
SVC_HMACSHA1Init(&con, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1);
SVC_HMACSHA1Update(&con, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1c8)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1cc)));
SVC_HMACSHA1GetHash(&con, (void *)(DGT_TGT_ADDR + 2 * SVC_SHA1_DIGEST_SIZE));
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_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 2 * 32));
// arm7_ltd
SVC_HMACSHA1Init(&con, (void *)s_digestDefaultKey, DIGEST_HASH_BLOCK_SIZE_SHA1);
SVC_HMACSHA1Update(&con, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1d8)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1dc)));
SVC_HMACSHA1GetHash(&con, (void *)(DGT_TGT_ADDR + 3 * SVC_SHA1_DIGEST_SIZE));
*/
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_HMACSHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 3 * 32));
/*
SVCSHA1Context *pCon = ( SVCSHA1Context * ) 0x037c0000;
// arm9_flx
SVC_SHA1Init(pCon);
@ -365,7 +384,7 @@ static void INITi_SetHMACSHA1ToAppParam(void)
SVC_SHA1Init(pCon);
SVC_SHA1Update(pCon, (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1d8)), *((u32 *)(HW_TWL_ROM_HEADER_BUF + 0x1dc)));
SVC_SHA1GetHash(pCon, (void *)(DGT_TGT_ADDR + 96));
*/
}
/*
static asm void INITi_SetHMACSHA1ToAppParam(void)