mirror of
https://github.com/rvtr/TwlToolsRED.git
synced 2025-10-31 06:41:18 -04:00
アクセスログ解析機能を追加、
正規品で存在しているエントリがマジコン側に無い場合にアボートしていたのを修正 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@581 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
parent
b26748c307
commit
adc14c7cd8
@ -754,6 +754,10 @@ bool Checker::FindEntry( u32 fnt_offset, u16 entry_id, RomHeader* headerBuf, FIL
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if( entryInfo.entry_name_length == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
fread( entryNames, entryInfo.entry_name_length, 1, fp);
|
fread( entryNames, entryInfo.entry_name_length, 1, fp);
|
||||||
entryNames[entryInfo.entry_name_length] = '\0';
|
entryNames[entryInfo.entry_name_length] = '\0';
|
||||||
if( entryInfo.entry_type == 0) // ファイル
|
if( entryInfo.entry_type == 0) // ファイル
|
||||||
@ -771,6 +775,7 @@ bool Checker::FindEntry( u32 fnt_offset, u16 entry_id, RomHeader* headerBuf, FIL
|
|||||||
entry->InitializeEntry( fileEntry);
|
entry->InitializeEntry( fileEntry);
|
||||||
fileEntry->self_id = entry_id;
|
fileEntry->self_id = entry_id;
|
||||||
fileEntry->parent_id = parent_id;
|
fileEntry->parent_id = parent_id;
|
||||||
|
|
||||||
entry->SetName( fileEntry, entryNames, entryInfo.entry_name_length);
|
entry->SetName( fileEntry, entryNames, entryInfo.entry_name_length);
|
||||||
entry->addFileEntry( fileEntry);
|
entry->addFileEntry( fileEntry);
|
||||||
|
|
||||||
@ -989,7 +994,7 @@ u32 Checker::GetOctValue( char* hex_char)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char logBuf[0x46];
|
char logBuf[0x46];
|
||||||
void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context)
|
void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, Entry* mEntry, FILE* lfp, CARDRomHashContext *context)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
DiffLevel diffLevel;
|
DiffLevel diffLevel;
|
||||||
@ -1032,20 +1037,37 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* en
|
|||||||
if( gFileEntry)
|
if( gFileEntry)
|
||||||
{ // 当該ファイルのアクセスログをマジコン側に変換(ファイルの位置が改竄されている場合のため)
|
{ // 当該ファイルのアクセスログをマジコン側に変換(ファイルの位置が改竄されている場合のため)
|
||||||
mFileEntry = mEntry->FindFileEntry( gFileEntry->full_path_name);
|
mFileEntry = mEntry->FindFileEntry( gFileEntry->full_path_name);
|
||||||
m_log_start_adr = (log_start_adr - gFileEntry->top) + mFileEntry->top;
|
if( mFileEntry)
|
||||||
m_log_end_adr = (log_end_adr - gFileEntry->top) + mFileEntry->top;
|
{ // マジコン側に存在している場合
|
||||||
|
m_log_start_adr = (log_start_adr - gFileEntry->top) + mFileEntry->top;
|
||||||
|
m_log_end_adr = (log_end_adr - gFileEntry->top) + mFileEntry->top;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // マジコン側に存在していない場合
|
||||||
|
m_log_start_adr = log_start_adr;
|
||||||
|
m_log_end_adr = log_end_adr;
|
||||||
|
}
|
||||||
|
|
||||||
// アクセスログが異なる場合はそれを明示
|
// アクセスログが異なる場合はそれを明示
|
||||||
if( (log_start_adr != m_log_start_adr)||(log_end_adr != m_log_end_adr))
|
if( (log_start_adr != m_log_start_adr)||(log_end_adr != m_log_end_adr))
|
||||||
{
|
{
|
||||||
printf( " -> (0x%lx - 0x%lx)", m_log_start_adr, m_log_end_adr);
|
printf( " -> (0x%lx - 0x%lx)", m_log_start_adr, m_log_end_adr);
|
||||||
}
|
}
|
||||||
// ファイル名とファイルとしての改竄有無を表示
|
// マジコン側に存在していなければその旨を表示
|
||||||
|
if( !mFileEntry)
|
||||||
|
{
|
||||||
|
printf( " マジコン側には存在していない,");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 存在していれば、ファイル名とファイルとしての改竄有無を表示
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// 当該アクセスログにおける改竄の有無を表示
|
// 当該アクセスログにおける改竄の有無を表示
|
||||||
Diff( &diffLevel,
|
Diff( &diffLevel,
|
||||||
log_start_adr, (log_end_adr - log_start_adr),
|
log_start_adr, (log_end_adr - log_start_adr),
|
||||||
@ -1138,6 +1160,98 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* en
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Checker::AnalyzeAccessLog( RomHeader* gHeaderBuf, Entry* entry, Entry* mEntry, FILE* lfp)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
DiffLevel diffLevel;
|
||||||
|
u32 log_start_adr, log_end_adr;
|
||||||
|
u32 total = 0;
|
||||||
|
MyFileEntry* gFileEntry;
|
||||||
|
|
||||||
|
while( fread( logBuf, 6, 1, lfp))
|
||||||
|
{
|
||||||
|
if( memcmp( logBuf, "Read: ", 4) == 0)
|
||||||
|
{
|
||||||
|
fread( logBuf, 0x25, 1, lfp);
|
||||||
|
log_start_adr = (GetOctValue(&logBuf[0x9]) +
|
||||||
|
(GetOctValue(&logBuf[0x8]) * 0x10) +
|
||||||
|
(GetOctValue(&logBuf[0x7]) * 0x100) +
|
||||||
|
(GetOctValue(&logBuf[0x6]) * 0x1000) +
|
||||||
|
(GetOctValue(&logBuf[0x5]) * 0x10000) +
|
||||||
|
(GetOctValue(&logBuf[0x4]) * 0x100000) +
|
||||||
|
(GetOctValue(&logBuf[0x3]) * 0x1000000) +
|
||||||
|
(GetOctValue(&logBuf[0x2]) * 0x10000000));
|
||||||
|
|
||||||
|
log_end_adr = (GetOctValue(&logBuf[0x14]) +
|
||||||
|
(GetOctValue(&logBuf[0x13]) * 0x10) +
|
||||||
|
(GetOctValue(&logBuf[0x12]) * 0x100) +
|
||||||
|
(GetOctValue(&logBuf[0x11]) * 0x1000) +
|
||||||
|
(GetOctValue(&logBuf[0x10]) * 0x10000) +
|
||||||
|
(GetOctValue(&logBuf[0x0F]) * 0x100000) +
|
||||||
|
(GetOctValue(&logBuf[0x0E]) * 0x1000000) +
|
||||||
|
(GetOctValue(&logBuf[0x0D]) * 0x10000000));
|
||||||
|
|
||||||
|
total += log_end_adr - log_start_adr;
|
||||||
|
printf( "%d, 0x%lx, 0x%lx, %ld", i, log_start_adr, log_end_adr, log_end_adr - log_start_adr);
|
||||||
|
|
||||||
|
if( (log_end_adr - log_start_adr)>= 1000000)
|
||||||
|
{
|
||||||
|
fread( logBuf, 1, 1, lfp);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
gFileEntry = entry->FindFileLocation( log_start_adr, log_end_adr);
|
||||||
|
if( gFileEntry)
|
||||||
|
{
|
||||||
|
// 領域名も表示
|
||||||
|
entry->FindAreaLocation( log_start_adr, log_end_adr);
|
||||||
|
}
|
||||||
|
else*/
|
||||||
|
{ // ファイルが該当しなかったら領域名の表示と内容比較
|
||||||
|
// entry->FindAreaLocation( log_start_adr, log_end_adr);
|
||||||
|
// TODO:genuine側の対応アドレスはgenuineファイルエントリの先頭から計算し直す
|
||||||
|
/* Diff( &diffLevel,
|
||||||
|
log_start_adr, (log_end_adr - log_start_adr),
|
||||||
|
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( "\n");
|
||||||
|
}
|
||||||
|
else if( memcmp( logBuf, "<<BACK", 4) == 0)
|
||||||
|
{
|
||||||
|
printf( "<<backup access>>\n");
|
||||||
|
fread( logBuf, 12, 1, lfp);
|
||||||
|
}
|
||||||
|
else if( memcmp( logBuf, "<<INVA", 4) == 0)
|
||||||
|
{
|
||||||
|
printf( "<<INVALID access>>\n");
|
||||||
|
fread( logBuf, 12, 1, lfp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf( "<<unknown access>>\n");
|
||||||
|
fread( logBuf, 12, 1, lfp);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
};
|
||||||
|
printf( "total, %ld\n", total);
|
||||||
|
}
|
||||||
|
|
||||||
void Checker::Finalize( void)
|
void Checker::Finalize( void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,9 +78,12 @@ class Checker
|
|||||||
void ExportGenuineBmpFiles( Entry* gEntry, PrintLevel print_enable);
|
void ExportGenuineBmpFiles( Entry* gEntry, PrintLevel print_enable);
|
||||||
|
|
||||||
|
|
||||||
|
/* 起動時アクセスログを解析する */
|
||||||
|
void AnalyzeAccessLog( RomHeader* gHeaderBuf, Entry* entry, Entry* mEntry, FILE* lfp);
|
||||||
|
|
||||||
|
|
||||||
u32 GetOctValue( char* hex_char);
|
u32 GetOctValue( char* hex_char);
|
||||||
void FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context);
|
void FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, Entry* mEntry, FILE* lfp, CARDRomHashContext *context);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -139,15 +139,38 @@ int main (int argc, char *argv[])
|
|||||||
|
|
||||||
lfp = fopen( log_fname, "r");
|
lfp = fopen( log_fname, "r");
|
||||||
printf( "\n\n\nACCESS LOG\n");
|
printf( "\n\n\nACCESS LOG\n");
|
||||||
checker.FindAccessLogFile( &gHeaderBuf, &mEntry, &gEntry, lfp, &context);
|
checker.FindAccessLogFile( &gHeaderBuf, &gEntry, &mEntry, lfp, &context);
|
||||||
printf( "------------------\n");
|
printf( "------------------\n");
|
||||||
fclose( lfp);
|
fclose( lfp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checker.Finalize();
|
||||||
fclose( gfp);
|
fclose( gfp);
|
||||||
fclose( mfp);
|
fclose( mfp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// マジコン名なし かつ Outputファイルあり
|
||||||
|
if( ((!magicon_fname) && output_fname) && log_fname)
|
||||||
|
{
|
||||||
|
FILE* gfp;
|
||||||
|
FILE* lfp;
|
||||||
|
Checker checker;
|
||||||
|
|
||||||
|
gfp = fopen( genuine_fname, "r");
|
||||||
|
lfp = fopen( log_fname, "r");
|
||||||
|
|
||||||
|
checker.Initialize( gfp, NULL, gBuf, NULL, BUFFER_SIZE);
|
||||||
|
|
||||||
|
checker.LoadHeader( &gHeaderBuf, NULL);
|
||||||
|
|
||||||
|
checker.AnalyzeAccessLog( &gHeaderBuf, &gEntry, (Entry*)NULL, lfp);
|
||||||
|
|
||||||
|
checker.Finalize();
|
||||||
|
|
||||||
|
fclose( lfp);
|
||||||
|
fclose( gfp);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user