try { /* code */ } catch (...) { }
ãäœæããããã³ãã«ãéããŠWindows Vistaä»®æ³åã«ã€ããŠç¥ãããšãã§ããããã°ã©ã ã¯ã¯ã©ãã·ã¥ããŸãããŸãã«ç¹°ãè¿ãããçç±ã
ãã®åŸãéãè¯ããã°ã次ã®ãããã¯ã«é²ãããšãã§ããŸãã
ããããæã ãå¥åŠãªããšãèµ·ããããã§ãã ããã°ã©ã ã¯çªç¶ãã¯ã©ãã·ã¥ãããã¡ã¢ãªãã©ããã§ãªãŒã¯ãããµãŒããŒã§å®è¡ãããŠããããã°ã©ã ã®å¥åŠãªåäœã«ã€ããŠäžå¹³ãèšã£ãŠããäžåºŠé»è©±ããããŸãããããã¡ããããªãã¯åé¡ããã©ãããããŠãããŒããŠã§ã¢ã«äŸåããŠãããšç¢ºä¿¡ããŠããŸããããŠå€§äžå€«ã ããã§ããWindowsçšã®ããã°ã©ã ã®éçºã¯ãã°ãã°ããªãããŒã§ãããäžæ³šæãŸãã¯ã¢ãŒããã¯ãã£ã®ç¡ç¥ã«ãããšã©ãŒãã誰ãå®å šã§ã¯ãããŸããã ç§ã¯ãããã®ééããé¿ããæ¹æ³ãåŠã³ãŸãã-ç§ã¯èªåèªèº«ãç¥ããŸããã ããããããã§å¹æçãªãããã°ã®ããã®1ã€ã®ããŒã«ãã¢ããã€ã¹ã§ããŸãã
ããã¯ãMicrosoft Application Verifierã«ã€ããŠã®ãã®ã§ãã ããããããã¯ãããã¬ãŒã§ã¯ãããŸããã ããã©ãããããããã¬ãŒããªããã°ãããèªäœã¯æ¯èŒç圹ã«ç«ããªãã ãããããããšçµã¿åãããŠãå€ãã®éèŠãªãã©ãããã©ãŒã åºæã®åé¡ãæ€åºã§ããŸãã ããã«ãAppVerifierã䜿çšãããã¹ãã«åæ ŒããªãéãããWindows 7ãšäºææ§ããããŸããã蚌ææžãååŸããããšã¯ã§ããŸããïŒå®éã«ã¯ãVista Certifiedãã§ãåæ§ã§ãããæããã«ããã¯åãå ¥ããããŸããïŒã ãããŠããã®èšŒææžã¯ããŠãŒã¶ãŒã«å¯ŸããŠããããåãåã£ãããã°ã©ã ãããè¯ããªããªããããããªãããšãä¿èšŒããŸãããå°ãªããšãããã¯å·ã€ããŸãã ã ããŠããæ°Žãã¯çµãããŸãããä»äºã«åãæãããŸãããã
ç³ã蟌ã¿æ¹æ³
HabrochelovekaçšAppVerifierãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŠãã ãããè€éã§ã¯ãããŸããã ã°ã©ãã£ã«ã«ã·ã§ã«ãå®è¡ããŠã¿ãŸãããïŒå®éã®ç®¡çè ã®äžãããVistaã®äžã§ãããã¯å¥ã®æ¹æ³ã§ã¯æ©èœããŸããïŒã
å·ŠåŽã«ã¯ããã¹ãçšã®ã¢ããªã±ãŒã·ã§ã³ã®ãªã¹ãããããŸãã å³åŽã«ã¯ãéžæããã¢ããªã±ãŒã·ã§ã³ããã§ãã¯ããã»ã¯ã·ã§ã³ã®ãªã¹ãããããŸãã MSDNã¯ãAppVerifierã¯C ++ããã°ã©ã ããã¹ãããããã«èšèšãããŠããããäžè¬ã«ãã€ãã£ãã³ãŒãã«é©çšå¯èœã§ãããšäž»åŒµããŠããŸãã
ã°ã©ãã£ã«ã«ã·ã§ã«ã¯ãã¹ããçæãããç®çã®é ç®ãéžæããããšã®ã¿ãå¯èœã«ããŸãã ãã§ãã¯èªäœã¯ããããããã¬ã€ã€ãŒããåçã«æ¥ç¶ãããã©ã€ãã©ãª
vfbasics, vfcompat, vfLuaPriv, vfprint
ãããã§å®è£ ãããŸãïŒ
system32
ããããéè³ã§ã
system32
ïŒã ãã¹ã察象ã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ãã
HeapAlloc, GetTickCount, CloseHandle
ãªã©ã®ã·ã¹ãã é¢æ°ã®åŒã³åºããã€ã³ã¿ãŒã»ããããŸãã ã€ã³ã¿ãŒã»ãã¿ãŒã¯ããã€ãã®è¿œå ãã§ãã¯ãå®è¡ããå ã®é¢æ°ãåŒã³åºããŸãããããã£ãŠã 以äžã§æ€èšããããã€ãã®ã±ãŒã¹ãé€ã ãããã¯ãã¹ã察象ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœã«åœ±é¿ããŸããã ããã©ãŒãã³ã¹ã®äœäžãé¡èã§ãªãéãã 䞻芳çã«ãææªã®å Žåãããã°ã©ã ã¯5åãã¹ããŒããŠã³ãããŸããç¹å®ã®æ°å€ãå¿ èŠãã©ããã¯ãããªãã«ä»»ããŸãã
ããã«ã¯éèŠãªæ©èœããããŸã ïŒãã¹ãäžã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã«ãè¿œå ãããšãã«éžæãããšããäºå®ã«ããããããããã§ãã¯ã¯ãã¹ãªãã§ãã®ååã«ã®ã¿æ·»ä»ãããŸã ã ãããžã§ã¯ããåéããæ§æïŒããã³ãã©ã«ããŒïŒãå¿é ããå¿ èŠã¯ãããŸããïŒéåžžããããã°ãšãªãªãŒã¹ã®ãã©ã«ããŒã¯ç°ãªããŸãïŒããã€ã³ã¹ããŒã«ããããã§ãã¯ãå¿ããããšãã§ããŸãããŸãããã¹ã¯ãããããããã°ã©ã ãèµ·åãããšãåäœããŠããŸãããã
ãã¹ãé ç®ã®æå³ã«ã€ããŠã¯åŸã»ã©èª¬æããŸããã次ã«ãããšãã°notepad.exeãè¿œå ããŠããã¹ãŠã®Dawãã€ã³ã¹ããŒã«ããŸãã ããŒãããã¯ãå®è¡ããæ°è¡ãè¿œå ããŠãä¿åããŠã¿ãŠãã ããã O-paã倱æïŒ
ç¶æ³ã®å¯äžã®çµæã§ã¯ãªããå¥ã®èŠåãŠã£ã³ããŠã衚瀺ããããããŸã£ãã衚瀺ãããªãå ŽåããããŸãã ã©ãããã®ïŒ AppVerifierã°ã©ãã£ãã¯ã¢ãã€ã³ãããäžåºŠèŠãŠã¿ãŸãããã ä»åã¯ãã¡ã€ã³ã¡ãã¥ãŒãã[ãã°]é ç®ãéžæããŸãããã¹ããããã¢ããªã±ãŒã·ã§ã³ã«é¢é£ä»ãããããã°ãã¡ã€ã«ã®ãªã¹ããåç §ããŠãã ããã èµ·åãã°ã«ããã
ç©ççã«ããããã®ãã°ãã¡ã€ã«ã¯ãŠãŒã¶ãŒãããã¡ã€ã«ã®ã«ãŒãã«ãã
AppVerifierLogs
ãã©ã«ããŒã«ãããŸãã çŽ æïŒãã€ããªåœ¢åŒïŒã§ããããèªãã®ã¯é£ããã®ã§ã察å¿ãããã°ã®[衚瀺]ãã¿ã³ãæŒããŸãã ãããxmlã«ãã³ãããxmlã®ããã©ã«ããã¥ãŒã¢ãŒãéããŸãã
泚ææ·±ãèŠã人ã®ããã«ïŒãã®ã¹ã¯ãªãŒã³ã·ã§ããã«è¡šç€ºããããšã©ãŒã¯ãåã®ã¹ã¯ãªãŒã³ã·ã§ããã®ãšã©ãŒã¡ãã»ãŒãžïŒããã°ã©ã ã®éåžžã®åäœïŒã«å¯Ÿå¿ããŠããŸããããå°ãé ããŠçºçããŸãã
åé¡ã®ç°¡åãªèª¬æãšã¹ã¿ãã¯ãã¬ãŒã¹ã次ã«ç€ºããŸãã ãããŠãç§ããã¯ãèŠåã§ã¯ãªããšã©ãŒãæ¢ãæ¹æ³ã®ãã³ãããããŸãã ã¡ãªã¿ã«ããšã©ãŒãååšããå Žåãããã°ã©ã ã¯Vista / Win7ãšã®äºææ§ã®èªå®ãåããŸããã åŸ ã£ãŠãã ãããã§ãããã¯ããŒãã§ããïŒïŒ ãŸããã¯ããå¯äžã®ã·ãã
æ£è ã®æ²»ç
ãããã¬ãŒãå®è¡ããŸãã ã¹ã¿ãžãªã«çµã¿èŸŒãŸãããããã¬ãŒããŸãã¯Debugging Tools for Windowsã®ç¡æã®WinDbgãšããŸãïŒç¢ºãã«ãã£ãšæŽç·ŽãããŠããŸãããä»ã§ã¯éèŠã§ã¯ãããŸããïŒã
ãããŠãããã«ç§ãã¡ã®æ£è ãããŸãïŒ
int _tmain( int argc, _TCHAR* argv[])
{
int *p = new int ();
delete p;
*p = 0; // p = 0 will be OK, but *p = 0 is error!
}
ãã®ãã©ã°ã¡ã³ãã®æœåšçãªå±éºæ§ã¯ã
delete
ãšã¡ã¢ãªã®äžæžãã䌎ãè¡ãæéãšãšãã«åŒã䌞ã°ããããã©ãããç°¡åã«è©äŸ¡ã§ããŸãã ãã ãããªãªãŒã¹ã§ããªãªãŒã¹ã¢ã»ã³ããªã§ãããã®ãããªåé¡ã¯æ€åºãããŸããïŒVisual Studioãæ¢å®ã®æ§æïŒã
ããã§ãApplication Verifierã®Basicsã°ã«ãŒãããã¹ãããããã®ããã°ã©ã ãè¿œå ããŸãã ãããŠããããã¬ãŒã®äžã§ïŒããšãã°ãF5ã®ã¹ã¿ãžãªããïŒå®è¡ããŸãã AppVerifierã¯ã¹ã¿ãžãªã®å£°ã§ç§ãã¡ã«è©±ããŸããïŒ
ãŸãããããã°åºåã«ã¯ã察å¿ããæ§é çãªäŸå€ã衚瀺ãããŸãã
=======================================
VERIFIER STOP 00000013: pid 0xB54: First chance access violation for current stack trace.
02B59FF8 : Invalid address causing the exception.
0082142F : Code address executing the invalid access.
0013F670 : Exception record.
0013F68C : Context record.
=======================================
äŸå€ãäœã§ãããïŒ00000013ïŒãã©ã®ã¡ã¢ãªã¢ãã¬ã¹ïŒ02B59FF8ïŒãã©ã®ã³ãŒãã¢ãã¬ã¹ïŒ0082142FïŒã§çºçããããããããŸãã Windowsãããã°ã·ã³ãã«ãããŠã³ããŒããã幞éãªäººã¯ãåé¡ãçºçãããœãŒã¹ã³ãŒãå ã®å ŽæãšäŸå€ã«ã€ãªãã£ãã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ãããŸãã
ããŠãç§ãã¡ã¯ãã®åé¡ãçºèŠããŸãããã€ãŸããä¿®æ£ãããšããããšã§ãã ä»ã®ãšã©ãŒã¯ã©ã¹ã®å Žåãæäœã¢ã«ãŽãªãºã ã¯ä¿æãããŸãããä¿®æ£æé ã¯ããã»ã©ç°¡åã§ã¯ãªãå ŽåããããŸãã
æ€åºå¯èœãªåé¡
ããã§ãAppVerifierãã©ã®åé¡ãèå¥ã§ããã®ããèããŠã¿ãŸãããã ãã¹ãŠã®ãã¹ããªãã·ã§ã³ã¯ã°ã«ãŒãã«åããããŸãã äœãªãœãŒã¹ã·ãã¥ã¬ãŒã·ã§ã³ã°ã«ãŒããšTimeRollOverããã³HighVersionLieãã¹ããé€ãããã§ãã¯ã¯ã¢ããªã±ãŒã·ã§ã³ã®åäœãå€æŽããŸããïŒãšã©ãŒãæ€åºãããªãå ŽåïŒã
1.æªã¿ã®ãã§ãã¯
1.1ã äœãªãœãŒã¹ã·ãã¥ã¬ãŒã·ã§ã³
ãããããŒãããã¯ã®èœäžã®çç±ã§ãã ãã®ã°ã«ãŒãã®ãã¹ãã§ã¯ããªãœãŒã¹äžè¶³ã®ã·ã¹ãã ã®åäœãã·ãã¥ã¬ãŒãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãã¡ã¢ãªå²ãåœãŠããã¡ã€ã«äœæãã€ãã³ãããŠã£ã³ããŠãããã³ã¬ãžã¹ããªãšã³ããªãç°¡åã«æåŠã§ããŸãïŒä¹±æ°ã»ã³ãµãŒã䜿çšïŒã éåžžãçŽ2ã5ç§ã®ãç©ãããªãæéããããã¢ããªã±ãŒã·ã§ã³ããªãœãŒã¹ãå®å šã«äœ¿çšã§ããããã«ãªããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããããã«ããããã«è¡ãããŸãïŒä»¥åã«çºæããããã®ã§ã以åã¯æ²ãããã®ã§ããïŒã ããã°ã©ã ã®éåžžã®åäœã¯å®å®æ§ã§ãã èŠåãã€ã¢ãã°ã衚瀺ããŸããããã¯ã©ãã·ã¥ãã¯è¡šç€ºããŸããã ãã®ãããã³ãŒãã§ã¯ãããã®ç¶æ³ãæäŸããå¿ èŠããããŸãã
1.2ã ã°ã«ãŒãMiscã®TimeRollOver
action
æ°åå®è¡ãã1ç§ä»¥å ã®ã³ãŒãäŸãèããŠã¿ãŸãããã
DWORD time_end = GetTickCount() + 1000; // 1s timelimit
do { action(); } while (GetTickCount() < time_end);
ãã£ããã¯èçŒã§èŠãããšãã§ããŸãã
time_end
éåžžã«è¿ããã
DWORD_MAX-1000
æªæºã§ããã
action()
1ç§ä»¥äžãããå Žåãããå Žåããµã€ã¯ã«ã¯åžæããå°ãé·ããªããŸãã ã€ãŸãã50æ¥éïŒDWORD_MAX /ïŒ1000 * 60 * 24ïŒïŒã
ãããŠãããã¯ããªãã次ã®ãã©ã°ã¡ã³ãã«ã€ããŠèšãå¯äžã®ã±ãŒã¹ã§ã¯ãããŸãããïŒ
char buf[8];
sprintf(buf, "%i" , GetTickCount());
ãã®ãããªåé¡ã蚺æããã«ã¯ãTimeRollOverããã§ãã¯ãããšãGetTickCountïŒïŒé¢æ°ã®å€ãããéããå®è¡ããããŸãã ãŒã調æŽã®åã®å®å šãªãµã€ã¯ã«ã«ã¯5åããããŸãã
1.3ã äºææ§ã°ã«ãŒãã®HighVersionLie
çªç¶
GetVersionEx
é¢æ°ã䜿çšããå Žåããã®ãã¹ãã¯ãæå¹ãªOSããŒãžã§ã³ã®æ€èšŒãæ£ãããªãã³ãŒããã©ã³ãã®æ€åºã«åœ¹ç«ã¡ãŸãã
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof (OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx(&osvi);
BOOL bIsWindowsXP_or_Later = (osvi.dwMajorVersion >= 5) && (osvi.dwMinorVersion >= 1);
if (!bIsWindowsXP_or_Later)
printf( "Windows XP or later required.\n" );
ãã®ç®æã«ã¯æãããªééãããããŸãã Windows 2000ïŒ5.0ïŒãé®æããããã«ããã€ããŒããŒãžã§ã³XPïŒ5.1ïŒã«è¿œå ã®ãã§ãã¯ãå°å ¥ãããŸããããã³ãŒãã¯Windows VistaïŒ6.0ïŒãç Žæ£ããŸãã Windows 7ïŒ6.1ïŒã§ã¯åäœããŸãã ãããæ¬åœã«Windows Vistaãšã®äºææ§ãäœãçç±ã§ããïŒ Microsoftã¯ããã®åé¡ãå«ããVistaããã°ã©ã ãšã®äºææ§ã®ãªã70ïŒ ãæ©èœããªããšäž»åŒµããŠããŸã ã
ããããéçºè ã®ã³ââã³ãã¥ãŒã¿ãŒã§ãã®ç¶æ³ã蚺æããããšã¯å°é£ã§ãã圌ã¯ãOSã®1ã€ã®ä¿®æ£ããŒãžã§ã³ãæã£ãŠããŸãã OSã®ç°ãªãããŒãžã§ã³ã§ä»®æ³ãã·ã³ã䜿çšããããšããDAWã®HighVersionLieã䜿çšããããšãã§ããŸãã 次ã«ã
GetVersionEx
ã®å€ãå€æŽãããŸãïŒéåžžãã«ãŒã«
dwMajorVersion += 3; dwMinorVersion = 0
ïŒã
2.å€æŽããªããã§ãã¯
2.1ã åºæ¬ã°ã«ãŒãã®ã¡ã¢ãª
HeapAlloc, GlobalAlloc
ããã³ãã®ä»ã®WindowsããŒããããŒãžã£ãŒAPIãžã®åŒã³åºããæ€èšŒããŸãã 圌ã¯ã¡ã¢ãªãªãŒã¯ãç£èŠããŠããŸããããããã¯ä»ã®æ¹æ³ã§è§£æ±ºã§ããŸã ã
2.2ã åºæ¬ã°ã«ãŒãã®TLS
ã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžAPIãžã®åŒã³åºãã®æ£ç¢ºããç£èŠããŸãã
2.3ã åºæ¬ã°ã«ãŒãã®äŸå€
äŸå€ããã£ããããããšã®é©åæ§ãç£èŠããŸããç¹ã«ãã¢ã¯ã»ã¹éåäŸå€ã
try { } catch (...) { }
ãªã©ã®ã¹ã¿ãå ã®äŸå€ãããã¹ã¯è§£é€ãããããšããè©Šã¿ãç£èŠããŸãã
2.4ã Basicsã°ã«ãŒãã®ãã³ãã«
ãã³ãã«ã«å¯Ÿããæäœã®èš±å®¹æ§ããã³ãã«ã®æ£ç¢ºæ§ãããã³ãã®å¯¿åœãç£èŠããŸãã ããå°ãè±èªã§ ã
2.5ã [åºæ¬]ã°ã«ãŒãã®ããã¯
ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®æ£ãã䜿çšããã§ãã¯ããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³èšå®ã«é¢é£ããå¥ã®ã¹ããªãŒã ããã®ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®ãããããèš±å¯ããŸããã
2.6ã ãã³ãMiscã®DirtyStacks
ã¹ã¿ãã¯ã®æªäœ¿çšéšåã0xCDãã¿ãŒã³ã§å®æçã«åããŸããããã«ãããåæåãããŠããªãå€æ°ãŸãã¯é¢æ°ãã©ã¡ãŒã¿ãŒãæ€åºã§ããŸãã
2.7ã Miscã°ã«ãŒãã®DangerousAPI
TerminateThread
ãããªæãŸãããªããæœåšçã«å±éºãªAPIé¢æ°ã®äœ¿çšã«ã€ããŠéç¥ããŸãã
2.8ã ã«ã¢ããªã
éå®ãŠãŒã¶ãŒã¢ã«ãŠã³ãç¹æš©ãã¹ãã ããã°ã©ã ã«ç®¡çè ç¹æš©ãå¿ èŠãã©ããã確èªããããã°ã©ã ã¯å®éã®ç®¡çè ã ãã«æå¹ãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
äºæž¬ïŒç®¡çè ã®ã¿ãå®è¡ã§ãããã¹ãŠã®ããã°ã©ã ã¢ã¯ã·ã§ã³ãäžèŠ§è¡šç€ºããïŒãšèšºæïŒ
ACCESS_DENIED
ãšã©ãŒã§ç®¡çã¢ã¯ã·ã§ã³ã§ããã°ã©ã ãæåŠããïŒã®2ã€ã®éšåã§æ§æãããŸãã ãããã£ãŠãããã°ã©ãã¯ã²ã¹ããšããŠãã°ã€ã³ããŠããã°ã©ã ãåå¥ã«ãã¹ãããå¿ èŠã¯ãããŸããã ãŸããWindows Vista以éã§ã®ä»®æ³åã«é¢é£ããå€ãã®æ©èœããã§ãã¯ããŸãã
ãããã«
AppVerifierã¯ãå€ãã®ããããŒãã£ã³ã°ãããã³ãé ããããïŒããã³å Žåã«ãã£ãŠã¯ç¹å¥ã«é ãããïŒåé¡ãç¹å®ããŠè§£æ±ºã§ããèå³æ·±ãããŒã«ã§ãã å šäœãšããŠäœ¿çšããããšã¯é£ãããããŸãããç¹å®ã®ã¹ãã«ããããšäŸ¿å©ã§ãã ãŸãããWindowsäºæãã®èšŒææžãåãåãããå Žåããããç¥ã£ãŠããããšã¯é¿ããããŸããã ç§ã¯ãã§ã«2ã€ã®ãããžã§ã¯ããæäŒããŸããããããªãã«ãšã£ãŠã圹ã«ç«ã€ããšãé¡ã£ãŠããŸãã
*ãã¹ãŠã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã