xfocus logo xfocus title
Ê×Ò³ ½¹µãÔ­´´ °²È«ÎÄÕª °²È«¹¤¾ß °²È«Â©¶´ ½¹µãÏîÄ¿ ½¹µãÂÛ̳ ¹ØÓÚÎÒÃÇ
Ìí¼ÓÎÄÕÂ English Version

¹Ò¹³Windows API


´´½¨Ê±¼ä£º2004-03-06
ÎÄÕÂÊôÐÔ£ºÔ­´´
ÎÄÕÂÌá½»£ºSoBeIt (kinsephi_at_hotmail.com)

===========================[ ¹Ò¹³Windows API ]==================

                                    SoBeIt

                       Author:  Holy_Father <holy_father@phreaker.net>
                       Version: 1.1 english
                       Date:    6.10.2002


=====[ 1. ÄÚÈÝ ]=============================================

1. ÄÚÈÝ
2. ½éÉÜ
3. ¹Ò¹³·½·¨
  3.1 ÔËÐÐǰ¹Ò¹³
  3.2 ÔËÐÐʱ¹Ò¹³
    3.2.1 ʹÓÃIAT¹Ò¹³±¾½ø³Ì
    3.2.2 ¸ÄдÈë¿Úµã¹Ò¹³±¾½ø³Ì
    3.2.3 ±£´æÔ­Ê¼º¯Êý
    3.2.4 ¹Ò¹³ÆäËü½ø³Ì
      3.2.4.1 DLL×¢Èë
      3.2.4.2 ¶ÀÁ¢µÄ´úÂë
      3.2.4.3 ԭʼÐÞ¸Ä
4. ½áÊøÓï


=====[ 2. ½éÉÜ ]====================================================

    ÕâÆªÎÄÕÂÊÇÓйØÔÚOS WindowsϹҹ³APIº¯ÊýµÄ·½·¨¡£ËùÓÐÀý×Ó¶¼ÔÚ»ùÓÚNT¼¼ÊõµÄWindows°æ±¾NT 4.0¼°ÒÔÉÏÓÐЧ(Windows NT 4.0, Windows 2000, Windows XP)¡£¿ÉÄÜÔÚÆäËüWindowsϵͳҲ»áÓÐЧ¡£
    ÄãÓ¦¸Ã±È½ÏÊìϤWindowsϵĽø³Ì¡¢»ã±àÆ÷¡¢PEÎļþ½á¹¹ºÍһЩAPIº¯Êý£¬²ÅÄÜÃ÷°×ÕâÆªÎÄÕÂÀïµÄÄÚÈÝ¡£
    ÕâÀïʹÓÃ"Hooking API"Õâ¸öÊõÓï±íʾ¶ÔAPIµÄÍêÈ«Ð޸ġ£µ±µ÷Óñ»¹Ò¹³µÄAPIʱ£¬ÎÒÃǵĴúÂëÄÜÁ¢¿Ì±»Ö´ÐС£ÎÒ½«Ð´ÏÂÍêÈ«µÄ¹Ò¹³¹ý³Ì¡£


=====[ 3. ¹Ò¹³·½·¨ ]==============================================

    Ò»°ãÀ´ËµÎÒÃǵÄÄ¿µÄÊÇÓÃÎÒÃǵĴúÂëÈ¡´úһЩº¯ÊýÀïµÄ´úÂë¡£ÕâЩÎÊÌâÓÐʱ¿ÉÒÔÔÚ½ø³ÌÔËÐÐǰ½â¾ö¡£ÕâЩ´ó¶àÊýʱºò¿ÉÒÔÓÃÎÒÃÇÔËÐеÄÓû§¼¶½ø³ÌÀ´Íê³É£¬Ä¿µÄ¿ÉÒÔÊÇÐ޸ijÌÐòµÄÐÐΪ¡£¾Ù¸öÀý×ÓÓ¦ÓóÌÐòµÄÆÆ½â£¬±È·½ËµÓÐЩ³ÌÐò»áÔÚÆô¶¯Ê±ÐèÒªÔ­¹âÅÌ£¬ÎÒÃÇÏëÒª²»ÓùâÅÌ¾ÍÆô¶¯Ëü¡£Èç¹ûÎÒÃÇÐ޸ĻñÈ¡Çý¶¯ÀàÐ͵ĺ¯ÊýÎÒÃǾͿÉÒÔÈóÌÐò´ÓÓ²ÅÌÆô¶¯¡£
    µ±ÎÒÃǹҹ³ÏµÍ³½ø³Ìʱ(±ÈÈç˵·þÎñ)ÕâЩ²»¿ÉÄÜ×öµ½»òÕßÎÒÃDz»´òËãÕâô×ö£¬»òÕßÔÚÕâ¸öÀý×ÓÀïÎÒÃDz»ÖªµÀÄĸö½ø³Ì²ÅÊÇÄ¿±ê¡£ÕâʱÎÒÃǾÍÒªÓõ½¶¯Ì¬¹Ò¹³(ÔÚÔËÐÐʱ¹Ò¹³)µÄ¼¼Êõ¡£Ê¹ÓõÄÀý×ÓÓÐrootkit»òÕß²¡¶¾ÀïµÄ·´É±¶¾Èí¼þµÄ¼¼Êõ¡£


=====[ 3.1 ÔËÐÐǰ¹Ò¹³ ]===========================================

    ÕâÀïÐÞ¸ÄÎÒÃÇÏëÒªÐ޸ĺ¯ÊýÀ´×ÔµÄÎïÀíÄ£¿é(´ó¶àÊýʱºòÊÇ.exe»ò.dll)¡£ÔÚÕâÀïÎÒÃÇÖÁÉÙÓÐ3ÖÖ¿ÉÄܵÄ×ö·¨¡£
    µÚÒ»ÖÖ¿ÉÄÜÊÇÕÒµ½º¯ÊýµÄÈë¿ÚµãÈ»ºóÖØÐ´ËüµÄ´úÂë¡£Õâ»áÒòΪº¯ÊýµÄ´óС¶øÊÜÏÞÖÆ£¬µ«ÎÒÃÇÄܶ¯Ì¬¼ÓÔØÆäËüһЩģ¿é(API LoadLibrary)£¬ËùÒÔÓ¦¸Ã×ã¹»ÁË¡£
    Äں˺¯Êý(kernel32.dll)ÊÇͨÓõÄÒòΪWindowsÖÐÿ¸ö½ø³Ì¶¼ÓÐÕâ¸öÄ£¿éµÄ¿½±´¡£ÁíÒ»¸öºÃ´¦ÊÇÈç¹ûÎÒÃÇÖªµÀÄÄЩģ¿éÔÚij°æ±¾ÖлáÐ޸ģ¬ÎÒÃÇ¿ÉÒÔÔÚһЩAPIÈçLoadLibraryAÖÐʹÓÃÖ±½ÓµÄÖ¸Õë¡£ÕâÊÇÒòΪkernelÄ£¿éÔÚÄÚ´æÖеØÖ·ÔÚÏàͬWindows°æ±¾ÖÐÊǹ̶¨µÄ¡£ÎÒÃÇͬÑùÒ²ÄÜÓö¯Ì¬¼ÓÔØµÄÄ£¿éµÄ×÷Óá£ÔÚÕâÀïËüµÄ³õʼ»¯²¿·ÖÔÚ¼ÓÔØ½øÄÚ´æºóÁ¢¿Ì¾ÍÔËÐС£ÔÚÐÂÄ£¿éµÄ³õʼ»¯²¿·ÖÎÒÃDz»ÊÜÏÞÖÆ¡£
    µÚ¶þÖÖ¿ÉÄÜÊÇÔÚÄ£¿éÖб»´úÌæµÄº¯ÊýÖ»ÊÇÔ­º¯ÊýµÄÀ©Õ¹¡£È»ºóÎÒÃÇÑ¡ÔñҪôÐ޸ĿªÊ¼µÄ5¸ö×Ö½ÚÎªÌø×ªÖ¸Áî»òÕ߸ÄдIAT¡£Èç¹û¸ÄÎªÌø×ªÖ¸ÁÄÇô½«»á¸Ä±äÖ¸ÁîÖ´ÐÐÁ÷³ÌתΪִÐÐÎÒÃǵĴúÂë¡£Èç¹ûµ÷ÓÃÁËIAT¼Ç¼±»Ð޸ĵĺ¯Êý£¬ÎÒÃǵĴúÂëÄÜÔÚµ÷ÓýáÊøºó±»Ö´ÐС£µ«Ä£¿éµÄÀ©Õ¹Ã»ÄÇôÈÝÒ×£¬ÒòΪÎÒÃDZØÐë×¢ÒâDLLÊײ¿¡£
    ÏÂÒ»¸öÊÇÐÞ¸ÄÕû¸öÄ£¿é¡£ÕâÒâζ×ÅÎÒÃÇ´´½¨×Ô¼ºµÄÄ£¿é°æ±¾£¬ËüÄܹ»¼ÓÔØÔ­Ê¼µÄÄ£¿é²¢µ÷ÓÃԭʼµÄº¯Êý£¬µ±È»ÎÒÃǶÔÕâ¸ö²»¸ÐÐËȤ£¬µ«ÖØÒªµÄº¯Êý¶¼ÊDZ»¸üеġ£ÕâÖÖ·½·¨¶ÔÓÚÓеÄÄ£¿é¹ý´óÓм¸°Ù¸öµ¼³öº¯ÊýµÄºÜ²»·½±ã¡£


=====[ 3.2 ÔËÐÐʱ¹Ò¹³ ]==========================================

    ÔÚÔËÐÐǰ¹Ò¹³Í¨³£¶¼·Ç³£ÌØÊ⣬²¢ÇÒÊÇÔÚÄÚ²¿ÃæÏò¾ßÌåµÄÓ¦ÓóÌÐò(»òÄ£¿é)¡£Èç¹ûÎÒÃǸü»»ÁËkernel32.dll»òntdll.dllÀïµÄº¯Êý(Ö»ÔÚNT²Ù×÷ϵͳÀï)£¬ÎÒÃǾÍÄÜÍêÃÀµØ×öµ½ÔÚËùÓн«ÒªÔËÐеĽø³ÌÖÐÌæ»»Õâ¸öº¯Êý¡£µ«ËµÀ´ÈÝÒ××öÆðÀ´È´·Ç³£ÄÑ£¬ÒòΪÎÒÃDz»µ«µÃ¿¼ÂǾ«È·ÐÔºÍÐèÒª±àд±È½ÏÍêÉÆµÄк¯Êý»òÐÂÄ£¿é£¬µ«Ö÷ÒªÎÊÌâÊÇÖ»Óн«ÒªÔËÐеĽø³Ì²ÅÄܱ»¹Ò¹³(Òª¹Ò¹³ËùÓнø³ÌÖ»ÄÜÖØÆôµçÄÔ)¡£ÁíÒ»¸öÎÊÌâÊÇÈçºÎ½øÈëÕâЩÎļþ£¬ÒòΪNT²Ù×÷ϵͳ±£»¤ÁËËüÃÇ¡£±È½ÏºÃµÄ½â¾ö·½·¨ÔÚ½ø³ÌÕýÔÚÔËÐÐʱ¹Ò¹³¡£ÕâÐèÒª¸ü¶àµÄÓйØÖªÊ¶£¬µ«×îºóµÄ½á¹ûÏ൱²»´í¡£ÔÚÔËÐÐÖйҹ³Ö»¶ÔÄܹ»Ð´ÈëËüÃǵÄÄÚ´æµÄ½ø³ÌÄܳɹ¦¡£ÎªÁËÄÜдÈëËü×Ô¼ºÎÒÃÇʹÓÃAPIº¯ÊýWriteProcessMemory¡£ÏÖÔÚÎÒÃÇ¿ªÊ¼ÔËÐÐÖйҹ³ÎÒÃǵĽø³Ì¡£


=====[ 3.2.1 ʹÓÃIAT¹Ò¹³±¾½ø³Ì ]===================================

    ÕâÀïÓкܶàÖÖ¿ÉÄÜÐÔ¡£Ê×ÏȽéÉÜÈçºÎÓøÄдIAT¹Ò¹³º¯ÊýµÄ·½·¨¡£½ÓÏÂÀ´ÕâÕÅͼÃèÊöÁËPEÎļþµÄ½á¹¹:

     +-------------------------------+     - offset 0
     | MS DOS±êÖ¾("MZ") ºÍ DOS¿é     |
     +-------------------------------+    
     |      PE ±êÖ¾ ("PE")           |
     +-------------------------------+
     |             .text             |     - Ä£¿é´úÂë
     |           ³ÌÐò´úÂë            |
     |                               |
     +-------------------------------+
     |             .data             |     - Òѳõʼ»¯µÄ(È«¾Ö¾²Ì¬)Êý¾Ý
     |          Òѳõʼ»¯µÄÊý¾Ý       |
     |                               |
     +-------------------------------+
     |            .idata             |     - µ¼È뺯ÊýµÄÐÅÏ¢ºÍÊý¾Ý
     |            µ¼Èë±í             |      
     |                               |
     +-------------------------------+
     |            .edata             |     - µ¼³öº¯ÊýµÄÐÅÏ¢ºÍÊý¾Ý
     |            µ¼³ö±í             |      
     |                               |
     +-------------------------------+
     |           µ÷ÊÔ·ûºÅ            |
     +-------------------------------+

    ÕâÀï¶ÔÎÒÃDZȽÏÖØÒªµÄÊÇ.idata²¿·ÖµÄµ¼ÈëµØÖ·±í(IAT)¡£Õâ¸ö²¿·Ö°üº¬Á˵¼ÈëµÄÏà¹ØÐÅÏ¢ºÍµ¼È뺯ÊýµÄµØÖ·¡£ÓÐÒ»µãºÜÖØÒªµÄÊÇÎÒÃDZØÐëÖªµÀPEÎļþÊÇÈçºÎ´´½¨µÄ¡£µ±ÔÚ±à³ÌÓïÑÔÀï¼ä½Óµ÷ÓÃÈÎÒâAPI(ÕâÒâζ×ÅÎÒÃÇÊÇÓú¯ÊýµÄÃû×ÖÀ´µ÷ÓÃËü£¬¶ø²»ÊÇÓÃËüµÄµØÖ·)£¬±àÒëÆ÷²¢²»Ö±½Ó°Ñµ÷ÓÃÁ¬½Óµ½Ä£¿é£¬¶øÊÇÓÃjmpÖ¸ÁîÁ¬½Óµ÷Óõ½IAT£¬IATÔÚϵͳ°Ñ½ø³Ìµ÷ÈëÄÚ´æÊ±Ê±»áÓɽø³ÌÔØÈëÆ÷ÌîÂú¡£Õâ¾ÍÊÇÎÒÃÇ¿ÉÒÔÔÚÁ½¸ö²»Í¬°æ±¾µÄWindowsÀïʹÓÃÏàͬµÄ¶þ½øÖÆ´úÂëµÄÔ­Òò£¬ËäȻģ¿é¿ÉÄÜ»á¼ÓÔØµ½²»Í¬µÄµØÖ·¡£½ø³ÌÔØÈëÆ÷»áÔÚ³ÌÐò´úÂëÀïµ÷ÓÃËùʹÓõÄIATÀïÌîÈëÖ±½ÓÌø×ªµÄjmpÖ¸Áî¡£ËùÒÔÎÒÃÇÄÜÔÚIATÀïÕÒµ½ÎÒÃÇÏëÒª¹Ò¹³µÄÖ¸¶¨º¯Êý£¬ÎÒÃǾÍÄܺÜÈÝÒ׸ıäÄÇÀïµÄjmpÖ¸Áî²¢ÖØ¶¨Ïò´úÂëµ½ÎÒÃǵĵØÖ·¡£Íê³ÉÖ®ºóÿ´Îµ÷Óö¼»áÖ´ÐÐÎÒÃǵĴúÂëÁË¡£ÕâÖÖ·½·¨µÄȱµãÊǾ­³£ÓкܶຯÊýÒª±»¹Ò¹³(±È·½ËµÈç¹ûÎÒÃÇÒªÔÚËÑË÷ÎļþµÄAPIÖиıä³ÌÐòµÄÐÐΪÎÒÃǾ͵ÃÐ޸ĺ¯ÊýFindFirstFileºÍFindNextFile£¬µ«ÎÒÃÇÒªÖªµÀÕâЩº¯Êý¶¼ÓÐANSIºÍWIDE°æ±¾£¬ËùÒÔÎÒÃDz»µÃ²»ÐÞ¸ÄFindFirstFileA¡¢FindFirstFileW¡¢FindNextFileAºÍFileNextFileWµÄIATµØÖ·¡£µ«»¹ÓÐÆäËüÀàËÆµÄº¯ÊýÈçFindFirstFileExAºÍËüµÄWIDE°æ±¾FindFirstFileExW£¬Ò²¶¼ÊÇÓÉÇ°ÃæÌáµ½µÄº¯Êýµ÷Óõġ£ÎÒÃÇÖªµÀFindFirstFileWµ÷ÓÃFindFirstFileExW£¬µ«ÕâÊÇÖ±½Óµ÷Ó㬶ø²»ÊÇʹÓÃIAT¡£ÔÙ±ÈÈç˵ShellAPIµÄº¯ÊýSHGetDesktopFolderÒ²»áÖ±½Óµ÷ÓÃFindFirstFilwW»òFindFirstFileExW)¡£Èç¹ûÎÒÃÇÄÜ»ñµÃËüÃÇËùÓУ¬½á¹û¾Í»áºÜÍêÃÀ¡£
    ÎÒÃÇͨ¹ýʹÓÃimagehlp.dllÀïµÄImageDirectoryEntryToDataÀ´ºÜÈÝÒ×µØÕÒµ½IAT¡£

    PVOID ImageDirectoryEntryToData(
        IN LPVOID Base,    
        IN BOOLEAN MappedAsImage,    
        IN USHORT DirectoryEntry,    
        OUT PULONG Size    
    );

ÔÚÕâÀïBase²ÎÊý¿ÉÒÔÓÃÎÒÃdzÌÐòµÄInstance(Instanceͨ¹ýµ÷ÓÃGetModuleHandle»ñµÃ):

    hInstance = GetModuleHandleA(NULL);

DirectoryEntryÎÒÃÇ¿ÉÒÔʹÓúãÁ¿IMAGE_DIRECTORY_ENTRY_IMPORT¡£

    #define IMAGE_DIRECTORY_ENTRY_IMPORT 1

    º¯ÊýµÄ½á¹ûÊÇÖ¸ÏòµÚÒ»¸öIAT¼Ç¼ָÕë¡£IATµÄËùÓмǼÊÇÓÉIMAGE_IMPORT_DESCRIPTOR¶¨ÒåµÄ½á¹¹¡£ËùÒÔº¯Êý½á¹ûÊÇÖ¸ÏòIMAGE_IMPORT_DESCRIPTORµÄÖ¸Õë¡£

    typedef struct _IMAGE_THUNK_DATA {
        union {
            PBYTE ForwarderString;
            PDWORD Function;
            DWORD Ordinal;
            PIMAGE_IMPORT_BY_NAME AddressOfData;
        } ;
    } IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;

    typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        union {
            DWORD Characteristics;
            PIMAGE_THUNK_DATA OriginalFirstThunk;
        } ;
        DWORD TimeDateStamp;
        DWORD ForwarderChain;
        DWORD Name;
        PIMAGE_THUNK_DATA FirstThunk;
    } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;

    IMAGE_IMPORT_DESCRIPTORÀïµÄName³ÉÔ±±äÁ¿ÊÇÄ£¿éÃû×ÖµÄÖ¸Õë¡£Èç¹ûÎÒÃÇÏëÒª¹Ò¹³Ä³¸öº¯Êý±ÈÈçÊÇÀ´×Ôkernel32.dllÎÒÃǾÍÔÚµ¼Èë±íÀïÕÒÊôÓÚÃû×Ökernel32.dllµÄÃèÊö·ûºÅ¡£ÎÒÃÇÏȵ÷ÓÃImageDirectoryEntryToDataÈ»ºóÕÒµ½Ãû×ÖÊÇ"kernel32.dll"µÄÃèÊö·ûºÅ(¿ÉÄܲ»Ö»Ò»¸öÃèÊö·ûºÅÊÇÕâ¸öÃû×Ö)£¬×îºóÎÒÃÇÔÚÕâ¸öÄ£¿éµÄ¼Ç¼ÀïËùÓк¯ÊýµÄÁбíÀïÕÒµ½ÎÒÃÇÏëÒªµÄº¯Êý(º¯ÊýµØÖ·Í¨¹ýGetProcAddressº¯Êý»ñµÃ)¡£Èç¹ûÎÒÃÇÕÒµ½Á˾ͱØÐëÓÃVirtualProtectº¯ÊýÀ´¸Ä±äÄÚ´æÒ³ÃæµÄ±£»¤ÊôÐÔ£¬È»ºó¾Í¿ÉÒÔÔÚÄÚ´æÖеÄÕâЩ²¿·ÖдÈë´úÂëÁË¡£ÔÚ¸ÄдÁ˵ØÖ·Ö®ºóÎÒÃÇÒª°Ñ±£»¤ÊôÐԸĻØÀ´¡£ÔÚµ÷ÓÃVirtualProtect֮ǰÎÒÃÇ»¹ÒªÏÈÖªµÀÓйØÒ³ÃæµÄÐÅÏ¢£¬Õâͨ¹ýVirtualQueryÀ´ÊµÏÖ¡£ÎÒÃÇ¿ÉÒÔ¼ÓÈëһЩ²âÊÔÒÔ·ÀijЩº¯Êý»áʧ°Ü(±È·½ËµÈç¹ûµÚÒ»´Îµ÷ÓÃVirtualProctect¾Íʧ°ÜÁË£¬ÎÒÃǾÍû°ì·¨¼ÌÐø)¡£

    PCSTR pszHookModName = "kernel32.dll",pszSleepName = "Sleep";
    HMODULE hKernel = GetModuleHandle(pszHookModName);
    PROC pfnNew = (PROC)0x12345678,       //ÕâÀï´æ·ÅеØÖ·
        pfnHookAPIAddr = GetProcAddress(hKernel,pszSleepName);

    ULONG ulSize;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
        (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
            hKernel,
            TRUE,
            IMAGE_DIRECTORY_ENTRY_IMPORT,
            &ulSize
        );

    while (pImportDesc->Name)
    {
        PSTR pszModName = (PSTR)((PBYTE) hKernel + pImportDesc->Name);
        if (stricmp(pszModName, pszHookModName) == 0)
        break;  
        pImportDesc++;
    }

    PIMAGE_THUNK_DATA pThunk =
    (PIMAGE_THUNK_DATA)((PBYTE) hKernel + pImportDesc->FirstThunk);

    while (pThunk->u1.Function)
    {
        PROC* ppfn = (PROC*) &pThunk->u1.Function;
        BOOL bFound = (*ppfn == pfnHookAPIAddr);

        if (bFound)
        {
            MEMORY_BASIC_INFORMATION mbi;
            VirtualQuery(
                ppfn,
                &mbi,
                sizeof(MEMORY_BASIC_INFORMATION)
            );
            VirtualProtect(
                mbi.BaseAddress,
                mbi.RegionSize,
                PAGE_READWRITE,
                &mbi.Protect)
            )

            *ppfn = *pfnNew;

            DWORD dwOldProtect;
            VirtualProtect(
                mbi.BaseAddress,
                mbi.RegionSize,
                mbi.Protect,
                &dwOldProtect
            );
            break;
        }
        pThunk++;
    }

µ÷ÓÃSleep(1000)µÄ½á¹ûÈçÀý×ÓËùʾ:

    00407BD8: 68E8030000    push 0000003E8h
    00407BDD: E812FAFFFF    call Sleep

    Sleep:     ;ÕâÊÇÌø×ªµ½IATÀïµÄµØÖ·
    004075F4: FF25BCA14000    jmp dword ptr [00040A1BCh]

    Ô­Ê¼±í:
    0040A1BC: 79 67 E8 77 00 00 00 00
      
    Ð±í:
    0040A1BC: 78 56 34 12 00 00 00 00

ËùÒÔ×îºó»áÌø×ªµ½0x12345678¡£
          

=====[ 3.2.2 ¸ÄдÈë¿Úµã¹Ò¹³±¾½ø³Ì ]==================

    ¸Äдº¯ÊýÈë¿Úµã¿ªÊ¼µÄһЩ×Ö½ÚÕâÖÖ·½·¨Ï൱¼òµ¥¡£¾ÍÏó¸Ä±äIATÀïµÄµØÖ·Ò»Ñù£¬ÎÒÃÇÒ²ÒªÏÈÐÞ¸ÄÒ³ÃæÊôÐÔ¡£ÔÚÕâÀï¶ÔÎÒÃÇÏëÒª¹Ò¹³µÄº¯ÊýÊÇÒ»¿ªÊ¼µÄ5¸ö×Ö½Ú¡£ÎªÁËÖ®ºóµÄʹÓÃÎÒÃÇÓö¯Ì¬·ÖÅäMEMORY_BASIC_INFORMATION½á¹¹¡£º¯ÊýµÄÆðʼµØÖ·Ò²ÊÇÓÃGetProcAddressÀ´»ñµÃ¡£ÎÒÃÇÔÚÕâ¸öµØÖ·Àï²åÈëÖ¸ÏòÎÒÃÇ´úÂëµÄÌø×ªÖ¸Áî¡£½ÓÏÂÀ´³ÌÐòµ÷ÓÃSleep(5000)(ËùÒÔËü»áµÈ´ý5ÃëÖÓ)£¬È»ºóSleepº¯Êý±»¹Ò¹³²¢Öض¨Ïòµ½new_sleep£¬×îºóËüÔٴε÷ÓÃSleep(5000)¡£ÒòΪеĺ¯Êýnew_sleepʲô¶¼²»×ö²¢Ö±½Ó·µ»Ø£¬ËùÒÔÕû¸ö³ÌÐòÖ»ÐèÒª5ÃëÖÓ¶ø²»ÊÇ10ÃëÖÖ¡£


.386p
.model flat, stdcall

includelib lib\kernel32.lib
Sleep            PROTO :DWORD
GetModuleHandleA    PROTO :DWORD
GetProcAddress        PROTO :DWORD,:DWORD
VirtualQuery        PROTO :DWORD,:DWORD,:DWORD
VirtualProtect        PROTO :DWORD,:DWORD,:DWORD,:DWORD
VirtualAlloc        PROTO :DWORD,:DWORD,:DWORD,:DWORD
VirtualFree        PROTO :DWORD,:DWORD,:DWORD
FlushInstructionCache    PROTO :DWORD,:DWORD,:DWORD
GetCurrentProcess    PROTO
ExitProcess         PROTO :DWORD


.data

kernel_name         db "kernel32.dll",0
sleep_name        db "Sleep",0
old_protect        dd ?

MEMORY_BASIC_INFORMATION_SIZE    equ 28

PAGE_READWRITE        dd 000000004h
PAGE_EXECUTE_READWRITE dd 000000040h
MEM_COMMIT        dd 000001000h
MEM_RELEASE        dd 000008000h


.code
start:
    push    5000
    call    Sleep

do_hook:
    push    offset kernel_name
    call    GetModuleHandleA
    push    offset sleep_name
    push    eax
    call    GetProcAddress
    mov    edi,eax            ;×îºó»ñµÃSleepµØÖ·

    push    PAGE_READWRITE
    push    MEM_COMMIT
    push    MEMORY_BASIC_INFORMATION_SIZE
    push     0
    call    VirtualAlloc
    test    eax,eax
    jz     do_sleep
    mov    esi,eax            ;ΪMBI½á¹¹·ÖÅäÄÚ´æ

    push    MEMORY_BASIC_INFORMATION_SIZE
    push    esi
    push    edi
    call    VirtualQuery        ;ÄÚ´æÒ³µÄÐÅÏ¢
    test    eax,eax
    jz    free_mem

    call    GetCurrentProcess
    push    5
    push    edi
    push    eax
    call    FlushInstructionCache    ;Ö»ÊÇΪÁËÈ·¶¨Ò»ÏÂ:)

    lea    eax,[esi+014h]
    push    eax
    push    PAGE_EXECUTE_READWRITE
    lea    eax,[esi+00Ch]
    push    [eax]
    push    [esi]
    call    VirtualProtect          ;ÎÒÃÇÒªÐ޸ı£»¤ÊôÐÔ£¬ÕâÑù²ÅÄܹ»Ð´Èë´úÂë
    test    eax,eax
    jz    free_mem        

    mov    byte ptr [edi],0E9h    ;дÈëÌø×ªÖ¸Áî
    mov    eax,offset new_sleep
    sub    eax,edi
    sub    eax,5
    inc    edi
    stosd                ;ÕâÀïÊÇÌø×ªµØÖ·

    push    offset old_protect
    lea    eax,[esi+014h]
    push    [eax]
    lea    eax,[esi+00Ch]
    push    [eax]
    push    [esi]
    call    VirtualProtect        ;»Ö¸´Ò³±£»¤ÊôÐÔ

free_mem:
    push    MEM_RELEASE
    push    0
    push    esi
    call    VirtualFree        ;ÊÍ·ÅÄÚ´æ
do_sleep:
    push    5000
    call    Sleep
    push    0
    call    ExitProcess
new_sleep:                
    ret    004h
end start


µÚ¶þ´Îµ÷ÓÃSleepµÄ½á¹ûÊÇÕâÑù:

    004010A4: 6888130000    push 000001388h
    004010A9: E80A000000    call Sleep


    Sleep:     ;ÕâÀïÊÇÌø×ªµ½IATÀïµÄµØÖ·
    004010B8: FF2514204000    jmp dword ptr [000402014h]

    tabulka:
    00402014: 79 67 E8 77 6C 7D E8 77
      
    Kernel32.Sleep:
    77E86779: E937A95788    jmp 0004010B5h

    new_sleep:
    004010B5: C20400    ret 004h    


=====[ 3.2.3 ±£´æÔ­Ê¼º¯Êý ]=====================================

    ¸ü¶àʱºòÎÒÃÇÐèÒªµÄ²»½ö½öÊǹҹ³º¯Êý¡£±È·½ËµÒ²ÐíÎÒÃDz¢²»ÏëÈ¡´ú¸ø¶¨µÄº¯Êý¶øÖ»ÊÇÏë¼ì²éÒ»ÏÂËüµÄ½á¹û£¬»òÕßÒ²ÐíÎÒÃÇÖ»ÊÇÏëÔÚº¯Êý±»Ê¹ÓÃÌØ¶¨µÄ²ÎÊýÀ´µ÷ÓÃʱ²ÅÈ¡´úÔ­º¯Êý¡£±È½ÏºÃµÄÀý×ÓÓÐÇ°ÃæÌá¹ýµÄͨ¹ýÈ¡´úFindXXXFileº¯ÊýÀ´Íê³ÉÒþ²ØÎļþ¡£ËùÒÔÈç¹ûÎÒÃÇÏëÒªÒþ²ØÖ¸¶¨µÄÎļþ²¢ÇÒ²»Ïë±»×¢ÒâµÄ»°£¬¾ÍµÃ¶ÔÆäËüËùÓÐÎļþÖ»µ÷ÓÃûÓб»Ð޸ĹýµÄԭʼº¯Êý¡£Õâ¶ÔʹÓÃÐÞ¸ÄIATµÄ·½·¨Ê±ÊǺܼòµ¥µÄ£¬Îªµ÷ÓÃԭʼº¯ÊýÎÒÃÇ¿ÉÒÔÓÃGetProcAddress»ñµÃËüµÄԭʼµØÖ·£¬È»ºóÖ±½Óµ÷Óᣵ«ÐÞ¸ÄÈë¿ÚµãµÄ·½·¨¾Í»áÓÐÎÊÌ⣬ÒòΪÐÞ¸ÄÁ˺¯ÊýÈë¿ÚµãµÄ5¸ö×Ö½Ú£¬Ê¹ÎÒÃÇÆÆ»µÁËÔ­º¯Êý¡£ËùÒÔÎÒÃDZØÐë±£´æ¿ªÊ¼µÄÄÇЩָÁî¡£Õ⽫Óõ½ÒÔϵļ¼Êõ¡£
    ÎÒÃÇÖªµÀÎÒÃÇÒªÐ޸ĿªÊ¼µÄ5¸ö×Ö½Úµ«²»ÖªµÀÀïÃæ°üº¬¶àÉÙÌõÖ¸ÁîÒÔ¼°Ö¸ÁîµÄ³¤¶È¡£ÎÒÃǵÃΪ¿ªÊ¼ÄÇЩָÁî±£Áô×ã¹»µÄÄÚ´æ¿Õ¼ä¡£16¸ö×Ö½ÚÓ¦¸Ã×ã¹»ÁË£¬ÒòΪº¯Êý¿ªÊ¼Ê±Í¨³£Ã»Óж೤µÄÖ¸ÁºÜ¿ÉÄܸù±¾¾ÍÓò»µ½16¸ö×Ö½Ú¡£Õû¸ö±»±£ÁôµÄÄÚ´æÓÃ0x90(0x90=nop)À´ÌîÂú¡£ÏÂÒ»¸ö5¸ö×Ö½ÚÔ¤Áô¸ø½«ÔÚÖ®ºóÌîÈëµÄÌø×ªÖ¸Áî¡£

old_hook:        db 090h,090h,090h,090h,090h,090h,090h,090h
            db 090h,090h,090h,090h,090h,090h,090h,090h
            db 0E9h,000h,000h,000h,000h


    ÏÖÔÚÎÒÃÇÒÑ×¼±¸ºÃ¿½±´¿ªÊ¼µÄÖ¸ÁΪ»ñµÃÖ¸Á¶ÈµÄ´úÂëÏ൱Âé·³£¬Õâ¾ÍÊÇÎÒÃǵÃʹÓÃÒÑÍê³ÉµÄÒýÇæµÄÔ­Òò¡£ËüÊÇÓÉZ0MBiEдµÄ¡£´«Èë²ÎÊýÊÇÎÒÃÇÒª»ñµÃ³¤¶ÈµÄÖ¸ÁîµÄµØÖ·¡£Êä³ö²ÎÊýÔÚeaxÀï¡£


; LDE32, Length-Disassembler Engine, 32-bit, (x) 1999-2000 Z0MBiE
; special edition for REVERT tool

; version 1.05

C_MEM1                  equ     0001h       ; |
C_MEM2                  equ     0002h       ; |may be used simultaneously
C_MEM4                  equ     0004h       ; |
C_DATA1                 equ     0100h       ; |
C_DATA2                 equ     0200h       ; |may be used simultaneously
C_DATA4                 equ     0400h       ; |
C_67                    equ     0010h       ; used with C_PREFIX
C_MEM67                 equ     0020h       ; C_67 ? C_MEM2 : C_MEM4
C_66                    equ     1000h       ; used with C_PREFIX
C_DATA66                equ     2000h       ; C_66 ? C_DATA2 : C_DATA4
C_PREFIX                equ     0008h       ; prefix. take opcode again
C_MODRM                 equ     4000h       ; MODxxxR/M
C_DATAW0                equ     8000h       ; opc&1 ? C_DATA66 : C_DATA1

                        p386
                        model   flat
                        locals  @@

                        .code

public                  disasm_main
public                  _disasm_main
public                  @disasm_main
public                  DISASM_MAIN

disasm_main:
_disasm_main:
@disasm_main:
DISASM_MAIN:


; __fastcall            EAX
; __cdecl               [ESP+4]

;ÕâÊÇÎҵĵÚÒ»´¦Ð޸ģ¬ËüÖ»ÊÇÕâ¸öº¯ÊýµÄÉùÃ÷
get_instr_len:

                        mov     ecx, [esp+4]    ; ECX = opcode ptr

                        xor     edx, edx        ; ±êÖ¾
                        xor     eax, eax

@@prefix:               and     dl, not C_PREFIX

                        mov     al, [ecx]
                        inc     ecx

                        or      edx, table_1[eax*4]

                        test    dl, C_PREFIX
                        jnz     @@prefix

                        cmp     al, 0F6h
                        je      @@test
                        cmp     al, 0F7h
                        je      @@test

                        cmp     al, 0CDh
                        je      @@int

                        cmp     al, 0Fh
                        je      @@0F
@@cont:
                        test    dh, C_DATAW0 shr 8
                        jnz     @@dataw0
@@dataw0done:
                        test    dh, C_MODRM shr 8
                        jnz     @@modrm
@@exitmodrm:
                        test    dl, C_MEM67
                        jnz     @@mem67
@@mem67done:
                        test    dh, C_DATA66 shr 8
                        jnz     @@data66
@@data66done:
                        mov     eax, ecx
                        sub     eax, [esp+4]

                        and     edx,C_MEM1+C_MEM2+C_MEM4+C_DATA1+C_DATA2+C_DATA4
                        add     al, dl
                        add     al, dh

;ÕâÀïÊÇÎҵĵڶþ´¦Ð޸ģ¬Ö»ÓÐÔÚԭʼ°æ±¾ÕâÀïÊÇretn
@@exit:                 ret     00004h  

@@test:                 or      dh, C_MODRM shr 8
                        test    byte ptr [ecx], 00111000b  ; F6/F7 -- test
                        jnz     @@cont
                        or      dh, C_DATAW0 shr 8
                        jmp     @@cont

@@int:                  or      dh, C_DATA1 shr 8
                        cmp     byte ptr [ecx], 20h
                        jne     @@cont
                        or      dh, C_DATA4 shr 8
                        jmp     @@cont

@@0F:                   mov     al, [ecx]
                        inc     ecx
                        or      edx, table_0F[eax*4]

                        cmp     edx, -1
                        jne     @@cont

@@error:                mov     eax, edx
                        jmp     @@exit

@@dataw0:               xor     dh, C_DATA66 shr 8
                        test    al, 00000001b
                        jnz     @@dataw0done
                        xor     dh, (C_DATA66+C_DATA1) shr 8
                        jmp     @@dataw0done

@@mem67:                xor     dl, C_MEM2
                        test    dl, C_67
                        jnz     @@mem67done
                        xor     dl, C_MEM4+C_MEM2
                        jmp     @@mem67done

@@data66:               xor     dh, C_DATA2 shr 8
                        test    dh, C_66 shr 8
                        jnz     @@data66done
                        xor     dh, (C_DATA4+C_DATA2) shr 8
                        jmp     @@data66done

@@modrm:                mov     al, [ecx]
                        inc     ecx

                        mov     ah, al  ; ah=mod, al=rm

                        and     ax, 0C007h
                        cmp     ah, 0C0h
                        je      @@exitmodrm

                        test    dl, C_67
                        jnz     @@modrm16

@@modrm32:              cmp     al, 04h
                        jne     @@a

                        mov     al, [ecx]       ; sib
                        inc     ecx
                        and     al, 07h

@@a:                    cmp     ah, 40h
                        je      @@mem1
                        cmp     ah, 80h
                        je      @@mem4

                        cmp     ax, 0005h
                        jne     @@exitmodrm

@@mem4:                 or      dl, C_MEM4
                        jmp     @@exitmodrm

@@mem1:                 or      dl, C_MEM1
                        jmp     @@exitmodrm

@@modrm16:              cmp     ax, 0006h
                        je      @@mem2
                        cmp     ah, 40h
                        je      @@mem1
                        cmp     ah, 80h
                        jne     @@exitmodrm

@@mem2:                 or      dl, C_MEM2
                        jmp     @@exitmodrm

                        endp

                        .data

;0F      -- ÔÚ´úÂëÖзÖÎö,²»ÐèÒª±êÖ¾(Ò²¾ÍÊDZêÖ¾(flag)±ØÐëΪ0)
;F6,F7   -- --//-- (ttt=000 -- 3 ×Ö½Ú, ·ñÔòΪ2×Ö½Ú)
;CD      -- --//-- (Èç¹ûΪ CD 20 Ϊ6×Ö½Ú, ·ñÔòΪ2×Ö½Ú)

table_1                 label   dword   ; Ò»°ãµÄÖ¸Áî

dd C_MODRM              ; 00
dd C_MODRM              ; 01
dd C_MODRM              ; 02
dd C_MODRM              ; 03
dd C_DATAW0             ; 04
dd C_DATAW0             ; 05
dd 0                    ; 06
dd 0                    ; 07
dd C_MODRM              ; 08
dd C_MODRM              ; 09
dd C_MODRM              ; 0A
dd C_MODRM              ; 0B
dd C_DATAW0             ; 0C
dd C_DATAW0             ; 0D
dd 0                    ; 0E
dd 0                    ; 0F
dd C_MODRM              ; 10
dd C_MODRM              ; 11
dd C_MODRM              ; 12
dd C_MODRM              ; 13
dd C_DATAW0             ; 14
dd C_DATAW0             ; 15
dd 0                    ; 16
dd 0                    ; 17
dd C_MODRM              ; 18
dd C_MODRM              ; 19
dd C_MODRM              ; 1A
dd C_MODRM              ; 1B
dd C_DATAW0             ; 1C
dd C_DATAW0             ; 1D
dd 0                    ; 1E
dd 0                    ; 1F
dd C_MODRM              ; 20
dd C_MODRM              ; 21
dd C_MODRM              ; 22
dd C_MODRM              ; 23
dd C_DATAW0             ; 24
dd C_DATAW0             ; 25
dd C_PREFIX             ; 26
dd 0                    ; 27
dd C_MODRM              ; 28
dd C_MODRM              ; 29
dd C_MODRM              ; 2A
dd C_MODRM              ; 2B
dd C_DATAW0             ; 2C
dd C_DATAW0             ; 2D
dd C_PREFIX             ; 2E
dd 0                    ; 2F
dd C_MODRM              ; 30
dd C_MODRM              ; 31
dd C_MODRM              ; 32
dd C_MODRM              ; 33
dd C_DATAW0             ; 34
dd C_DATAW0             ; 35
dd C_PREFIX             ; 36
dd 0                    ; 37
dd C_MODRM              ; 38
dd C_MODRM              ; 39
dd C_MODRM              ; 3A
dd C_MODRM              ; 3B
dd C_DATAW0             ; 3C
dd C_DATAW0             ; 3D
dd C_PREFIX             ; 3E
dd 0                    ; 3F
dd 0                    ; 40
dd 0                    ; 41
dd 0                    ; 42
dd 0                    ; 43
dd 0                    ; 44
dd 0                    ; 45
dd 0                    ; 46
dd 0                    ; 47
dd 0                    ; 48
dd 0                    ; 49
dd 0                    ; 4A
dd 0                    ; 4B
dd 0                    ; 4C
dd 0                    ; 4D
dd 0                    ; 4E
dd 0                    ; 4F
dd 0                    ; 50
dd 0                    ; 51
dd 0                    ; 52
dd 0                    ; 53
dd 0                    ; 54
dd 0                    ; 55
dd 0                    ; 56
dd 0                    ; 57
dd 0                    ; 58
dd 0                    ; 59
dd 0                    ; 5A
dd 0                    ; 5B
dd 0                    ; 5C
dd 0                    ; 5D
dd 0                    ; 5E
dd 0                    ; 5F
dd 0                    ; 60
dd 0                    ; 61
dd C_MODRM              ; 62
dd C_MODRM              ; 63
dd C_PREFIX             ; 64
dd C_PREFIX             ; 65
dd C_PREFIX+C_66        ; 66
dd C_PREFIX+C_67        ; 67
dd C_DATA66             ; 68
dd C_MODRM+C_DATA66     ; 69
dd C_DATA1              ; 6A
dd C_MODRM+C_DATA1      ; 6B
dd 0                    ; 6C
dd 0                    ; 6D
dd 0                    ; 6E
dd 0                    ; 6F
dd C_DATA1              ; 70
dd C_DATA1              ; 71
dd C_DATA1              ; 72
dd C_DATA1              ; 73
dd C_DATA1              ; 74
dd C_DATA1              ; 75
dd C_DATA1              ; 76
dd C_DATA1              ; 77
dd C_DATA1              ; 78
dd C_DATA1              ; 79
dd C_DATA1              ; 7A
dd C_DATA1              ; 7B
dd C_DATA1              ; 7C
dd C_DATA1              ; 7D
dd C_DATA1              ; 7E
dd C_DATA1              ; 7F
dd C_MODRM+C_DATA1      ; 80
dd C_MODRM+C_DATA66     ; 81
dd C_MODRM+C_DATA1      ; 82
dd C_MODRM+C_DATA1      ; 83
dd C_MODRM              ; 84
dd C_MODRM              ; 85
dd C_MODRM              ; 86
dd C_MODRM              ; 87
dd C_MODRM              ; 88
dd C_MODRM              ; 89
dd C_MODRM              ; 8A
dd C_MODRM              ; 8B
dd C_MODRM              ; 8C
dd C_MODRM              ; 8D
dd C_MODRM              ; 8E
dd C_MODRM              ; 8F
dd 0                    ; 90
dd 0                    ; 91
dd 0                    ; 92
dd 0                    ; 93
dd 0                    ; 94
dd 0                    ; 95
dd 0                    ; 96
dd 0                    ; 97
dd 0                    ; 98
dd 0                    ; 99
dd C_DATA66+C_MEM2      ; 9A
dd 0                    ; 9B
dd 0                    ; 9C
dd 0                    ; 9D
dd 0                    ; 9E
dd 0                    ; 9F
dd C_MEM67              ; A0
dd C_MEM67              ; A1
dd C_MEM67              ; A2
dd C_MEM67              ; A3
dd 0                    ; A4
dd 0                    ; A5
dd 0                    ; A6
dd 0                    ; A7
dd C_DATA1              ; A8
dd C_DATA66             ; A9
dd 0                    ; AA
dd 0                    ; AB
dd 0                    ; AC
dd 0                    ; AD
dd 0                    ; AE
dd 0                    ; AF
dd C_DATA1              ; B0
dd C_DATA1              ; B1
dd C_DATA1              ; B2
dd C_DATA1              ; B3
dd C_DATA1              ; B4
dd C_DATA1              ; B5
dd C_DATA1              ; B6
dd C_DATA1              ; B7
dd C_DATA66             ; B8
dd C_DATA66             ; B9
dd C_DATA66             ; BA
dd C_DATA66             ; BB
dd C_DATA66             ; BC
dd C_DATA66             ; BD
dd C_DATA66             ; BE
dd C_DATA66             ; BF
dd C_MODRM+C_DATA1      ; C0
dd C_MODRM+C_DATA1      ; C1
dd C_DATA2              ; C2
dd 0                    ; C3
dd C_MODRM              ; C4
dd C_MODRM              ; C5
dd C_MODRM+C_DATA1      ; C6
dd C_MODRM+C_DATA66     ; C7
dd C_DATA2+C_DATA1      ; C8
dd 0                    ; C9
dd C_DATA2              ; CA
dd 0                    ; CB
dd 0                    ; CC
dd 0                    ; CD
dd 0                    ; CE
dd 0                    ; CF
dd C_MODRM              ; D0
dd C_MODRM              ; D1
dd C_MODRM              ; D2
dd C_MODRM              ; D3
dd C_DATA1              ; D4
dd C_DATA1              ; D5
dd 0                    ; D6
dd 0                    ; D7
dd C_MODRM              ; D8
dd C_MODRM              ; D9
dd C_MODRM              ; DA
dd C_MODRM              ; DB
dd C_MODRM              ; DC
dd C_MODRM              ; DD
dd C_MODRM              ; DE
dd C_MODRM              ; DF
dd C_DATA1              ; E0
dd C_DATA1              ; E1
dd C_DATA1              ; E2
dd C_DATA1              ; E3
dd C_DATA1              ; E4
dd C_DATA1              ; E5
dd C_DATA1              ; E6
dd C_DATA1              ; E7
dd C_DATA66             ; E8
dd C_DATA66             ; E9
dd C_DATA66+C_MEM2      ; EA
dd C_DATA1              ; EB
dd 0                    ; EC
dd 0                    ; ED
dd 0                    ; EE
dd 0                    ; EF
dd C_PREFIX             ; F0
dd 0                    ; F1
dd C_PREFIX             ; F2
dd C_PREFIX             ; F3
dd 0                    ; F4
dd 0                    ; F5
dd 0                    ; F6
dd 0                    ; F7
dd 0                    ; F8
dd 0                    ; F9
dd 0                    ; FA
dd 0                    ; FB
dd 0                    ; FC
dd 0                    ; FD
dd C_MODRM              ; FE
dd C_MODRM              ; FF

table_0F                label   dword   ; 0FΪǰ׺µÄÖ¸Áî

dd C_MODRM              ; 00
dd C_MODRM              ; 01
dd C_MODRM              ; 02
dd C_MODRM              ; 03
dd -1                   ; 04
dd -1                   ; 05
dd 0                    ; 06
dd -1                   ; 07
dd 0                    ; 08
dd 0                    ; 09
dd 0                    ; 0A
dd 0                    ; 0B
dd -1                   ; 0C
dd -1                   ; 0D
dd -1                   ; 0E
dd -1                   ; 0F
dd -1                   ; 10
dd -1                   ; 11
dd -1                   ; 12
dd -1                   ; 13
dd -1                   ; 14
dd -1                   ; 15
dd -1                   ; 16
dd -1                   ; 17
dd -1                   ; 18
dd -1                   ; 19
dd -1                   ; 1A
dd -1                   ; 1B
dd -1                   ; 1C
dd -1                   ; 1D
dd -1                   ; 1E
dd -1                   ; 1F
dd -1                   ; 20
dd -1                   ; 21
dd -1                   ; 22
dd -1                   ; 23
dd -1                   ; 24
dd -1                   ; 25
dd -1                   ; 26
dd -1                   ; 27
dd -1                   ; 28
dd -1                   ; 29
dd -1                   ; 2A
dd -1                   ; 2B
dd -1                   ; 2C
dd -1                   ; 2D
dd -1                   ; 2E
dd -1                   ; 2F
dd -1                   ; 30
dd -1                   ; 31
dd -1                   ; 32
dd -1                   ; 33
dd -1                   ; 34
dd -1                   ; 35
dd -1                   ; 36
dd -1                   ; 37
dd -1                   ; 38
dd -1                   ; 39
dd -1                   ; 3A
dd -1                   ; 3B
dd -1                   ; 3C
dd -1                   ; 3D
dd -1                   ; 3E
dd -1                   ; 3F
dd -1                   ; 40
dd -1                   ; 41
dd -1                   ; 42
dd -1                   ; 43
dd -1                   ; 44
dd -1                   ; 45
dd -1                   ; 46
dd -1                   ; 47
dd -1                   ; 48
dd -1                   ; 49
dd -1                   ; 4A
dd -1                   ; 4B
dd -1                   ; 4C
dd -1                   ; 4D
dd -1                   ; 4E
dd -1                   ; 4F
dd -1                   ; 50
dd -1                   ; 51
dd -1                   ; 52
dd -1                   ; 53
dd -1                   ; 54
dd -1                   ; 55
dd -1                   ; 56
dd -1                   ; 57
dd -1                   ; 58
dd -1                   ; 59
dd -1                   ; 5A
dd -1                   ; 5B
dd -1                   ; 5C
dd -1                   ; 5D
dd -1                   ; 5E
dd -1                   ; 5F
dd -1                   ; 60
dd -1                   ; 61
dd -1                   ; 62
dd -1                   ; 63
dd -1                   ; 64
dd -1                   ; 65
dd -1                   ; 66
dd -1                   ; 67
dd -1                   ; 68
dd -1                   ; 69
dd -1                   ; 6A
dd -1                   ; 6B
dd -1                   ; 6C
dd -1                   ; 6D
dd -1                   ; 6E
dd -1                   ; 6F
dd -1                   ; 70
dd -1                   ; 71
dd -1                   ; 72
dd -1                   ; 73
dd -1                   ; 74
dd -1                   ; 75
dd -1                   ; 76
dd -1                   ; 77
dd -1                   ; 78
dd -1                   ; 79
dd -1                   ; 7A
dd -1                   ; 7B
dd -1                   ; 7C
dd -1                   ; 7D
dd -1                   ; 7E
dd -1                   ; 7F
dd C_DATA66             ; 80
dd C_DATA66             ; 81
dd C_DATA66             ; 82
dd C_DATA66             ; 83
dd C_DATA66             ; 84
dd C_DATA66             ; 85
dd C_DATA66             ; 86
dd C_DATA66             ; 87
dd C_DATA66             ; 88
dd C_DATA66             ; 89
dd C_DATA66             ; 8A
dd C_DATA66             ; 8B
dd C_DATA66             ; 8C
dd C_DATA66             ; 8D
dd C_DATA66             ; 8E
dd C_DATA66             ; 8F
dd C_MODRM              ; 90
dd C_MODRM              ; 91
dd C_MODRM              ; 92
dd C_MODRM              ; 93
dd C_MODRM              ; 94
dd C_MODRM              ; 95
dd C_MODRM              ; 96
dd C_MODRM              ; 97
dd C_MODRM              ; 98
dd C_MODRM              ; 99
dd C_MODRM              ; 9A
dd C_MODRM              ; 9B
dd C_MODRM              ; 9C
dd C_MODRM              ; 9D
dd C_MODRM              ; 9E
dd C_MODRM              ; 9F
dd 0                    ; A0
dd 0                    ; A1
dd 0                    ; A2
dd C_MODRM              ; A3
dd C_MODRM+C_DATA1      ; A4
dd C_MODRM              ; A5
dd -1                   ; A6
dd -1                   ; A7
dd 0                    ; A8
dd 0                    ; A9
dd 0                    ; AA
dd C_MODRM              ; AB
dd C_MODRM+C_DATA1      ; AC
dd C_MODRM              ; AD
dd -1                   ; AE
dd C_MODRM              ; AF
dd C_MODRM              ; B0
dd C_MODRM              ; B1
dd C_MODRM              ; B2
dd C_MODRM              ; B3
dd C_MODRM              ; B4
dd C_MODRM              ; B5
dd C_MODRM              ; B6
dd C_MODRM              ; B7
dd -1                   ; B8
dd -1                   ; B9
dd C_MODRM+C_DATA1      ; BA
dd C_MODRM              ; BB
dd C_MODRM              ; BC
dd C_MODRM              ; BD
dd C_MODRM              ; BE
dd C_MODRM              ; BF
dd C_MODRM              ; C0
dd C_MODRM              ; C1
dd -1                   ; C2
dd -1                   ; C3
dd -1                   ; C4
dd -1                   ; C5
dd -1                   ; C6
dd -1                   ; C7
dd 0                    ; C8
dd 0                    ; C9
dd 0                    ; CA
dd 0                    ; CB
dd 0                    ; CC
dd 0                    ; CD
dd 0                    ; CE
dd 0                    ; CF
dd -1                   ; D0
dd -1                   ; D1
dd -1                   ; D2
dd -1                   ; D3
dd -1                   ; D4
dd -1                   ; D5
dd -1                   ; D6
dd -1                   ; D7
dd -1                   ; D8
dd -1                   ; D9
dd -1                   ; DA
dd -1                   ; DB
dd -1                   ; DC
dd -1                   ; DD
dd -1                   ; DE
dd -1                   ; DF
dd -1                   ; E0
dd -1                   ; E1
dd -1                   ; E2
dd -1                   ; E3
dd -1                   ; E4
dd -1                   ; E5
dd -1                   ; E6
dd -1                   ; E7
dd -1                   ; E8
dd -1                   ; E9
dd -1                   ; EA
dd -1                   ; EB
dd -1                   ; EC
dd -1                   ; ED
dd -1                   ; EE
dd -1                   ; EF
dd -1                   ; F0
dd -1                   ; F1
dd -1                   ; F2
dd -1                   ; F3
dd -1                   ; F4
dd -1                   ; F5
dd -1                   ; F6
dd -1                   ; F7
dd -1                   ; F8
dd -1                   ; F9
dd -1                   ; FA
dd -1                   ; FB
dd -1                   ; FC
dd -1                   ; FD
dd -1                   ; FE
dd -1                   ; FF

                        end


    ÏÖÔÚÎÒÃÇ¿ÉÒÔ»ñÈ¡ÈÎÒâµØÖ·µÄÖ¸Á¶È¡£ÎÒÃÇÖØ¸´µ÷ÓÃÕâ¸öº¯ÊýÖ±µ½¶ÁÈ¡ÁË5¸ö×Ö½Ú¡£Íê³Éºó°ÑÕâЩ×Ö½Ú¿½±´µ½old_hook¡£ÎÒÃÇÖªµÀÁË¿ªÊ¼ÕâЩָÁîµÄ³¤¶È£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚԭʼº¯ÊýµÄÏÂÌõÖ¸ÁîÌîÈëÌø×ªµØÖ·¡£

.386p
.model flat, stdcall

...

.data

kernel_name         db "kernel32.dll",0
sleep_name        db "Sleep",0

...

MEM_RELEASE        dd 000008000h

;16 nops + Ò»¸öÌø×ªÖ¸Áî
old_sleep        db 090h,090h,090h,090h,090h,090h,090h,090h,
               090h,090h,090h,090h,090h,090h,090h,090h,
               0E9h,000h,000h,000h,000h


.code
start:
    push    5000
    call    Sleep

do_hook:
    push    offset kernel_name
    call    GetModuleHandleA
    push    offset sleep_name
        push    eax
    call    GetProcAddress
        push    eax
    mov    esi,eax

    xor    ecx,ecx
    mov    ebx,esi
get_five_bytes:
    push    ecx
    push    ebx
    call    get_instr_len        ;µ÷ÓÃLDE32
    pop    ecx
    add    ecx,eax
    add    ebx,eax
    cmp    ecx,5
    jb    get_five_bytes
    mov    edi,offset old_sleep    ;¼ÆËãÌø×ªµØÖ·
    mov    [edi+011h],ebx
    sub    [edi+011h],edi
    sub    dword ptr [edi+011h],015h
    rep    movsb
    pop    edi

;ÏÂÃæµÄ´úÂë¶¼ÊÇÇ°ÃæÓеģ¬ËùÒÔ²»ÐèҪע½âÁË

    push    PAGE_READWRITE
    push    MEM_COMMIT
    push    MEMORY_BASIC_INFORMATION_SIZE
    push     0
    call    VirtualAlloc
    test    eax,eax
    jz     do_sleep
    mov    esi,eax

    push    MEMORY_BASIC_INFORMATION_SIZE
    push    esi
    push    edi
    call    VirtualQuery
    test    eax,eax
    jz    free_mem

    call    GetCurrentProcess
    push    5
    push    edi
    push    eax
    call    FlushInstructionCache    

    lea    eax,[esi+014h]
    push    eax
    push    PAGE_EXECUTE_READWRITE
    lea    eax,[esi+00Ch]
    push    [eax]
    push    [esi]
    call    VirtualProtect
    test    eax,eax
    jz    free_mem

    mov    byte ptr [edi],0E9h
    mov    eax,offset new_sleep
    sub    eax,edi
    sub    eax,5
    inc    edi
    stosd

    push    offset old_protect
    lea    eax,[esi+014h]
    push    [eax]
    lea    eax,[esi+00Ch]
    push    [eax]
    push    [esi]
    call    VirtualProtect

free_mem:
    push    MEM_RELEASE
    push    0
    push    esi
    call    VirtualFree
do_sleep:
    push    5000
    call    Sleep
    push    0
    call    ExitProcess
new_sleep:
    mov    eax,dword ptr [esp+004h]        
    add    eax,eax                ;ÖØ¸´ÑÓʱ
    push    eax
    mov    eax,offset old_sleep            ;µ÷ÓÃÔ­º¯Êý
    call    eax
    ret    004h


¹Ò¹³ºó¿´ÆðÀ´ÏëÕâÑù:

    004010CC: 6888130000    push 000001388h
    004010D1: E818090000    call Sleep


    Sleep:     ;Ìø×ªµ½IATÀïµÄµØÖ·
    004019EE: FF2514204000    jmp dword ptr [000402014h]

    tabulka:
    00402014: 79 67 E8 77 6C 7D E8 77
      
    Kernel32.Sleep:
    77E86779: E95FA95788    jmp 0004010DDh

    new_sleep:
    004010DD: 8B442404    mov eax,dword ptr [esp+4]
    004010E1: 03C0        add eax,eax
    004010E3: 50        push eax
    004010E4: B827304000    mov eax,000403027h
    004010E9: FFD0        call eax

    old_sleep:
    00403027: 6A00        push 0
    00403029: FF742408    push dword ptr [esp+8]
    0040302D: 90        nop
    0040302E: 90        nop
    0040302F: 90        nop
    00403030: 90        nop
    00403031: 90        nop
    00403032: 90        nop
    00403033: 90        nop
    00403034: 90        nop
    00403035: 90        nop
    00403036: 90        nop
    00403037: E94337A877    jmp Kernel32.77E8677F

;Õâ¸öÖ¸ÁîÔÚKernel32.Sleep(77E86779)ºó1¸ö×Ö½Ú

    Kernel32.77E8677F:    
    77E8677F: E803000000    call Kernel32.SleepEx
    ...            ;ºóÃæµÄÒѲ»ÖØÒª

ΪÁËÈÃÕâЩ¿´ÆðÀ´¸üÇå³þ£¬ÕâÊÇԭʼ°æ±¾µÄKernel32.Sleep:

    Kernel32.Sleep:
    77E86779: 6A00        push 0
    77E8677B: FF742408    push dword ptr [esp+8]
    77E8677F: E803000000    call Kernel32.SleepEx
    77E86784: C20400    ret 00004h


    ¾ÍÏóÄã¿´µ½µÄ£¬ÔÚÎÒÃÇÒѾ­¿½±´Á˵Ú1ºÍµÚ2¸öÖ¸Áî(ÕâÀï×ܹ²6¸ö×Ö½Ú)ºÍÖ¸ÏòÏÂÒ»ÌõÖ¸ÁîµÄÌø×ªÖ¸ÁîºóÓ¦¸ÃÊÇÔõÑù¡£ÕâÀïÎÒÃǵüÙÉèÌø×ªÖ¸Áî²¢²»Ïóº¯Êý¿ªÊ¼µÄÖ¸ÁîÄÇô·ÅÖ㬷ñÔòÎÒÃǾͻáÓöµ½ÎÊÌâ¡£ÏÂÒ»¸öÎÊÌâ¾ÍÊÇÖîÈçntdll.DbgBreakPointÕâÑùµÄAPI£¬ËüÃÇÌ«¶ÌÁË£¬ËùÒÔ²»ÄÜÓÃÕâÖÖ¹Ò¹³µÄ·½·¨¡£²¢ÇÒËüÊÇÓÉKernel32.DebugBreakµ÷Óã¬ËùÒÔÒ²²»ÄÜͨ¹ýÐÞ¸ÄIATÀ´¹Ò¹³¡£ËäȻ˵ûÓÐË­»áÈ¥¹Ò¹³Õâ¸öÖ»ÓÐint 3µÄº¯Êý£¬µ«Ã»ÓÐʲôÊÇ×ö²»µ½µÄ£¬Ö»ÒªÈÏÕæÏëÏë¾ÍÄÜÕÒµ½½â¾öµÄ·½·¨¡£Îҵķ½·¨Êǹҹ³ËüÖ®ºóµÄÄǸöº¯Êý(Ëü¿ÉÄÜ»áÒòΪÐÞ¸ÄÁËǰһ¸öº¯ÊýµÄ¿ªÊ¼5¸ö×Ö½Ú¶ø±»ÆÆ»µ)¡£DbgBreakPointº¯Êý³¤¶ÈΪ2¸ö×Ö½Ú£¬ËùÒÔÕâÀïÎÒÃÇ¿ÉÒÔÉèÖÃһЩ±êÖ¾£¬È»ºóÊÔ×ÅÔÚµÚ¶þ¸öº¯ÊýµÄ¿ªÊ¼Ð´ÈëÌõ¼þÌø×ªÖ¸Áî...µ«Õâ²»ÊÇÎÒÃÇÏÖÔÚµÄÎÊÌâ¡£
    ±£´æÔ­Ê¼º¯ÊýµÄÎÊÌâÒѾ­ÐðÊöÍêÁË£¬¾Íµ½½â³ý¹Ò¹³(unhook)¡£½â³ý¹Ò¹³¾ÍÊǰѱ»Ð޸ĵÄ×Ö½Ú»Ö¸´ÎªÔ­Ê¼×´Ì¬¡£ÐÞ¸ÄIATµÄ·½·¨ÀÈç¹ûÄãÏë½â³ý¹Ò¹³µÄ»°£¬Äã¾ÍÐèÒªÔÚ±íÀï»Ö¸´Ô­Ê¼µÄµØÖ·¡£ÐÞ¸ÄÈë¿ÚµãµÄ·½·¨ÀÄãÒª×öµÄ¾ÍÊǰÑԭʼº¯ÊýµÄ¿ªÊ¼Ö¸Á±´»ØÈ¥¡£Á½ÖÖ×ö·¨¶¼ºÜ¼òµ¥£¬ËùÒÔ²»ÐèÒªÔÙ½²ÁË¡£


=====[ 3.2.4 ¹Ò¹³ÆäËü½ø³Ì ]========================================
    
    ÏÖÔÚÎÒÃÇÀ´Êµ¼ùÒ»ÏÂÔËÐÐÖйҹ³¡£ÊÔÏ룬˭»áÏëÖ»¹Ò¹³×Ô¼º½ø³Ì?ÕâÏÔÈ»ÊǷdz£²»ÊµÓõġ£
    ÎÒÀ´ÑÝʾ3ÖÖ²»Í¬µÄ¹Ò¹³ÆäËü½ø³ÌµÄ·½·¨¡£ÆäÖÐÁ½ÖÖ¶¼Ê¹ÓÃÁËCreateRemoteThreadÕâ¸öAPI£¬ËüÖ»ÔÚʹÓÃÁËNT¼¼ÊõµÄWindows°æ±¾ÀïÓÐЧ¡£¶ÔÎÒÀ´ËµÔÚ½ÏÀϵÄWindowsÀï¹Ò¹³Ã»ÄÇôÓÐȤ¡£ÍüÁË˵ÎÒ½«½éÉܵÄÕâ3¸ö·½·¨ÎÒ¶¼Ã»ÓÐʵ¼ù¹ý£¬ËùÒÔ¿ÉÄÜ»á³öµãÎÊÌâ¡£
    ÏȽéÉÜCreateRemoteThread¡£¾ÍÏó°ïÖúÀï˵µÄ£¬Õâ¸öº¯Êý¿ÉÒÔÔÚÈÎÒâ½ø³ÌÀï´´½¨ÐÂÏ̲߳¢ÔËÐÐËüµÄ´úÂë¡£

    HANDLE CreateRemoteThread(
        HANDLE hProcess,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        DWORD dwStackSize,
        LPTHREAD_START_ROUTINE lpStartAddress,
        LPVOID lpParameter,
        DWORD dwCreationFlags,
        LPDWORD lpThreadId
    );

    ¾ä±úhProcess¿ÉÒÔͨ¹ýOpenProcess»ñµÃ¡£ÕâÀïÎÒÃDZØÐë»ñµÃ×㹻ȨÏÞ¡£lpStartAddressÊÇÖ¸ÏòÄ¿±ê½ø³ÌµØÖ·¿Õ¼äÀï´æ·ÅÐÂÏ̵߳ÚÒ»ÌõÖ¸ÁîµØÖ·µÄÖ¸Õ룬ÒòΪÐÂÏß³ÌÊÇÔÚÄ¿±ê½ø³ÌÀï´´½¨£¬ËùÒÔËü´æÔÚÓÚÄ¿±ê½ø³ÌµÄµØÖ·¿Õ¼äÀï¡£lpParameterÊÇÖ¸ÏòÌá½»¸øÐÂÏ̵߳IJÎÊýµÄÖ¸Õë¡£


=====[ 3.2.4.1 DLL×¢Èë ]==================================================

    ÎÒÃÇ¿ÉÒÔÔÚÄ¿±ê½ø³ÌµØÖ·¿Õ¼äÀïÈÎÒâµØ·½ÔËÐÐÎÒÃǵÄÐÂÏ̡߳£Õâ¿´ÆðÀ´Ã»Ê²Ã´Ó㬳ý·ÇÔÚÀïÃæÓÐÎÒÃÇÍêÕûµÄ´úÂë¡£µÚÒ»ÖÖ·½·¨¾ÍÊÇÕâôʵÏÖ¡£Ëüµ÷ÓÃGetProcAddress»ñÈ¡LoadLibraryµØÖ·¡£È»ºó°ÑLoadLibrary¸³Öµ¸ø²ÎÊýlpStartAddress¡£LoadLibraryº¯ÊýÖ»ÓÐÒ»¸ö²ÎÊý£¬¾ÍºÍÄ¿±ê½ø³ÌÀïÐÂÏ̵߳ĺ¯ÊýÒ»Ñù¡£

    HINSTANCE LoadLibrary(
        LPCTSTR lpLibFileName
    );

    ÎÒÃÇ¿ÉÒÔʹÓÃÕâµãÏàËÆÐÔ£¬°ÑlpParameter²ÎÊý¸³ÎªÎÒÃǵÄDLL¿âµÄÃû×Ö¡£ÔÚÐÂÏß³ÌÔËÐкólpParameterµÄλÖþÍÊÇlpLibFileNameµÄλÖá£ÕâÀï×îÖØÒªµÄ¶«Î÷Ç°ÃæÒѾ­½²¹ýÁË¡£ÔÚ¼ÓÔØÁËеÄÄ£¿éµ½Ä¿±ê½ø³Ìºó¾Í¿ªÊ¼Ö´Ðгõʼ»¯²¿·Ö¡£Èç¹ûÎÒÃÇÔÚÕâÀï·ÅÖÃÁËÄܹ»¹Ò¹³ÆäËüº¯ÊýµÄÌØÊ⺯Êý¾ÍOKÁË¡£ÔÚÖ´ÐÐÁ˳õʼ»¯²¿·Öºó£¬Õâ¸öÏ߳̾Íʲô¶¼²»×ö²¢±»¹Ø±Õ£¬µ«ÎÒÃǵÄÄ£¿éÈÔÈ»ÔÚµØÖ·¿Õ¼äÖС£ÕâÖÖ·½·¨ºÜ²»´í¶øÇÒºÜÈÝÒ×ʵÏÖ£¬ËüµÄÃû×Ö½ÐDLL×¢Èë¡£µ«Èç¹ûÄãºÍÎÒÒ»Ñù²»Ï²»¶»¹µÃ¶à¸öDLL¿âµÄ»°£¬Çë¿´ÏÂÃæµÄ·½·¨¡£µ«Èç¹û²»½éÒâ¶à¸öDLL¿âµÄ»°ÕâȷʵÊÇ×î¿ìµÄ·½·¨(´Ó³ÌÐòÔ±µÄ½Ç¶ÈÀ´¿´)¡£


=====[ 3.2.4.2 ¶ÀÁ¢µÄ´úÂë ]===============================================

    ÊµÏÖ¶ÀÁ¢µÄ´úÂë±È½ÏÀ§ÄÑ£¬µ«Ò²ÈÝÒ׸øÈËÉî¿ÌÓ¡Ïó¡£¶ÀÁ¢µÄ´úÂëÊDz»ÐèÒªÈκξ²Ì¬µØÖ·µÄ´úÂë¡£ËüÀïÃæËùÓж«Î÷¶¼ÊÇ»¥ÏàÁªÏµµØÖ¸Ïò´úÂëÀïÃæÄ³Ð©ÌØ¶¨µÄµØ·½¡£Èç¹ûÎÒÃDz»ÖªµÀÕâ¶Î´úÂ뿪ʼִÐеĵØÖ·ËüÒ²ÄÜ×Ô¼ºÍê³É ¡£µ±È»£¬Ò²ÓпÉÄÜÏÈ»ñµÃµØÖ·È»ºóÖØÐÂÁ´½ÓÎÒÃǵĴúÂëÕâÑùËü¿ÉÒÔÍêÈ«Õý³£µØÔÚеØÖ·¹¤×÷£¬µ«Õâ±È±àд¶ÀÁ¢µÄ´úÂë¸üÀ§ÄÑ¡£ÕâÀàÐÍ´úÂëµÄÀý×ӱȷ½Ëµ²¡¶¾µÄ´úÂë¡£²¡¶¾Í¨¹ýÕâÖÖ·½·¨¸ÐȾ¿ÉÖ´ÐÐÎļþ£¬Ëü°ÑËü×Ô¼ºµÄ´úÂë¼ÓÈëµ½¿ÉÖ´ÐÐÎļ