diff --git a/build/tools/TamperDetectorForSrl/checker.cpp b/build/tools/TamperDetectorForSrl/checker.cpp index b57ae6f..3d24bd5 100644 --- a/build/tools/TamperDetectorForSrl/checker.cpp +++ b/build/tools/TamperDetectorForSrl/checker.cpp @@ -201,6 +201,73 @@ void Checker::AnalyzeBanner( RomHeader* gHeaderBuf, RomHeader* mHeaderBuf) false, PRINT_LEVEL_1); } +void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, RomHeader* mHeaderBuf) +{ + int i; + int g_ovt_entries, m_ovt_entries; + long nowgfp, nowmfp; + ROM_OVT g_ovtBuf, m_ovtBuf; + ROM_FAT g_fatBuf, m_fatBuf; + + nowgfp = ftell( gfp); + nowmfp = ftell( mfp); + + // ARM9 Overlay + printf( "------- ARM9 Overlay -------\n"); + g_ovt_entries = (gHeaderBuf->main_ovt_size) / sizeof(ROM_OVT); + m_ovt_entries = (mHeaderBuf->main_ovt_size) / sizeof(ROM_OVT); + + for( i=0; imain_ovt_offset) + (sizeof(ROM_OVT) * i)), SEEK_SET); + fseek( mfp, ((u32)(mHeaderBuf->main_ovt_offset) + (sizeof(ROM_OVT) * i)), SEEK_SET); + fread( &g_ovtBuf, sizeof(ROM_OVT), 1, gfp); + fread( &m_ovtBuf, sizeof(ROM_OVT), 1, mfp); + + // FAT を読み出す + fseek( gfp, ((u32)(gHeaderBuf->fat_offset) + (sizeof(ROM_FAT) * g_ovtBuf.file_id)), SEEK_SET); + fseek( mfp, ((u32)(mHeaderBuf->fat_offset) + (sizeof(ROM_FAT) * m_ovtBuf.file_id)), SEEK_SET); + fread( &g_fatBuf, sizeof(ROM_FAT), 1, gfp); + fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp); + + printf( "- overlay:%d, file_id:0x%lx\n", i, g_ovtBuf.file_id); + Diff( (u32)(g_fatBuf.top), ((u32)(g_fatBuf.bottom) - (u32)(g_fatBuf.top)), + (u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)), + false, PRINT_LEVEL_1); + } + + // ARM7 Overlay + printf( "\n"); + printf( "------- ARM7 Overlay -------\n"); + g_ovt_entries = (gHeaderBuf->sub_ovt_size) / sizeof(ROM_OVT); + m_ovt_entries = (mHeaderBuf->sub_ovt_size) / sizeof(ROM_OVT); + + for( i=0; isub_ovt_offset) + (sizeof(ROM_OVT) * i)), SEEK_SET); + fseek( mfp, ((u32)(mHeaderBuf->sub_ovt_offset) + (sizeof(ROM_OVT) * i)), SEEK_SET); + fread( &g_ovtBuf, sizeof(ROM_OVT), 1, gfp); + fread( &m_ovtBuf, sizeof(ROM_OVT), 1, mfp); + + // FAT を読み出す + fseek( gfp, ((u32)(gHeaderBuf->fat_offset) + (sizeof(ROM_FAT) * g_ovtBuf.file_id)), SEEK_SET); + fseek( mfp, ((u32)(mHeaderBuf->fat_offset) + (sizeof(ROM_FAT) * m_ovtBuf.file_id)), SEEK_SET); + fread( &g_fatBuf, sizeof(ROM_FAT), 1, gfp); + fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp); + + printf( "- overlay:%d, file_id:0x%lx\n", i, g_ovtBuf.file_id); + Diff( (u32)(g_fatBuf.top), ((u32)(g_fatBuf.bottom) - (u32)(g_fatBuf.top)), + (u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)), + false, PRINT_LEVEL_1); + } + + // ファイルポインタを戻す + fseek( gfp, nowgfp, SEEK_SET); + fseek( mfp, nowmfp, SEEK_SET); +} + bool Checker::AnalyzeFNT( RomHeader* headerBuf, FILE* fp, Entry* entry, PrintLevel print_enable) { @@ -445,6 +512,7 @@ void Checker::CheckAllEntries( Entry* gEntry, Entry* mEntry) while( currentEntry) { printf( "- %s", currentEntry->full_path_name); + printf( "\n file-id : 0x%x", currentEntry->self_id); hisEntry = mEntry->FindFileEntry( currentEntry->full_path_name); if( hisEntry) diff --git a/build/tools/TamperDetectorForSrl/checker.h b/build/tools/TamperDetectorForSrl/checker.h index ad0e240..7fc3c71 100644 --- a/build/tools/TamperDetectorForSrl/checker.h +++ b/build/tools/TamperDetectorForSrl/checker.h @@ -50,6 +50,9 @@ class Checker /* ROMのバナー領域に対して Diff をかける */ void AnalyzeBanner( RomHeader* gHeaderBuf, RomHeader* mHeaderBuf); + /* Overlayテーブルに登録されている各ファイルに対して Diff をかける */ + void AnalyzeOverlay( RomHeader* gHeaderBuf, RomHeader* mHeaderBuf); + /* FNT と FAT を解析して、各ファイルに対して Diff をかける */ bool AnalyzeFNT( RomHeader* headerBuf, FILE* fp, Entry* entry, PrintLevel print_enable); bool FindEntry( u32 fnt_offset, u16 entry_id, RomHeader* headerBuf, FILE* fp, Entry* entry, u16 parent_id, PrintLevel print_enable); diff --git a/build/tools/TamperDetectorForSrl/main.cpp b/build/tools/TamperDetectorForSrl/main.cpp index d6dcabb..a213d2d 100644 --- a/build/tools/TamperDetectorForSrl/main.cpp +++ b/build/tools/TamperDetectorForSrl/main.cpp @@ -143,6 +143,9 @@ int main (int argc, char *argv[]) printf( "\nBanner\n"); checker.AnalyzeBanner( &gHeaderBuf, &mHeaderBuf); + printf( "\nOverlay\n"); + checker.AnalyzeOverlay( &gHeaderBuf, &mHeaderBuf); + printf( "\nFNT & FAT\n"); checker.AnalyzeFNT( &gHeaderBuf, gfp, &gEntry, PRINT_LEVEL_0); gEntry.FollowParent();