HashCheckTemplateの変更。

・ROMヘッダを正式版"0DTA"に変更。
 ・makerom.TWL.DEBUG.exeを使用して、ARM9.FLX.staticの完全なハッシュチェックを行えるよう変更。
 ・また、各static領域のサイズをロード可能なMAXに拡張。
 ・ARM9.FLX, ARM7.FLXの_start_AutoloadDoneCallbackをケアして、デバッガ上でもハッシュ値が合うようにする。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2136 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2008-08-11 08:31:23 +00:00
parent c8bef060e8
commit b19f4213ff
8 changed files with 75 additions and 33 deletions

BIN
RomHeader/0DTA/libsyscall.a Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

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

View File

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

View File

@ -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 :" );

View File

@ -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; l<ENCRYPT_DEF_SIZE/4; l++ )
{
if((u32)p_arm9encryObjVerify < (u32)pCon)
{
*p_arm9encryObjVerify = arm9_flx_addr[l];
p_arm9encryObjVerify++;
}
}
MI_CpuClear8( (void *)(*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x028)), ENCRYPT_DEF_SIZE);// 折角MI使えるので、4バイト境界で困らないように8で
bak = *(u32 *)pROMH->main_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));
}

View File

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