From ef5456c8d6d1631045b6ea5aee0c5a5e15960673 Mon Sep 17 00:00:00 2001 From: n1481 Date: Tue, 18 Oct 2011 03:01:27 +0000 Subject: [PATCH] =?UTF-8?q?Usage=E3=81=AE=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?=E3=82=A2=E3=82=AF=E3=82=BB=E3=82=B9=E3=83=AD=E3=82=B0=E3=81=AE?= =?UTF-8?q?=E6=94=B9=E7=AB=84=E7=8A=B6=E6=B3=81=E3=82=92=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=99=E3=82=8B=E9=9A=9B=E3=80=81=E4=BD=8D=E7=BD=AE=E3=81=8C?= =?UTF-8?q?=E6=94=B9=E5=A4=89=E3=81=95=E3=82=8C=E3=81=9F=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AB=E5=AF=BE=E3=81=97=E3=81=A6=E3=81=AF?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E3=83=84=E3=83=BC=E3=83=AB=E5=81=B4=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=97=E3=80=81?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E3=83=84=E3=83=BC=E3=83=AB=E5=81=B4=E3=81=AE?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=A7=E6=AF=94=E8=BC=83?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@574 7061adef-622a-194b-ae81-725974e89856 --- build/tools/TamperDetectorForSrl/checker.cpp | 56 ++++++++++++------ build/tools/TamperDetectorForSrl/checker.h | 8 +-- build/tools/TamperDetectorForSrl/entry.cpp | 4 +- build/tools/TamperDetectorForSrl/main.cpp | 2 +- .../tools/TamperDetectorForSrl/searcharg.cpp | 5 +- .../TamperDetectorForSrl/tamperdetector.exe | Bin 529709 -> 529712 bytes 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/build/tools/TamperDetectorForSrl/checker.cpp b/build/tools/TamperDetectorForSrl/checker.cpp index 819cf2e..52baa72 100644 --- a/build/tools/TamperDetectorForSrl/checker.cpp +++ b/build/tools/TamperDetectorForSrl/checker.cpp @@ -196,7 +196,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH (u32)(mHeaderBuf->arm9.romSize), false, PRINT_LEVEL_1); printf( "------------------\n"); - + printf( "ARM7 Static Module\n"); Diff( (u32)(gHeaderBuf->arm7.romAddr), (u32)(gHeaderBuf->arm7.romSize), @@ -220,7 +220,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH (u32)(mHeaderBuf->fat_size), false, PRINT_LEVEL_1); printf( "------------------\n"); - + printf( "ARM9 Overlay Table\n"); Diff( (u32)(gHeaderBuf->main_ovt_offset), (u32)(gHeaderBuf->main_ovt_size), @@ -237,7 +237,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH false, PRINT_LEVEL_1); printf( "------------------\n"); - + printf( "------------------\n"); printf( "TWL Rom Header\n"); if( gHeaderBuf->platform_code & 0x03) @@ -250,7 +250,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH (u32)(mHeaderBuf->ltd_arm9.romSize), false, PRINT_LEVEL_1); printf( "------------------\n"); - + printf( "ARM7 Ltd Static Module\n"); Diff( (u32)(gHeaderBuf->ltd_arm7.romAddr), (u32)(gHeaderBuf->ltd_arm7.romSize), @@ -387,7 +387,7 @@ void Checker::AnalyzeHeader( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* mH tmpAreaEntry->bottom = (u32)((u32)(mHeaderBuf->sub_ovt_offset) + mHeaderBuf->sub_ovt_size); mEntry->addAreaEntry( tmpAreaEntry); - + if( gHeaderBuf->platform_code & 0x03) { // genuine 領域を登録 @@ -553,7 +553,7 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m nowgfp = ftell( gfp); nowmfp = ftell( mfp); - + // ARM9 Overlay printf( "------- ARM9 Overlay -------\n"); g_ovt_entries = (gHeaderBuf->main_ovt_size) / sizeof(ROM_OVT); @@ -572,7 +572,7 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m 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)), @@ -615,7 +615,7 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m 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)), @@ -638,7 +638,7 @@ void Checker::AnalyzeOverlay( RomHeader* gHeaderBuf, Entry* gEntry, RomHeader* m tmpAreaEntry->bottom = (u32)(m_fatBuf.bottom); mEntry->addAreaEntry( tmpAreaEntry); } - + // ファイルポインタを戻す fseek( gfp, nowgfp, SEEK_SET); fseek( mfp, nowmfp, SEEK_SET); @@ -953,11 +953,14 @@ u32 Checker::GetOctValue( char* hex_char) } char logBuf[0x46]; -void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, CARDRomHashContext *context) +void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context) { int i = 0; u8 d1, d2, dm1, dm2; u32 log_start_adr, log_end_adr; + u32 m_log_start_adr, m_log_end_adr; + MyFileEntry* gFileEntry; + MyFileEntry* mFileEntry; while( fread( logBuf, 6, 1, lfp)) { @@ -972,7 +975,7 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, (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) + @@ -982,18 +985,35 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, (GetOctValue(&logBuf[0x0E]) * 0x1000000) + (GetOctValue(&logBuf[0x0D]) * 0x10000000)); printf( "%d 0x%lx - 0x%lx", i, log_start_adr, log_end_adr); - - if( entry->FindFileLocation( log_start_adr, log_end_adr)) - { // TODO:genuine側の対応アドレスはgenuineファイルエントリの先頭から計算し直す + + gFileEntry = entry->FindFileLocation( log_start_adr, log_end_adr); + if( gFileEntry) + { // 当該ファイルのアクセスログをマジコン側に変換(ファイルの位置が改竄されている場合のため) + mFileEntry = mEntry->FindFileEntry( gFileEntry->full_path_name); + m_log_start_adr = (log_start_adr - gFileEntry->top) + mFileEntry->top; + m_log_end_adr = (log_end_adr - gFileEntry->top) + mFileEntry->top; + // アクセスログが異なる場合はそれを明示 + 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); + } + // ファイル名とファイルとしての改竄有無を表示 + if( gFileEntry->modified) + { + printf( " %s(*)", gFileEntry->full_path_name); + }else{ + printf( " %s", gFileEntry->full_path_name); + } + // 当該アクセスログにおける改竄の有無を表示 if( Diff( log_start_adr, (log_end_adr - log_start_adr), - log_start_adr, (log_end_adr - log_start_adr), + m_log_start_adr, (m_log_end_adr - m_log_start_adr), true, PRINT_LEVEL_0)) { printf( "[data]"); }else{ printf( "[data(*)]"); } - + if( gHeaderBuf->platform_code & 0x03) { GetDigestResult( context, log_start_adr, log_end_adr, &d1, &d2); @@ -1013,7 +1033,7 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, else { if( d2) { printf( "[d2(*):OK]");} else { printf( "[d2(*):NG]");}; - } + } } // 領域名も表示 entry->FindAreaLocation( log_start_adr, log_end_adr); @@ -1029,7 +1049,7 @@ void Checker::FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, printf( "[data]"); }else{ printf( "[data(*)]"); - } + } } printf( "\n"); } diff --git a/build/tools/TamperDetectorForSrl/checker.h b/build/tools/TamperDetectorForSrl/checker.h index 09ab804..181cb69 100644 --- a/build/tools/TamperDetectorForSrl/checker.h +++ b/build/tools/TamperDetectorForSrl/checker.h @@ -40,13 +40,13 @@ class Checker public: void Initialize( FILE* myGfp, FILE* myMfp, void* myGbuf, void* myMbuf, u32 size); - + /* ヘッダを読むだけ */ bool LoadHeader( void* gHeaderBuf, void* mHeaderBuf); /* ROMの特定領域に差がないかどうか調べる */ bool Diff( u32 g_offset, u32 g_size, u32 m_offset, u32 m_size, bool isDataOnly, PrintLevel print_enable); - + void Finalize( void); /* ROMヘッダの各領域を管理リストに登録する */ @@ -71,8 +71,8 @@ class Checker u32 GetOctValue( char* hex_char); - void FindAccessLogFile( RomHeader* gHeaderBuf, Entry* entry, FILE* lfp, CARDRomHashContext *context); - + void FindAccessLogFile( RomHeader* gHeaderBuf, Entry* mEntry, Entry* entry, FILE* lfp, CARDRomHashContext *context); + }; #endif diff --git a/build/tools/TamperDetectorForSrl/entry.cpp b/build/tools/TamperDetectorForSrl/entry.cpp index a225820..f4403b9 100644 --- a/build/tools/TamperDetectorForSrl/entry.cpp +++ b/build/tools/TamperDetectorForSrl/entry.cpp @@ -207,9 +207,9 @@ MyFileEntry* Entry::FindFileLocation( u32 start_adr, u32 end_adr) retEntry = currentEntry; if( currentEntry->modified) { // 改竄されているファイルの識別表示 - printf( " %s(*),", currentEntry->full_path_name); +// printf( " %s(*),", currentEntry->full_path_name); }else{ - printf( " %s,", currentEntry->full_path_name); +// printf( " %s,", currentEntry->full_path_name); } } currentEntry = (MyFileEntry*)(currentEntry->next); diff --git a/build/tools/TamperDetectorForSrl/main.cpp b/build/tools/TamperDetectorForSrl/main.cpp index 655e5ff..b7765c0 100644 --- a/build/tools/TamperDetectorForSrl/main.cpp +++ b/build/tools/TamperDetectorForSrl/main.cpp @@ -139,7 +139,7 @@ int main (int argc, char *argv[]) lfp = fopen( log_fname, "r"); printf( "\n\n\nACCESS LOG\n"); - checker.FindAccessLogFile( &gHeaderBuf, &gEntry, lfp, &context); + checker.FindAccessLogFile( &gHeaderBuf, &mEntry, &gEntry, lfp, &context); printf( "------------------\n"); } diff --git a/build/tools/TamperDetectorForSrl/searcharg.cpp b/build/tools/TamperDetectorForSrl/searcharg.cpp index 4a56cb9..f9f94be 100644 --- a/build/tools/TamperDetectorForSrl/searcharg.cpp +++ b/build/tools/TamperDetectorForSrl/searcharg.cpp @@ -27,8 +27,7 @@ char* log_fname = NULL; void SA_Usage( void) { fprintf( stderr, "Analyzing Tool\n"); - fprintf( stderr, "Usage: makelst [-o output-file] [--g genuine-srl-file] [--m magicon-srl-file]\n\n"); - fprintf( stderr, "Usage: makelst [-o output-file] [--g genuine-srl-file] [--l access-log-file]\n\n"); + fprintf( stderr, "Usage: tamperdetector [-o output-file] [--g genuine-srl-file] [--m magicon-srl-file] [--l access-log-file]\n\n"); exit( 1); } @@ -47,7 +46,7 @@ void SA_searchopt( int argc, char* argv[]) if( argc <= 1) { SA_Usage(); } - + while( (n = getopt_long( argc, argv, "do:h", &optionInfo[0], NULL)) != -1) { diff --git a/build/tools/TamperDetectorForSrl/tamperdetector.exe b/build/tools/TamperDetectorForSrl/tamperdetector.exe index ed4d6140a322a29b51e0557c0f720b223da88abf..97d17d9e1dd6cef46e33df09e725be2630818c20 100755 GIT binary patch delta 15986 zcmaJ|30zdw{=etWFn45E_F)?~Wfx>o5pYhH{?hG?yzW;naGv}P|@B3TM@2vNt@4Thn z^_F_wD%n?8{?*<#NtSIpr2XgDNiSVaMvxl19eyL|G15(T(tq-kiEGDIK8YxLiZopB z5*i_QC++Na1^ZpZerxGwxfl6?ekym)>z>YWEjN@ax^y|+ss3_qordd{`*X`Q+`!Q- zRZnU-kVFCUdIK1Io{{AY0`hx+waWc_TLx`-0JDk)TEz0P(`ku?6F*`)eZt}so|{6S z6V&7~ovs+kzneqP3Tl3R&htuF@(+4Y(M{f>ZGsP3N8b@fk^*{0@Zl3DgOm@QOjXM7 zZ7Z`mjEZm^*Bg@EaZkC1I3LX7xa$sW+B>Zf2?!(SLxAtnO_uIX&x5EXSC4a zRDUIO82J6zMd%Rbx*R2Pe@jfoa;d%)@mF?w0c-_)OJ9OdM`_IrngqA{|EJ2O!S_hXNLtwWSi+}O!T6m{^h}`t(T_d zwcN;oo?}P;q_GaqkhOHbgBw39g%;We@QEqUJErirlj-NSQ6ml|v%sPn!P!x$w`p%c z8kB9?KK+1CLF zuw34w$<8(81-jE&17qFi?9Zz;)Y&B#MtPEpFK?lt^IhU0#CKhMtY055jRZvgD*f5T zolK*Dx~wGM(xt8eFlbv{1IaS_Z`Xj(8HpVCh4xRfymF$I)1iB=FMYkqy7y9;xIswe}oOj?yg8Z1{cI zGqt&=P1^%*tlPBc4aVoBetc#wfbp3;7R@06BrF_QaM<~E!I+I3ElX~2c27s}$hv`v zGS2il5ypulzV(!etQWkE)Bds$y!MRK z_Ucq^+FmJ$U-aSCV|csAFvoU#G>%Vq>0FI5z!Gag!a5*acQ(VHMZ5_Wr$Pi)y{!;e z+tkzGh<@ws(Tw)3Tk}o&%Le=Q-GKpcVGD-WpaCB=jJwkYY&ozvtRaqJcKf?pdSoyZ zPhW%KS*`s6?Afo@{)lED&ZGxs()-%Lz-sMriFTs-fASVw9T z`q2{To|j4CV}^6Nvg6 z%=KW)5n2!Tj?I%#gTU+3M~b$BNJ_kM2wLe;Z}(|9(H=1dg@2llL2InOM{Eq9gckIU z?X1lx840cH7+f{9a7`qsJ*>i^-l9E8uwAA0a1)>ngSDaSX;?gO|1~hsawx0lvEo?= z=|;8lw0=~-9s|aT*yLpM8_as>0RIYbBMJs_H1or7*57Gaa))D+g@v;lE!cye59+;4 zEq(mUmI4MyJR)?!IT6s3+iSx?efVZnbgrYvBc#Hn_O4)(_kCwCr0bjdl*|0 z(1HnbSX*sC_dDI;mkL|uZTOu`WBq+d3@z|a<@+M(M*pOkT%_)eZ_0?!2O}8y@k{fvzu!-!Z#;NwuIbXZ`N=ZJ6|lDpEPhaK)N2B6

6_ib6^dCXN{K-%_F#Y(CLg9GygVXR&z{)~t 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