win32k.sysÎó²îÍÚ¾ò˼Ð÷½â¶Á

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

Ò»¡¢Ñо¿Åä¾°


4ÔÂ1ÈÕ£¬ £¬£¬£¬£¬£¬£¬ÒÔÉ«ÁÐÇå¾²Ñо¿Ô±Gil DabahÔÚ²©¿ÍÉÏÐû²¼ÁËһƪ¹ØÓÚwin32kÎó²îÑо¿ÎÄÕ£¬ £¬£¬£¬£¬£¬£¬ÐÎòÁËÔõÑùͨ¹ýÄں˹¤¾ßµÄDestroyº¯ÊýºÍwin32k user-mode callback»º½â²½·¥µÄÌØÕ÷À´Ñ°ÕÒUAFÎó²îµÄÐÂ˼Ð÷¡£¡£¡£¡£¡£


Ϊ´Ë£¬ £¬£¬£¬£¬£¬£¬¿­·¢k8ADLab¶Ôwin32kÏà¹ØÄں˻úÖÆ¾ÙÐÐÑо¿ÆÊÎö£¬ £¬£¬£¬£¬£¬£¬²¢¶ÔÕâÀàÎó²îµÄÍÚ¾ò˼Ð÷¾ÙÐÐÏêϸ½â¶ÁÆÊÎö¡£¡£¡£¡£¡£


¶þ¡¢win32kÎó²î»º½âÓë¶Ô¿¹


2.1 win32k user-mode callbackÎó²î


ÓÉÓÚÉè¼ÆÔµ¹ÊÔ­ÓÉ£¬ £¬£¬£¬£¬£¬£¬win32kÇý¶¯ÐèÒª´¦Öóͷ£Ðí¶àÓû§²ãµÄ»Øµ÷£¬ £¬£¬£¬£¬£¬£¬ÕâЩ»Øµ÷¸øwin32kÄ£¿£¿£¿£¿£¿£¿éµÄÇå¾²´øÀ´Á˺ÜÊÇ´óµÄÒþ»¼£¬ £¬£¬£¬£¬£¬£¬²¢ÔÚÒÑÍù10Äêʱ¼äТ˳ÁË´ó×ÚµÄÎó²î¡£¡£¡£¡£¡£


ΪÁ˱ãÓÚÎó²îÐÎò£¬ £¬£¬£¬£¬£¬£¬ÒÔÈçÏÂα´úÂë¾ÙÐоÙÀýÆÊÎö¡£¡£¡£¡£¡£


NtUserSysCall()

 £û

     PWND p = CreateWindowEx(¡­);

     somecallback();

     xxxSetWindowStyle(p);

 £ý


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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º¯ÊýµÄ´úÂëÆ¬¶Ï¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


ͼÖÐͨ¹ý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µÄËùÓÐÕß¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾

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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


µ±ÐÂÎÅΪHCBT_CREATEWNDʱ£¬ £¬£¬£¬£¬£¬£¬ÎÒÃǵÚÒ»´ÎµÖ´ïxxxMNOpenHierarchyº¯ÊýÄÚ²¿µÄxxxCreateWindowEx¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


µ±ÎüÊÕµ½µÄÐÂÎÅΪWM_ENTERIDLEʱ£¬ £¬£¬£¬£¬£¬£¬ÎÒÃÇÔÚ´°¿ÚµÄÐÂÎŻص÷ÖÐͨ¹ýPostMessageÏ·¢ÐÂÎÅ¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


·¢ËÍÐÂÎźó£¬ £¬£¬£¬£¬£¬£¬Çý¶¯³ÌÐòÀ´µ½ÁËxxxMNKeyDownº¯ÊýÄÚ²¿Å²ÓÃxxxSendMessage´¦¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


ͨ¹ýWM_NEXTMENUÐÂÎŵĻص÷º¯Êý×îÏÈΪLPARAM¸³Öµ£¬ £¬£¬£¬£¬£¬£¬¸³Öµ²Ù×÷ÊÇΪÁËÐÞ¸ÄhMenuµÄOwner£¬ £¬£¬£¬£¬£¬£¬ÕâÑù¾Í¿ÉÒÔ½«OwnerµÄÔÝÊ±ËøÈÆ¹ý¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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

   

¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾

¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


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


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¾Í¿ÉÒÔͨ¹ýThreadUnlockÀ´Ïú»Ùg_hNewOwnerºÍÆäн¨ÉèµÄ×Ó´°¿ÚÀ´»ñµÃÒ»¸öUAFÎó²î¡£¡£¡£¡£¡£


¿­·¢¡¤k8(ÖйúÓÎ)¹Ù·½ÍøÕ¾


ËÄ¡¢×Ü ½á



±¾ÎĶÔwin32kÎó²îÍÚ¾òÐÂ˼Ð÷¾ÙÐÐÁËÏêϸ½â¶Á£¬ £¬£¬£¬£¬£¬£¬ÆäÖаüÀ¨½«unlockº¯ÊýºÍ¹¤¾ßµÄDestroyº¯ÊýµÄÌØÕ÷¹ØÁªÔÚÒ»Æð£¬ £¬£¬£¬£¬£¬£¬²¢°Ñ¹¤¾ßµÄ×Ó×ÊÔ´×÷Ϊ¹¥»÷Ä¿µÄѰÕÒÐµĹ¥»÷ÃæµÄÎó²îÍÚ¾ò˼Ð÷¡£¡£¡£¡£¡£ÁíÍ⣬ £¬£¬£¬£¬£¬£¬ÔõÑùͨ¹ý¹¤¾ßÄÚ²¿µÄÌØÕ÷È¥ÈÆ¹ýËø¶Ô¹¤¾ßµÄËø¶¨µÄ˼Ð÷ºÍ¼¼ÇÉ£¬ £¬£¬£¬£¬£¬£¬Ò²ºÜÊǾßÓÐ½è¼øÒâÒå¡£¡£¡£¡£¡£