diff --git a/build/tools/TamperDetectorForSrl/card_hash.cpp b/build/tools/TamperDetectorForSrl/card_hash.cpp index ce19ee3..ca928e3 100644 --- a/build/tools/TamperDetectorForSrl/card_hash.cpp +++ b/build/tools/TamperDetectorForSrl/card_hash.cpp @@ -439,3 +439,27 @@ void GetDigestResult( CARDRomHashContext *context, u32 start_adr, u32 end_adr, u } } +/* アドレスの範囲に該当するダイジェストテーブルの改竄有無を表示する */ +void IsDigestModified( CARDRomHashContext *context, u32 start_adr, u32 end_adr, u8* d1, u8* d2) +{ + u32 offset; + u32 digest1_index, digest2_index; + *d1 = 1; + *d2 = 1; + + for( offset = start_adr; offset < end_adr; offset+=context->bytes_per_sector) + { + digest1_index = CARDi_GetHashSectorIndex( context, offset); + if( !context->hash_original[digest1_index]) + { + *d1 = 0; + } + + digest2_index = (digest1_index / context->sectors_per_block); + if( !context->master_hash_original[digest2_index]) + { + *d2 = 0; + } + } +} + diff --git a/build/tools/TamperDetectorForSrl/card_hash.h b/build/tools/TamperDetectorForSrl/card_hash.h index 4a5500b..7a2f727 100644 --- a/build/tools/TamperDetectorForSrl/card_hash.h +++ b/build/tools/TamperDetectorForSrl/card_hash.h @@ -98,6 +98,8 @@ void CARD_CheckHash(CARDRomHashContext *context, RomHeader* header, FILE* fp); void CARD_CheckFileDigest(CARDRomHashContext *context, MyFileEntry* file_entry, u8* ret_digest1, u8* ret_digest2); /* アドレスの範囲に該当するダイジェスト検証の合否を表示する */ void GetDigestResult( CARDRomHashContext *context, u32 start_adr, u32 end_adr, u8* d1, u8* d2); +/* アドレスの範囲に該当するダイジェストテーブルの改竄有無を表示する */ +void IsDigestModified( CARDRomHashContext *context, u32 start_adr, u32 end_adr, u8* d1, u8* d2); #endif //CARD_HASH_H_ diff --git a/build/tools/TamperDetectorForSrl/checker.cpp b/build/tools/TamperDetectorForSrl/checker.cpp index 2daeab3..819cf2e 100644 --- a/build/tools/TamperDetectorForSrl/checker.cpp +++ b/build/tools/TamperDetectorForSrl/checker.cpp @@ -55,7 +55,8 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD if( g_offset == m_offset) { if( (print_enable)&&(print_enable < PRINT_LEVEL_2)) { - printf( " offset:0x%lx(改竄されていない)\n", g_offset); + printf( " offset:0x%lx\n", g_offset); +// printf( " offset:0x%lx(改竄されていない)\n", g_offset); } } else @@ -69,7 +70,8 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD if( g_size == m_size) { if( (print_enable)&&(print_enable < PRINT_LEVEL_2)) { - printf( " size:0x%lx(改竄されていない)\n", g_size); + printf( " size:0x%lx\n", g_size); +// printf( " size:0x%lx(改竄されていない)\n", g_size); } } else @@ -144,7 +146,8 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD if( totalResult == 0) { if( (print_enable)&&(print_enable < PRINT_LEVEL_2)) { - printf( " data:(改竄されていない)\n"); + printf( " data:\n"); +// printf( " data:(改竄されていない)\n"); } } else @@ -953,7 +956,7 @@ char logBuf[0x46]; void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, CARDRomHashContext *context) { int i = 0; - u8 d1, d2; + u8 d1, d2, dm1, dm2; u32 log_start_adr, log_end_adr; while( fread( logBuf, 6, 1, lfp)) @@ -986,19 +989,48 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, log_start_adr, (log_end_adr - log_start_adr), true, PRINT_LEVEL_0)) { - printf( "[data:OK]"); + printf( "[data]"); }else{ - printf( "[data:NG]"); + printf( "[data(*)]"); } if( gHeaderBuf->platform_code & 0x03) { GetDigestResult( context, log_start_adr, log_end_adr, &d1, &d2); - if( d1) { printf( "[d1:OK]");} else { printf( "[d1:NG]");}; - if( d2) { printf( "[d2:OK]");} else { printf( "[d2:NG]");}; + IsDigestModified( context, log_start_adr, log_end_adr, &dm1, &dm2); + if( dm1) + { + if( d1) { printf( "[d1:OK]");} else { printf( "[d1:NG]");}; + } + else + { + if( d1) { printf( "[d1(*):OK]");} else { printf( "[d1(*):NG]");}; + } + if( dm2) + { + if( d2) { printf( "[d2:OK]");} else { printf( "[d2:NG]");}; + } + else + { + if( d2) { printf( "[d2(*):OK]");} else { printf( "[d2(*):NG]");}; + } } + // 領域名も表示 + entry->FindAreaLocation( log_start_adr, log_end_adr); + } + else + { // ファイルが該当しなかったら領域名の表示と内容比較 + entry->FindAreaLocation( log_start_adr, log_end_adr); + // TODO:genuine側の対応アドレスはgenuineファイルエントリの先頭から計算し直す + if( Diff( log_start_adr, (log_end_adr - log_start_adr), + log_start_adr, (log_end_adr - log_start_adr), + true, PRINT_LEVEL_0)) + { + printf( "[data]"); + }else{ + printf( "[data(*)]"); + } } - entry->FindAreaLocation( log_start_adr, log_end_adr); printf( "\n"); } else