win32k.sys©¶´ÍÚ¾ò˼·½â¶Á

Ðû²¼Ê±¼ä 2020-05-09

Ò»¡¢Ñо¿Åä¾°


4ÔÂ1ÈÕ£¬ÒÔÉ«ÁÐÄþ¾²Ñо¿Ô±Gil DabahÔÚ²©¿ÍÉÏÐû²¼ÁËһƪ¹ØÓÚwin32k©¶´Ñо¿ÎÄÕ£¬ÃèÊöÁËÈçºÎͨ¹ýÄں˹¤¾ßµÄDestroyº¯ÊýºÍwin32k user-mode callback»º½â´ëÊ©µÄÌØÐÔÀ´Ñ°ÕÒUAF©¶´µÄÐÂ˼·¡£


Ϊ´Ë£¬¶«É­Æ½Ì¨ADLab¶Ôwin32kÏà¹ØÄں˻úÖƽøÐÐÑо¿·ÖÎö£¬²¢¶ÔÕâÀ੶´µÄÍÚ¾ò˼·½øÐÐÏêϸ½â¶Á·ÖÎö¡£


¶þ¡¢win32k©¶´»º½âÓë·´¿¹


2.1 win32k user-mode callback©¶´


ÓÉÓÚÉè¼ÆÔ­Òò£¬win32kÇý¶¯ÐèÒª´¦ÖúܶàÓû§²ãµÄ»Øµ÷£¬ÕâЩ»Øµ÷¸øwin32kÄ £¿éµÄÄþ¾²´øÀ´Á˷dz£´óµÄÒþ»¼£¬²¢ÔÚ¹ýÈ¥10Äêʱ¼äТ¾´ÁË´óÁ¿µÄ©¶´¡£


ΪÁ˱ãÓÚ©¶´ÃèÊö£¬ÒÔÈçÏÂα´úÂë½øÐоÙÀý·ÖÎö¡£


NtUserSysCall()

 £û

     PWND p = CreateWindowEx(¡­);

     somecallback();

     xxxSetWindowStyle(p);

 £ý


ÉÏÊö´úÂëÖ´ÐÐЧ¹ûÈçÏÂͼËùʾ£¬Óû§²ãÖ´ÐеÄijº¯Êýͨ¹ýsyscall´«ÈëÄں˲㣬µ±Äں˲ã´úÂëÖ´Ðе½somecallbackÕâÒ»¾äʱ£¬Óû§²ã¿ÉÒÔÔÚÓû§½ç˵µÄcallbackº¯ÊýÖлñµÃ´úÂëÖ´ÐеĻú»á£¬Èç¹ûÓû§ÔÚcallbackº¯Êýµ÷ÓÃÁËDestroyWindowº¯ÊýÏú»Ù´°¿Úp£¬Äں˲ãµÄÏàÓ¦Ïú»Ù´úÂ뽫»á±»Ö´ÐУ¬pµÄÏàÓ¦ÄÚ´æ±»ÊÍ·Å£¬»Øµ÷Ö´ÐÐÍê±Ï£¬NtUserSysCallº¯Êý¼ÌÐøÖ´ÐУ¬µ±Ö´Ðе½xxxSetWindowStyle(p)Ò»¾äʱ£¬ÓÉÓÚpµÄÄÚ´æÒѾ­±»ÊÍ·Å´Ó¶øµ¼ÖÂUAF©¶´µÄ·¢Éú¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


2.2 user-mode callback©¶´»º½â»úÖÆ


ΪÁË·ÀÖ¹ÉÏÊöÎÊÌâµÄ·¢Éú£¬Î¢ÈíÔÚ¹¤¾ßÖÐÒýÈëÁËÒ»¸öÒýÓüÆÊý£¨¹¤¾ß+0x8´¦£©£¬¹¤¾ß·ÖÅäʱÒýÓüÆÊýΪ1£¬µ±Ö´Ðй¤¾ßµÄDestroyº¯ÊýʱÒýÓüÆÊý¼õ1£¬µ±ÒýÓüÆÊýΪ0ʱ¹¤¾ß»á±»ÕæÕýÊÍ·Å¡£Î¢Èíͨ¹ýËøµÄ¿´·¨Îª¹¤¾ßÌí¼ÓºÍ¼õÉÙÒýÓüÆÊý£¬ÔÚwin32kÖÐΪ¹¤¾ß¹ÜÀíÒýÓüÆÊýµÄËøÓÐÁ½ÖÖ·Ö±ðÊÇÁÙʱËø£¨ÏàÓ¦º¯ÊýΪThreadLock/ ThreadUnlock£©ºÍÓÀ¾ÃËø£¨ÏàÓ¦º¯ÊýΪHMAssignmentLock/ HMAssignmentUnlock£©¡£¾­¹ý¼Ó¹ÌÖ®ºó´úÂëÌåÏÖΪÈçÏÂÐÎʽ£º


NtUserSysCall()

 £û

     PWND p = CreateWindowEx(¡­);

     ThreadLock(p);

     Somecallback();

     xxxSetWindowStyle(p);

     ThreadUnlock();

 £ý


ͨ¹ýÉÏÊö´úÂ룬¿ÉÒÔ±£Ö¤¼´Ê¹callback±»Ö´ÐУ¬pÔÚxxxSetWindowStyleº¯ÊýÖ´ÐеÄʱºòÒ²²»»á±»ÊÍ·Å¡£


2.3»º½â»úÖƵķ´¿¹¼¼Êõ


ÉÏÒ»½ÚÌáµ½Á˹¤¾ßµÄÒýÓüÆÊý£¬Èç¹û¹¤¾ßµÄÒýÓüÆÊýΪÕý£¬¼´Ê¹Ö´Ðй¤¾ßµÄdestroyº¯Êý£¬¹¤¾ßûÓÐÕæÕý±»ÊÍ·Å£¬ÈԾɴæÁôÔÚÄÚ´æÖУ¬ÕâÖÖ¹¤¾ß±»Î¢Èí¿ª·¢Õß³ÆΪ½©Ê¬£¨Zombie£©¹¤¾ß¡£Ò»µ©½©Ê¬¹¤¾ßµÄÒýÓüÆÊý¼õÉÙµ½0Ëü½«»áÏûʧ£¬µ«ÊÇÔÚ´Ë֮ǰËüÈԾɴæÔÚÄÚ´æÖУ¬Ö»ÊÇÓû§²ãÎÞ·¨·ÃÎʸù¤¾ß¡£


ͬʱΪÁË·ÀÖ¹½©Ê¬¹¤¾ß¼ÌÐø´æÁôÔÚÄÚ´æÖУ¬ËøµÄÊͷź¯Êý£¨ThreadUnlock/ HMAssignmentUnlock£©Ò»°ã»á°üÂÞ¹¤¾ßµÄÊÍ·Å»·½Ú¡£


¹¤¾ßµÄDestroyº¯Êý»¹ÓÐÒ»¸öÌØÐÔ¾ÍÊÇÔÚÊͷŹ¤¾ßµÄͬʱ£¬Destroyº¯ÊýÒ²»áÊͷŹ¤¾ßµÄ×Ó×ÊÔ´£¬Æä¹ý³Ì¿ÉÒÔ¼òÒªÃèÊöÈçÏ¡£


void xxxDestroyWindow(PWND pwnd)

 £û

     xxxFW_DestroyAllChildren(); // Destroy child windows, if exist!

     if (NULL != pwnd->spmenu)  // If there¡¯s a menu, remove and destroy it.

     £û

         PMENU tmp = pwnd->spmenu;

         if (HMAssignmentUnlock(&pwnd->spmenu)) // If it¡¯s still locked

           £û

               DestroyMenu(tmp); // Try destroying it (it can remain a zombie).

           £ý

      £ý

     DereferenceClass(pwnd);

     if (HMMarkObjectDestroy(pwnd)) // Check for zero refs!

           HmFreeObject(pwnd); // Only now free the object and handle pair.

 £ý


DestroyWindowÔÚµÚÒ»´Îµ÷ÓÃʱÊÍ·Å×Ó×ÊÔ´£¬Ò»µ©´°¿Ú²»ÔÙ±»ÒýÓ㬾ä±ú¹ÜÀíÆ÷¾Í»áÔÙ´ÎÍêÈ«Ïú»ÙËü£¬Ò»°ãÇé¿öÏ£¬µÚ¶þ´ÎÏú»ÙDestroyº¯Êý²»»áÔÚÈ¥´¦ÖÃ×Ó×ÊÔ´£¬ÒòΪµÚÒ»´ÎÒѾ­ÊÍ·ÅÁËËùÓеÄ×Ó×ÊÔ´¡£


µ«ÊÇÊÂÇéÍùÍù²»ÊÇÕâô¼òµ¥£¬ÊÂʵÉϼ´Ê¹ÊÇÒ»¸öÒѾ­µ÷ÓùýÏàÓ¦Destroyº¯ÊýÊͷŵĽ©Ê¬¹¤¾ß£¬ÈÔÈ»Óлú»á¶ÔÆä×Ô¼º½øÐÐһЩ¸ü¸Ä£¨»Øµ÷Ö®ºóÄں˴úÂëÈÔ»á¶Ô¹¤¾ß½øÐÐһЩ²Ù×÷£©£¬ÎÒÃÇ°ÑÕâÖÖÇé¿ö½Ð×öZombie Reload£¬µ±¸Ã½©Ê¬¹¤¾ßÓÉÓÚÒýÓüÆÊýΪ0¶ø±»ÕæÕýÊÍ·Åʱ£¬Ö®Ç°µÄ¸ü¸Ä²Ù×÷½«»á¸øÄں˴øÀ´Ò»Ð©Òþ»¼¡£


¶ÔÓÚÈçÏ´úÂëƬ¶Î£º


ThreadLock(pwnd);

xxxSomeCallback(); // Here we can destroy pwnd from user-mode.

InternalSetTimer(pwnd, ...);  // reuse pwnd without check wether it is destroyed

ThreadUnlock();

SomefunctionUseTimer();   //UAF of Timer


ÎÒÃÇÔÚÓû§²ã»Øµ÷ÖжÔpwndÖ´ÐÐÁËDestroyº¯Êý£¬È»ºóͨ¹ýInternalSetTimerΪ֮ÉèÖÃÁËÒ»¸ö¼ÆʱÆ÷£¬µ±ThreadUnlock½«pwndÕæÕýÊͷŵÄʱºò£¬¼ÆʱÆ÷Ò²½«±»ÊÍ·Å£¬ÄÇô½ÓÏÂÀ´¶Ô¼ÆʱÆ÷µÄ²Ù×÷½«»áµ¼ÖÂUAF©¶´µÄ·¢Éú¡£


Èý¡¢°¸Àý·ÖÎö


ÉÏÒ»½ÚÎÒÃÇÌÖÂÛÁ˹¤¾ßµÄÒýÓüÆÊýºÍËø¸ø¹¤¾ß´øÀ´µÄеÄÄþ¾²Òþ»¼£¬µ«ÊÇÕæÕýµÄÌôÕ½ÔÚÓÚÎÒÃÇÈçºÎÈ·¶¨Ò»¶Î´úÂëÖдæÔÚ©¶´£¬Òªº¦µãÊÇÈ·±£ÔÚunlockº¯ÊýÖÐÊͷŵŤ¾ßÔÚÔËÐе½ÓÐÎÊÌâµÄ´úÂëʱÆäÒýÓüÆÊýÓ¦¸ÃΪ1£¬Ö»ÓÐÕâÑùÎÒÃDzÅÆøÔÚÓû§²ã»Øµ÷µ÷ÓÃÆäDestroyº¯Êý£¬²¢Í¨¹ýunlockº¯Êý½«Õâ¸ö¹¤¾ßÕæÕýÊͷŵô£¨ÉÏËøµÄʱºò»á×ö+1´¦Öã©£¬ÕâÒ²ÊÇÎÒÃǽÓÏÂÀ´ÐèÒªÌÖÂ۵ġ£ÏÂÃæÎÒÃÇͨ¹ýÒ»¸ö°¸ÀýÀ´·ÖÎö©¶´ÍÚ¾ò˼·¡£


3.1©¶´³ÉÒò


ÏÂͼÊÇxxxMnOpenHierarchyº¯ÊýµÄ´úÂëƬ¶Î¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ͼÖÐͨ¹ýxxxCreateWindowEx¿ÉÒÔ»ñµÃÒ»¸ö·µ»ØÓû§²ãÖ´ÐÐcallbackº¯ÊýµÄ»ú»á£¬xxxCreateWindowEx´´½¨µÄ´°¿Ú½«×÷Ϊ¸¸´°¿Ú*(struct tagWND **)(**v3 + 8)£¨ÉÏͼºì¿ò£©µÄ×Ó´°¿Ú£¬Èç¹ûÎÒÃÇ¿ÉÒÔͨ¹ýThreadUnlockÊͷŸ¸´°¿Ú£¬ÄÇô×Ó´°¿Úv32Ò²»á±»ÊÍ·Å£¬ËùÒÔµ±ºóÐøµÄsafe_cast_fnid_to_PMENUWNDº¯Êý½«v32×÷Ϊ²ÎÊýÖ´ÐÐʱ¾Í»á·¢ÉúÎÊÌ⣬ֵµÃ×¢ÒâµÄÊÇͨ¹ý»Øµ÷ÊÍ·Åv32ÊÇÐв»Í¨µÄ£¬Èç¹ûÕâÑùxxxCreateWindowEx½«»á·µ»Ø0£¬ÎÞ·¨Í¨¹ýifÅжÏ¡£


ÕâÀïµÄÎÊÌâ¾ÍÔÚÓÚÈçºÎ±£Ö¤¸¸´°¿ÚÔÚThreadUnlockº¯ÊýÖ´ÐеÄʱºòÒýÓüÆÊýΪ1£¬ÒòΪҪִÐÐxxxMnOpenHierarchyº¯ÊýÐèÒª½«¸¸´°¿Ú¹ØÁªµ½Ò»¸ömenu´°¿ÚÉÏ£¬´Ëʱ¸¸´°¿ÚºÍmenu´°¿Ú½«»á±»Ò»¸öÓÀ¾ÃËøËøס£¬ÏÂÃæÎÒÃǽéÉÜÈçºÎÈƹýÓÀ¾ÃËø¡£


3.2 ©¶´ÍÚ¾ò˼·


Ê×ÏÈÎÒÃÇ´´½¨ÁËg_hMenuOwnerºÍg_hNewOwnerÁ½¸ö´°¿Ú£¬ÆäÖÐg_hMenuOwnerµÄ²Ëµ¥¾ä±úΪhMenu£¬ËüÒ²ÊÇg_hNewOwnerµÄËùÓÐÕß¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÔÚÉÏÊö´´½¨¹ý³ÌÖУ¬ÄÚºËͨ¹ýLockPopuMenuº¯Êý·Ö±ðΪhMenuºÍg_hMenuOwnerÌí¼ÓÁËÓÀ¾ÃËø£¬ÎªÁ˸濢ÊÍ·ÅÄ¿µÄ£¬Õâ¸öÓÀ¾ÃËøÐèÒª±»Èƹý¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


´ËʱËøºÍËùÓÐÕߵĹØϵÊÇÕâÑùµÄ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´ÎÒÃÇͨ¹ýSetWindowsHookEx¸ø´°¿ÚÌí¼ÓÁËWH_CBT¹³×Ó£¬²¢Èô°¿Ú½øÈëÏûϢѭ»·ÖС£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


SendMessage²Ù×÷Ϊg_hMenuOwnerÌí¼ÓÒ»¸öÁÙʱËø£¬ÓÉÓÚºóÐøµÄËùÓй¥»÷¶¼ÊÇÔÚmessageµÄ»Øµ÷ÖнøÐУ¬ËùÒÔ¶ÔÓÚg_hMenuOwnerÀ´ËµÕâ¸öÁÙʱËøÊÇÎÞ·¨ÊͷŵÄ£¬Èç¹ûÏëÒª½á¹¹Ò»¸ö©¶´ÀûÓû·¾³Ê×ÏÈÐèÒªÓÃһЩҪÁìÀ´ÈƹýËü¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

ÏÖÔÚµÄÇé¿öÄð³ÉÁËÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


µ±ÏûϢΪHCBT_CREATEWNDʱ£¬ÎÒÃǵÚÒ»´Îµ½´ïxxxMNOpenHierarchyº¯ÊýÄÚ²¿µÄxxxCreateWindowEx¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÕâÀï¿ÉÒÔͨ¹ý½ç˵¹ØÓÚHCBT_CREATEWNDÏûÏ¢µÄ´¦Öõõ½Ö´ÐÐÓû§²ã»Øµ÷´úÂëµÄ»ú»á£¬ÕâÒ»²½µÄÖ÷ҪĿµÄÊÇΪÁË»ñÈ¡MenuµÄWnd¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


µ±½ÓÊÕµ½µÄÏûϢΪWM_ENTERIDLEʱ£¬ÎÒÃÇÔÚ´°¿ÚµÄÏûÏ¢»Øµ÷ÖÐͨ¹ýPostMessageÏ·¢ÏûÏ¢¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


·¢ËÍÏûÏ¢ºó£¬Çý¶¯·¨Ê½À´µ½ÁËxxxMNKeyDownº¯ÊýÄÚ²¿µ÷ÓÃxxxSendMessage´¦¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ͨ¹ýWM_NEXTMENUÏûÏ¢µÄ»Øµ÷º¯Êý¿ªÊ¼ÎªLPARAM¸³Öµ£¬¸³Öµ²Ù×÷ÊÇΪÁËÐÞ¸ÄhMenuµÄOwner£¬ÕâÑù¾Í¿ÉÒÔ½«OwnerµÄÁÙʱËøÈƹý¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


´ËʱÄں˻á½Óµ½Ïú»ÙmenuµÄÏûÏ¢£¬Í¨¹ýÓû§²ãµÄ»Øµ÷º¯Êý·µ»Ø1×èÖ¹menuµÄÏú»Ù¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


xxxMNKeyDownº¯Êýͨ¹ýUnlockPopupMenu½«g_hMenuOwnerÉíÉϵÄÓÀ¾ÃËø±»È¥µô¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


È¡¶ø´úÖ®µÄÊÇg_hNewOwner¼ÓÉÏÁËÒ»¸öËø£¬hMenuµÄOwnerÒ²´Óg_hMenuOwnerÄð³ÉÁËg_hNewOwner¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Õâʱ£¬ËøµÄ¹ØϵÄð³ÉÁË£º

   

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´·¨Ê½µÚ¶þ´Î½øÈëµ½xxxMNOpenHierarchyº¯Êý²¢Í¨¹ýxxxSendMessage·¢ËÍÁËÏûÏ¢¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


´Ëʱͨ¹ýÉèÖÃWM_INITMENUPOPUP»Øµ÷À´»ñµÃÓû§²ãÖ´ÐеĻú»á£¬WM_INITMENUPOPUP»Øµ÷º¯Êýͨ¹ýSetWindowsHookExº¯ÊýÉèÖÃÁËÒ»¸öеÄhook£¬Ä¿µÄÊÇΪÁËÔÚxxxMnOpenHierarchyº¯Êý´´½¨×Ó´°¿ÚµÄʱºò»ñµÃÓû§²ãÖ´ÐÐȨÏÞ¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


xxxMnOpenHierarchyº¯Êý¼ÌÐøÏòÏÂÖ´ÐУ¬ÔÙ´ÎÀ´µ½xxxCreateWindowEx´¦¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


xxxCreateWindowExµ÷ÓÃÁ˸ոÕÉèÖõĻص÷º¯ÊýchildMenuHookProc¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Ôڻص÷º¯ÊýchildMenuHookProcÖУ¬SendMessage·¢ËÍÁËWM_NEXTMENUÏûÏ¢£¬Í¨¹ý¸Ã½ç˵¸ÃÏûÏ¢µÄ»Øµ÷º¯ÊýÔÙ´ÎÐ޸IJÎÊýLPARAM£¬ÕâÊÇΪÁËÈ¥µôg_hNewOwnerÉíÉϵÄÓÀ¾ÃËø¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


MenuµÄOwner¹ØϵÔٴα»¸Ä±ä£¬xxxMNKeyDownͨ¹ýº¯ÊýUnlockPopMenuÈ¥µôg_hNewOwnerÉíÉϵÄÓÀ¾ÃËø¡£²¢½«Õâ¸öËøÖØмÓÔÚÁËg_hMenuOwnerÉÏ¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Õâ¸öʱºò£¬ËùÓеÄËø¶¼ÒѾ­×ªÒƵ½ÁËg_hMenuOwnerÉíÉÏ£¬¶øÓÉÓÚWH_CBT¹³×ÓÒѾ­±»ÒƳý£¬menu½«±»ÆúÓã¬g_hNewOwner½«°Ñд´½¨µÄ´°¿Úlinkµ½×Ô¼ºÉíÉÏ¡£Õâ¸öʱºòÇé¿öÄð³ÉÁËÏÂÃæµÄÑù×Ó£¬g_hNewOwnerÉíÉÏÒѾ­Ã»ÓÐÐèÒªÈƹýµÄËøÁË¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½Ó×ÅchildMenuHookProcͨ¹ýSetWindowsHookExº¯ÊýÓÖÒ»´ÎÉèÖÃÁ˻ص÷º¯Êý²¢Í¨¹ýSetWindowLongPtrº¯ÊýÀ´µ÷ÓÃËü£¬»Øµ÷º¯ÊýÏú»ÙÁËg_hNewOwnerºÍxxxCreateWindowExÉú³ÉµÄд°¿Ú¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


xxxCreateWindowEx·µ»ØµÄֵΪffff871b80239130£¬Õâ¾ÍÊÇxxxCreateWindowEx´´½¨µÄ×Ó´°¿Ú¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¾Í¿ÉÒÔͨ¹ýThreadUnlockÀ´Ïú»Ùg_hNewOwnerºÍÆäд´½¨µÄ×Ó´°¿ÚÀ´µÃµ½Ò»¸öUAF©¶´¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ËÄ¡¢×Ü ½á



±¾ÎĶÔwin32k©¶´ÍÚ¾òÐÂ˼·½øÐÐÁËÏêϸ½â¶Á£¬ÆäÖаüÂÞ½«unlockº¯ÊýºÍ¹¤¾ßµÄDestroyº¯ÊýµÄÌØÐÔ¹ØÁªÔÚÒ»Æ𣬲¢°Ñ¹¤¾ßµÄ×Ó×ÊÔ´×÷Ϊ¹¥»÷Ä¿±êÑ°ÕÒÐµĹ¥»÷ÃæµÄ©¶´ÍÚ¾ò˼·¡£ÁíÍ⣬ÈçºÎͨ¹ý¹¤¾ßÄÚ²¿µÄÌØÐÔÈ¥ÈƹýËø¶Ô¹¤¾ßµÄËø¶¨µÄ˼·ºÍ¼¼ÇÉ£¬Ò²·Ç³£¾ßÓнè¼øÒâÒå¡£