mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
再配置チェッカプログラム暫定版
・デバッガからの起動には未対応 ・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:
parent
ecd52da240
commit
c65c34395a
@ -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 \
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
Static $(TARGET_NAME)
|
||||
{
|
||||
Address 0x02900000
|
||||
Address 0x02800000
|
||||
Object $(OBJS_STATIC)
|
||||
Library $(LLIBS) $(GLIBS) $(CW_LIBS)
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user