比較結果の返り値を詳細化、ファイルのクローズ忘れを修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@575 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
n1481 2011-10-28 00:45:36 +00:00
parent ef5456c8d6
commit 5d7058ed27
3 changed files with 142 additions and 66 deletions

View File

@ -38,14 +38,14 @@ bool Checker::LoadHeader( void* gHeaderBuf, void* mHeaderBuf)
return false; return false;
} }
bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isDataOnly, PrintLevel print_enable) bool Checker::Diff( DiffLevel* diffLevel, u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isDataOnly, PrintLevel print_enable)
{ {
long nowgfp, nowmfp; long nowgfp, nowmfp;
int result = 0; int result = 0;
u32 check_size, rest_size; u32 check_size, rest_size;
u32 i, loop_num; u32 i, loop_num;
bool function_result = true;
*diffLevel = DIFF_NOT_TOUCHED;
check_size = (g_size < m_size)? g_size : m_size; check_size = (g_size < m_size)? g_size : m_size;
rest_size = check_size; rest_size = check_size;
@ -61,7 +61,7 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD
} }
else else
{ {
function_result = false; // 改竄フラグ *diffLevel |= DIFF_LOCATION_MODIFIED;
if( print_enable) { if( print_enable) {
printf( " offset:0x%lx ---> offset:0x%lx改竄されている\n", g_offset, m_offset); printf( " offset:0x%lx ---> offset:0x%lx改竄されている\n", g_offset, m_offset);
} }
@ -76,7 +76,7 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD
} }
else else
{ {
function_result = false; // 改竄フラグ *diffLevel |= DIFF_SIZE_MODIFIED;
if( print_enable) { if( print_enable) {
printf( " size:0x%lx ---> size:0x%lx改竄されている\n", g_size, m_size); printf( " size:0x%lx ---> size:0x%lx改竄されている\n", g_size, m_size);
} }
@ -89,6 +89,16 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD
nowgfp = ftell( gfp); nowgfp = ftell( gfp);
nowmfp = ftell( mfp); nowmfp = ftell( mfp);
/* OUT_OF_RANGE */
fseek( gfp, 0, SEEK_END);
fseek( mfp, 0, SEEK_END);
if( ((g_offset + g_size) > ftell(gfp)) || ((m_offset + m_size) > ftell(mfp)))
{
*diffLevel |= DIFF_OUT_OF_RANGE;
return false;
}
/* メモリ内容のチェック(サイズが異なる場合は小さいサイズで) */ /* メモリ内容のチェック(サイズが異なる場合は小さいサイズで) */
fseek( gfp, g_offset, SEEK_SET); fseek( gfp, g_offset, SEEK_SET);
fseek( mfp, m_offset, SEEK_SET); fseek( mfp, m_offset, SEEK_SET);
@ -154,13 +164,14 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD
{ {
if( filled) if( filled)
{ {
*diffLevel |= DIFF_DATA_FILLED;
if( print_enable) { if( print_enable) {
printf( " data:0x%xでフィルされている\n", *((u8*)mBuf)); printf( " data:0x%xでフィルされている\n", *((u8*)mBuf));
} }
} }
else else
{ {
function_result = false; // 改竄フラグ *diffLevel |= DIFF_DATA_MODIFIED;
if( print_enable) { if( print_enable) {
printf( " data:(改竄されている)\n"); printf( " data:(改竄されている)\n");
} }
@ -170,71 +181,78 @@ bool Checker::Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isD
// ファイルポインタを戻す // ファイルポインタを戻す
fseek( gfp, nowgfp, SEEK_SET); fseek( gfp, nowgfp, SEEK_SET);
fseek( mfp, nowmfp, SEEK_SET); fseek( mfp, nowmfp, SEEK_SET);
return function_result; return true;
} }
void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mHeaderBuf, Entry* mEntry) void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mHeaderBuf, Entry* mEntry)
{ {
DiffLevel diffLevel;
MyAreaEntry *tmpAreaEntry; MyAreaEntry *tmpAreaEntry;
if( gHeaderBuf->platform_code & 0x03) if( gHeaderBuf->platform_code & 0x03)
{ // TWL-ROMヘッダの範囲をチェック { // TWL-ROMヘッダの範囲をチェック
Diff( 0, sizeof(RomHeader), 0, sizeof(RomHeader), false, PRINT_LEVEL_1); Diff( &diffLevel, 0, sizeof(RomHeader), 0, sizeof(RomHeader), false, PRINT_LEVEL_1);
printf( "[support TWL]\n"); printf( "[support TWL]\n");
} }
else else
{ // NITRO-ROMヘッダの範囲だけチェック { // NITRO-ROMヘッダの範囲だけチェック
Diff( 0, 0x180, 0, 0x180, false, PRINT_LEVEL_1); Diff( &diffLevel, 0, 0x180, 0, 0x180, false, PRINT_LEVEL_1);
} }
printf( "------------------\n"); printf( "------------------\n");
printf( "ARM9 Static Module\n"); printf( "ARM9 Static Module\n");
Diff( (u32)(gHeaderBuf->arm9.romAddr), Diff( &diffLevel,
(u32)(gHeaderBuf->arm9.romSize), (u32)(gHeaderBuf->arm9.romAddr),
(u32)(mHeaderBuf->arm9.romAddr), (u32)(gHeaderBuf->arm9.romSize),
(u32)(mHeaderBuf->arm9.romSize), (u32)(mHeaderBuf->arm9.romAddr),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->arm9.romSize),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
printf( "ARM7 Static Module\n"); printf( "ARM7 Static Module\n");
Diff( (u32)(gHeaderBuf->arm7.romAddr), Diff( &diffLevel,
(u32)(gHeaderBuf->arm7.romSize), (u32)(gHeaderBuf->arm7.romAddr),
(u32)(mHeaderBuf->arm7.romAddr), (u32)(gHeaderBuf->arm7.romSize),
(u32)(mHeaderBuf->arm7.romSize), (u32)(mHeaderBuf->arm7.romAddr),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->arm7.romSize),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
printf( "File Name Table\n"); printf( "File Name Table\n");
Diff( (u32)(gHeaderBuf->fnt_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->fnt_size), (u32)(gHeaderBuf->fnt_offset),
(u32)(mHeaderBuf->fnt_offset), (u32)(gHeaderBuf->fnt_size),
(u32)(mHeaderBuf->fnt_size), (u32)(mHeaderBuf->fnt_offset),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->fnt_size),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
printf( "File Allocation Table\n"); printf( "File Allocation Table\n");
Diff( (u32)(gHeaderBuf->fat_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->fat_size), (u32)(gHeaderBuf->fat_offset),
(u32)(mHeaderBuf->fat_offset), (u32)(gHeaderBuf->fat_size),
(u32)(mHeaderBuf->fat_size), (u32)(mHeaderBuf->fat_offset),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->fat_size),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
printf( "ARM9 Overlay Table\n"); printf( "ARM9 Overlay Table\n");
Diff( (u32)(gHeaderBuf->main_ovt_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->main_ovt_size), (u32)(gHeaderBuf->main_ovt_offset),
(u32)(mHeaderBuf->main_ovt_offset), (u32)(gHeaderBuf->main_ovt_size),
(u32)(mHeaderBuf->main_ovt_size), (u32)(mHeaderBuf->main_ovt_offset),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->main_ovt_size),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
printf( "ARM7 Overlay Table\n"); printf( "ARM7 Overlay Table\n");
Diff( (u32)(gHeaderBuf->sub_ovt_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->sub_ovt_size), (u32)(gHeaderBuf->sub_ovt_offset),
(u32)(mHeaderBuf->sub_ovt_offset), (u32)(gHeaderBuf->sub_ovt_size),
(u32)(mHeaderBuf->sub_ovt_size), (u32)(mHeaderBuf->sub_ovt_offset),
false, PRINT_LEVEL_1); (u32)(mHeaderBuf->sub_ovt_size),
false, PRINT_LEVEL_1);
printf( "------------------\n"); printf( "------------------\n");
@ -244,7 +262,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
{ {
/* TWL専用部分 */ /* TWL専用部分 */
printf( "ARM9 Ltd Static Module\n"); printf( "ARM9 Ltd Static Module\n");
Diff( (u32)(gHeaderBuf->ltd_arm9.romAddr), Diff( &diffLevel,
(u32)(gHeaderBuf->ltd_arm9.romAddr),
(u32)(gHeaderBuf->ltd_arm9.romSize), (u32)(gHeaderBuf->ltd_arm9.romSize),
(u32)(mHeaderBuf->ltd_arm9.romAddr), (u32)(mHeaderBuf->ltd_arm9.romAddr),
(u32)(mHeaderBuf->ltd_arm9.romSize), (u32)(mHeaderBuf->ltd_arm9.romSize),
@ -252,7 +271,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "ARM7 Ltd Static Module\n"); printf( "ARM7 Ltd Static Module\n");
Diff( (u32)(gHeaderBuf->ltd_arm7.romAddr), Diff( &diffLevel,
(u32)(gHeaderBuf->ltd_arm7.romAddr),
(u32)(gHeaderBuf->ltd_arm7.romSize), (u32)(gHeaderBuf->ltd_arm7.romSize),
(u32)(mHeaderBuf->ltd_arm7.romAddr), (u32)(mHeaderBuf->ltd_arm7.romAddr),
(u32)(mHeaderBuf->ltd_arm7.romSize), (u32)(mHeaderBuf->ltd_arm7.romSize),
@ -260,7 +280,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "(NITRO Digest Area)\n"); printf( "(NITRO Digest Area)\n");
Diff( (u32)(gHeaderBuf->nitro_digest_area_rom_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->nitro_digest_area_rom_offset),
(u32)(gHeaderBuf->nitro_digest_area_size), (u32)(gHeaderBuf->nitro_digest_area_size),
(u32)(mHeaderBuf->nitro_digest_area_rom_offset), (u32)(mHeaderBuf->nitro_digest_area_rom_offset),
(u32)(mHeaderBuf->nitro_digest_area_size), (u32)(mHeaderBuf->nitro_digest_area_size),
@ -268,7 +289,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "(TWL Digest Area)\n"); printf( "(TWL Digest Area)\n");
Diff( (u32)(gHeaderBuf->twl_digest_area_rom_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->twl_digest_area_rom_offset),
(u32)(gHeaderBuf->twl_digest_area_size), (u32)(gHeaderBuf->twl_digest_area_size),
(u32)(mHeaderBuf->twl_digest_area_rom_offset), (u32)(mHeaderBuf->twl_digest_area_rom_offset),
(u32)(mHeaderBuf->twl_digest_area_size), (u32)(mHeaderBuf->twl_digest_area_size),
@ -276,7 +298,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "Digest1 Table\n"); printf( "Digest1 Table\n");
Diff( (u32)(gHeaderBuf->digest1_table_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->digest1_table_offset),
(u32)(gHeaderBuf->digest1_table_size), (u32)(gHeaderBuf->digest1_table_size),
(u32)(mHeaderBuf->digest1_table_offset), (u32)(mHeaderBuf->digest1_table_offset),
(u32)(mHeaderBuf->digest1_table_size), (u32)(mHeaderBuf->digest1_table_size),
@ -284,7 +307,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "Digest2 Table\n"); printf( "Digest2 Table\n");
Diff( (u32)(gHeaderBuf->digest2_table_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->digest2_table_offset),
(u32)(gHeaderBuf->digest2_table_size), (u32)(gHeaderBuf->digest2_table_size),
(u32)(mHeaderBuf->digest2_table_offset), (u32)(mHeaderBuf->digest2_table_offset),
(u32)(mHeaderBuf->digest2_table_size), (u32)(mHeaderBuf->digest2_table_size),
@ -292,7 +316,8 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
printf( "------------------\n"); printf( "------------------\n");
printf( "AES TARGET\n"); printf( "AES TARGET\n");
Diff( (u32)(gHeaderBuf->aes_target_rom_offset), Diff( &diffLevel,
(u32)(gHeaderBuf->aes_target_rom_offset),
(u32)(gHeaderBuf->aes_target_size), (u32)(gHeaderBuf->aes_target_size),
(u32)(mHeaderBuf->aes_target_rom_offset), (u32)(mHeaderBuf->aes_target_rom_offset),
(u32)(mHeaderBuf->aes_target_size), (u32)(mHeaderBuf->aes_target_size),
@ -481,6 +506,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
void Checker::AnalyzeBanner( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mHeaderBuf, Entry* mEntry) void Checker::AnalyzeBanner( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mHeaderBuf, Entry* mEntry)
{ {
DiffLevel diffLevel;
MyAreaEntry *tmpAreaEntry; MyAreaEntry *tmpAreaEntry;
BannerHeader gBannerHeader; BannerHeader gBannerHeader;
BannerHeader mBannerHeader; BannerHeader mBannerHeader;
@ -497,7 +523,8 @@ void Checker::AnalyzeBanner( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
fread( &mBannerHeader, sizeof(BannerHeader), 1, mfp); fread( &mBannerHeader, sizeof(BannerHeader), 1, mfp);
printf( "------- Banner Header -------\n"); printf( "------- Banner Header -------\n");
Diff( (u32)(gHeaderBuf->banner_offset), sizeof(BannerHeader), Diff( &diffLevel,
(u32)(gHeaderBuf->banner_offset), sizeof(BannerHeader),
(u32)(mHeaderBuf->banner_offset), sizeof(BannerHeader), (u32)(mHeaderBuf->banner_offset), sizeof(BannerHeader),
false, PRINT_LEVEL_1); false, PRINT_LEVEL_1);
if( (((gBannerHeader.version) < 1) || ((gBannerHeader.version) > 3)) || if( (((gBannerHeader.version) < 1) || ((gBannerHeader.version) > 3)) ||
@ -507,7 +534,8 @@ void Checker::AnalyzeBanner( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH
return; return;
} }
printf( "------- Banner Body -------\n"); printf( "------- Banner Body -------\n");
Diff( (u32)(gHeaderBuf->banner_offset) + sizeof(BannerHeader), banner_size[gBannerHeader.version], Diff( &diffLevel,
(u32)(gHeaderBuf->banner_offset) + sizeof(BannerHeader), banner_size[gBannerHeader.version],
(u32)(mHeaderBuf->banner_offset) + sizeof(BannerHeader), banner_size[mBannerHeader.version], (u32)(mHeaderBuf->banner_offset) + sizeof(BannerHeader), banner_size[mBannerHeader.version],
false, PRINT_LEVEL_1); false, PRINT_LEVEL_1);
@ -546,6 +574,7 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m
int i; int i;
int g_ovt_entries, m_ovt_entries; int g_ovt_entries, m_ovt_entries;
long nowgfp, nowmfp; long nowgfp, nowmfp;
DiffLevel diffLevel;
ROM_OVT g_ovtBuf, m_ovtBuf; ROM_OVT g_ovtBuf, m_ovtBuf;
ROM_FAT g_fatBuf, m_fatBuf; ROM_FAT g_fatBuf, m_fatBuf;
MyAreaEntry *tmpAreaEntry; MyAreaEntry *tmpAreaEntry;
@ -574,7 +603,8 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m
fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp); fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp);
printf( "- overlay:%d, file_id:0x%lx\n", i, g_ovtBuf.file_id); 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)), Diff( &diffLevel,
(u32)(g_fatBuf.top), ((u32)(g_fatBuf.bottom) - (u32)(g_fatBuf.top)),
(u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)), (u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)),
false, PRINT_LEVEL_1); false, PRINT_LEVEL_1);
@ -617,7 +647,8 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m
fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp); fread( &m_fatBuf, sizeof(ROM_FAT), 1, mfp);
printf( "- overlay:%d, file_id:0x%lx\n", i, g_ovtBuf.file_id); 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)), Diff( &diffLevel,
(u32)(g_fatBuf.top), ((u32)(g_fatBuf.bottom) - (u32)(g_fatBuf.top)),
(u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)), (u32)(m_fatBuf.top), ((u32)(m_fatBuf.bottom) - (u32)(m_fatBuf.top)),
false, PRINT_LEVEL_1); false, PRINT_LEVEL_1);
@ -770,6 +801,7 @@ bool Checker::FindEntry( u32 fnt_offset, u16 entry_id, RomHeader* headerBuf, FIL
void Checker::FindAllocation( u16 entry_id, RomHeader* headerBuf, FILE* fp, Entry* entry, PrintLevel print_enable) void Checker::FindAllocation( u16 entry_id, RomHeader* headerBuf, FILE* fp, Entry* entry, PrintLevel print_enable)
{ {
DiffLevel diffLevel;
ROM_FAT currentRomFat; ROM_FAT currentRomFat;
long nowfp; long nowfp;
nowfp = ftell( fp); nowfp = ftell( fp);
@ -783,7 +815,8 @@ void Checker::FindAllocation( u16 entry_id, RomHeader* headerBuf, FILE* fp, Entr
(u32)(currentRomFat.top), (u32)(currentRomFat.bottom), (u32)(currentRomFat.top), (u32)(currentRomFat.bottom),
(u32)((u32)(currentRomFat.bottom) - (u32)(currentRomFat.top))); (u32)((u32)(currentRomFat.bottom) - (u32)(currentRomFat.top)));
} }
Diff( (u32)(currentRomFat.top), (u32)(currentRomFat.bottom) - (u32)(currentRomFat.top), Diff( &diffLevel,
(u32)(currentRomFat.top), (u32)(currentRomFat.bottom) - (u32)(currentRomFat.top),
(u32)(currentRomFat.top), (u32)(currentRomFat.bottom) - (u32)(currentRomFat.top), (u32)(currentRomFat.top), (u32)(currentRomFat.bottom) - (u32)(currentRomFat.top),
true, print_enable); true, print_enable);
@ -850,6 +883,7 @@ void Checker::ExportGenuineBmpFiles( Entry* gEntry, PrintLevel print_enable)
/* ディレクトリとファイルをチェックする */ /* ディレクトリとファイルをチェックする */
void Checker::CheckAllEntries( RomHeader* mHeaderBuf, CARDRomHashContext *context, Entry* gEntry, Entry* mEntry) void Checker::CheckAllEntries( RomHeader* mHeaderBuf, CARDRomHashContext *context, Entry* gEntry, Entry* mEntry)
{ {
DiffLevel diffLevel;
{ {
MyDirEntry *currentEntry = gEntry->dirEntry; MyDirEntry *currentEntry = gEntry->dirEntry;
MyDirEntry *hisEntry; MyDirEntry *hisEntry;
@ -894,9 +928,11 @@ void Checker::CheckAllEntries( RomHeader* mHeaderBuf, CARDRomHashContext *contex
if( hisEntry) if( hisEntry)
{ {
printf( "\n"); printf( "\n");
if( Diff( currentEntry->top, (currentEntry->bottom - currentEntry->top), Diff( &diffLevel,
hisEntry->top, (hisEntry->bottom - hisEntry->top), currentEntry->top, (currentEntry->bottom - currentEntry->top),
false, PRINT_LEVEL_1) == false) hisEntry->top, (hisEntry->bottom - hisEntry->top),
false, PRINT_LEVEL_1);
if( diffLevel & DIFF_DATA_MODIFIED)
{ {
currentEntry->modified = true; // 改竄フラグ currentEntry->modified = true; // 改竄フラグ
} }
@ -956,6 +992,7 @@ char logBuf[0x46];
void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context) void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context)
{ {
int i = 0; int i = 0;
DiffLevel diffLevel;
u8 d1, d2, dm1, dm2; u8 d1, d2, dm1, dm2;
u32 log_start_adr, log_end_adr; u32 log_start_adr, log_end_adr;
u32 m_log_start_adr, m_log_end_adr; u32 m_log_start_adr, m_log_end_adr;
@ -986,6 +1023,11 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* en
(GetOctValue(&logBuf[0x0D]) * 0x10000000)); (GetOctValue(&logBuf[0x0D]) * 0x10000000));
printf( "%d 0x%lx - 0x%lx", i, log_start_adr, log_end_adr); printf( "%d 0x%lx - 0x%lx", i, log_start_adr, log_end_adr);
if( (log_end_adr - log_start_adr)>= 1000000)
{
fread( logBuf, 1, 1, lfp);
}
gFileEntry = entry->FindFileLocation( log_start_adr, log_end_adr); gFileEntry = entry->FindFileLocation( log_start_adr, log_end_adr);
if( gFileEntry) if( gFileEntry)
{ // 当該ファイルのアクセスログをマジコン側に変換(ファイルの位置が改竄されている場合のため) { // 当該ファイルのアクセスログをマジコン側に変換(ファイルの位置が改竄されている場合のため)
@ -1000,18 +1042,30 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* en
// ファイル名とファイルとしての改竄有無を表示 // ファイル名とファイルとしての改竄有無を表示
if( gFileEntry->modified) if( gFileEntry->modified)
{ {
printf( " %s(*)", gFileEntry->full_path_name); printf( " %s(*),", gFileEntry->full_path_name);
}else{ }else{
printf( " %s", gFileEntry->full_path_name); printf( " %s,", gFileEntry->full_path_name);
} }
// 当該アクセスログにおける改竄の有無を表示 // 当該アクセスログにおける改竄の有無を表示
if( Diff( log_start_adr, (log_end_adr - log_start_adr), Diff( &diffLevel,
m_log_start_adr, (m_log_end_adr - m_log_start_adr), log_start_adr, (log_end_adr - log_start_adr),
true, PRINT_LEVEL_0)) m_log_start_adr, (m_log_end_adr - m_log_start_adr),
true, PRINT_LEVEL_0);
if( diffLevel & DIFF_OUT_OF_RANGE)
{
printf( "[out of range]");
}
else if( diffLevel & DIFF_DATA_MODIFIED)
{
printf( "[data(*)]");
}
else if( diffLevel & DIFF_DATA_FILLED)
{
printf( "[data(f)]");
}
else
{ {
printf( "[data]"); printf( "[data]");
}else{
printf( "[data(*)]");
} }
if( gHeaderBuf->platform_code & 0x03) if( gHeaderBuf->platform_code & 0x03)
@ -1042,13 +1096,25 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* en
{ // ファイルが該当しなかったら領域名の表示と内容比較 { // ファイルが該当しなかったら領域名の表示と内容比較
entry->FindAreaLocation( log_start_adr, log_end_adr); entry->FindAreaLocation( log_start_adr, log_end_adr);
// TODO:genuine側の対応アドレスはgenuineファイルエントリの先頭から計算し直す // TODO:genuine側の対応アドレスはgenuineファイルエントリの先頭から計算し直す
if( Diff( log_start_adr, (log_end_adr - log_start_adr), Diff( &diffLevel,
log_start_adr, (log_end_adr - log_start_adr), log_start_adr, (log_end_adr - log_start_adr),
true, PRINT_LEVEL_0)) log_start_adr, (log_end_adr - log_start_adr),
true, PRINT_LEVEL_0);
if( diffLevel & DIFF_OUT_OF_RANGE)
{
printf( "[out of range]");
}
else if( diffLevel & DIFF_DATA_MODIFIED)
{
printf( "[data(*)]");
}
else if( diffLevel & DIFF_DATA_FILLED)
{
printf( "[data(f)]");
}
else
{ {
printf( "[data]"); printf( "[data]");
}else{
printf( "[data(*)]");
} }
} }
printf( "\n"); printf( "\n");

View File

@ -18,6 +18,15 @@ typedef struct
u8 entry_type :1; // ファイルエントリの場合は 0 u8 entry_type :1; // ファイルエントリの場合は 0
} EntryInfo; } EntryInfo;
typedef u32 DiffLevel;
#define DIFF_NOT_TOUCHED 0
#define DIFF_DATA_MODIFIED 1
#define DIFF_DATA_FILLED 2
#define DIFF_SIZE_MODIFIED 4
#define DIFF_LOCATION_MODIFIED 8
#define DIFF_OUT_OF_RANGE 16
typedef enum typedef enum
{ {
PRINT_LEVEL_0 = 0, PRINT_LEVEL_0 = 0,
@ -45,7 +54,7 @@ class Checker
bool LoadHeader( void* gHeaderBuf, void* mHeaderBuf); bool LoadHeader( void* gHeaderBuf, void* mHeaderBuf);
/* ROMの特定領域に差がないかどうか調べる */ /* ROMの特定領域に差がないかどうか調べる */
bool Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isDataOnly, PrintLevel print_enable); bool Diff( DiffLevel* diffLevel, u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isDataOnly, PrintLevel print_enable);
void Finalize( void); void Finalize( void);

View File

@ -141,6 +141,7 @@ int main (int argc, char *argv[])
printf( "\n\n\nACCESS LOG\n"); printf( "\n\n\nACCESS LOG\n");
checker.FindAccessLogFile( &gHeaderBuf, &mEntry, &gEntry, lfp, &context); checker.FindAccessLogFile( &gHeaderBuf, &mEntry, &gEntry, lfp, &context);
printf( "------------------\n"); printf( "------------------\n");
fclose( lfp);
} }
fclose( gfp); fclose( gfp);