²é¿´: 572  |  »Ø¸´: 4
µ±Ç°Ö÷ÌâÒѾ­´æµµ¡£
µ±Ç°Ö»ÏÔʾÂú×ãÖ¸¶¨Ìõ¼þµÄ»ØÌû£¬µã»÷ÕâÀï²é¿´±¾»°ÌâµÄËùÓлØÌû

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

[½»Á÷] PE֪ʶѧϰ[תÌù]

PE ÎļþµÄ֪ʶÊÇ»ù±¾µÄ֪ʶ.ÍøÉÏÓкܶàÕâ·½ÃæµÄ×ÊÁÏ.È»¶øÏµÍ³½²½âµÄÈ´²»¶à.ÎÒ²»ÊÇÕâ·½ÃæµÄר¼Ò,È´Ï£ÍûÄÜÅ×שÒýÓñ,µÃµ½Õâ·½ÃæµÄһЩָµã.

    ¼ÆËã»úÕâÃÅ¿ÆÑ§ÊÇʵ¼ùÐÔºÜÇ¿µÄÒ»ÃÅѧÎÊ,Èç¹ûÏëÔúÔúʵʵµÄѧ»áµã¶«Î÷,»¹ÊÇÒªÇ××Ô¶¯ÊÖÊÔÒ»ÊÔ.
    ÔÚ¼ÌÐøÏòÏ¿´Ö®Ç°,ÎÒ¼Ù¶¨Äã»á»ù±¾µÄCÓïÑԺͼòµ¥µÄʹÓÃVC6.0,ÒÔϵÄÀý×Ó¶¼ÓÃÓõ½ÕâЩ.³ý´ËÖ®Íâ,²»ÔÙ×öÈκμÙÉè.
    ¹ØÓÚpeµÄһЩ½á¹¹¿ÉÒÔÔÚwinnt.hÕâ¸öÍ·ÎļþÀïÕÒµ½.
   
    ÉùÃ÷Ò»ÏÂ:ÕâÀïËùÓеĽṹ¼°³£Á¿¶¨Òå¶¼ÊÇ»ùÓÚintelµÄx86 CPUµÄ,ÔÚÆäËûµÄϵͳÉÏ¿ÉÄÜÓÐËù²»Í¬,ÄãÓ¦¸ÃÈ¥²é¿´ÏàÓ¦µÄ×ÊÁÏ.¹ØÓÚÕâµãÒÔºó²»ÔÙÉùÃ÷.
   
    Ê×ÏÈÔÚpeÎļþµÄ¿ªÊ¼ÊÇÕâÑùÒ»¸ö½á¹¹(ΪÁË·½±ãÔĶÁ,ÎÒ¼ÓÉÏÁË×Ö½ÚÆ«ÒÆ):
   
    typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
00h    WORD   e_magic;     // Magic number    **DOSÍ·±ê¼Ç
02h    WORD   e_cblp;      // Bytes on last page of file
04h    WORD   e_cp;        // Pages in file
06h    WORD   e_crlc;      // Relocations
08h    WORD   e_cparhdr;   // Size of header in paragraphs
0ah    WORD   e_minalloc;  // Minimum extra paragraphs needed
0ch    WORD   e_maxalloc;  // Maximum extra paragraphs needed
0eh    WORD   e_ss;        // Initial (relative) SS value
10h    WORD   e_sp;        // Initial SP value
12h    WORD   e_csum;      // Checksum
14h    WORD   e_ip;        // Initial IP value
16h    WORD   e_cs;        // Initial (relative) CS value
18h    WORD   e_lfarlc;    // File address of relocation table
1ah    WORD   e_ovno;      // Overlay number
1ch    WORD   e_res[4];    // Reserved words
24h    WORD   e_oemid;     // OEM identifier (for e_oeminfo)
26h    WORD   e_oeminfo;   // OEM information; e_oemid specific
28h    WORD   e_res2[10];  // Reserved words
3ch    LONG   e_lfanew;    // File address of new exe header  **Ö¸ÏòPEÍ·²¿
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
  
¡¡¡¡Õâ¸ö½á¹¹¾ÍÊÇDOS MZÍ·,ÊÇΪÁËÏòϼæÈݵÄ.µ±ÔÚDOSÏÂÔËÐÐwindows³ÌÐò²»ÖÁÓÚ³ö´í.
¡¡¡¡ÎÒÃÇÖ»¹ØÐÄÁ½¸öÓò:e_magic ºÍe_lfanew.
     e_magic µÄÖµÓ¦¸ÃµÈÓÚ0x5A4D,ÏñÏÂÃæ¶¨ÒåÕâÑùµÄ:
             #define IMAGE_DOS_SIGNATURE    0x5A4D      // MZ
            
     e_lfanewÊÇÒ»¸öÖ¸Õë,Ö¸ÏòPEÎļþÍ·ÔÚPEÎļþÖÐµÄÆ«ÒÆ.
     
     PEÎļþÍ·ÊÇÕâÑùÒ»¸ö½á¹¹,Ëü°üº¬ÁËÐí¶àPE×°ÔØÆ÷ÒªÓõ½µÄÓò.
     typedef struct _IMAGE_NT_HEADERS {
         DWORD Signature;                         **PEÎļþ±êʶ
         IMAGE_FILE_HEADER FileHeader;            **Ó³ÏñÎļþÍ·
         IMAGE_OPTIONAL_HEADER32 OptionalHeader;  **Ó³Ïñ¿Éѡͷ
     } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
     
     SignatureµÄ¶¨ÒåÈçÏÂ:
     #define IMAGE_NT_SIGNATURE    0x00004550  // PE00
     
     ºÃÁË,ÈÃÎÒÃÇʵ¼Ê×öµãÊÂ.д¸öС³ÌÐò²é¿´Ò»ÏÂPEÎļþµÄÕâЩÐÅÏ¢,²¢ÅжÏÒ»¸öPEÎļþÊÇ·ñÓÐЧ.
     ´úÂëÈçÏÂ,Äã¿ÉÒÔÔÚVCÖн¨Ò»¸ö¿ØÖÆÌ¨³ÌÐò,È»ºó°ÑÕâ¶Î´úÂ뿽½øÈ¥(ÎÒ½¨ÒéÄãÊÖ¹¤ÊäÈë.ʲô?Äã²»Ô¸Òâ?¹þ¹þ,ÎÒ¿ÉÊÇÒ»¸öÒ»¸ö×ÖĸÇýøÈ¥µÄ,Äã±ÈÎÒ»¹ÀÁ )
     
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
        FILE *p;
        IMAGE_DOS_HEADER mydosheader;
        unsigned long sig;

        p = fopen("test1.exe","r+b";
        if(p == NULL)return -1;

        fread(&mydosheader,sizeof(mydosheader),1,p);
        fseek(p,mydosheader.e_lfanew,SEEK_SET);
        fread(&sig,4,1,p);
        fclose(p);

        printf("IMAGE_DOS_HEADER dump:\n";
        printf("e_magic   : %04x\n",mydosheader.e_magic);
        printf("e_cblp    : %04x\n",mydosheader.e_cblp);
        printf("e_cp      : %04x\n",mydosheader.e_cp);
        printf("e_crlc    : %04x\n",mydosheader.e_crlc);
        printf("e_cparhdr : %04x\n",mydosheader.e_cparhdr);
        printf("e_minalloc: %04x\n",mydosheader.e_minalloc);
        printf("e_maxalloc: %04x\n",mydosheader.e_maxalloc);
        printf("e_ss      : %04x\n",mydosheader.e_ss);
        printf("e_sp      : %04x\n",mydosheader.e_sp);
        printf("e_csum    : %04x\n",mydosheader.e_csum);
        printf("e_ip      : %04x\n",mydosheader.e_ip);
        printf("e_cs      : %04x\n",mydosheader.e_cs);
        printf("e_lfarlc  : %04x\n",mydosheader.e_lfarlc);
        printf("e_ovno    : %04x\n",mydosheader.e_ovno);
        printf("e_res[0]  : %04x\n",mydosheader.e_res[0]);
        printf("e_oemid   : %04x\n",mydosheader.e_oemid);
        printf("e_oeminfo : %04x\n",mydosheader.e_oeminfo);
        printf("res2[0]   : %04x\n",mydosheader.e_res2[0]);
        printf("lfanew    : %08x\n",mydosheader.e_lfanew);


        if((mydosheader.e_magic ==IMAGE_DOS_SIGNATURE) &&
                (sig == IMAGE_NT_SIGNATURE))
              printf("ÓÐЧµÄPEÎļþ\n";
        else
            printf("ÎÞЧµÄPEÎļþ\n";
        return 0;
}






PE֪ʶѧϰ£¨¶þ£©




ÎÒÃÇÁ˽âÁËpeÍ·²¿µÄdos²¿Êײ¿·Ö,ÎÒÃÇÖªµÀÔÚÕâ¸ö½á¹¹Àïe_magicºÍe_lfanewÕâÁ½¸öÓò¶ÔÎÒÃÇÀ´ËµºÜÖØÒª.ͬʱÎÒÃÇÒ²Ìáµ½ÁËe_lfanewÓòÖ¸ÏòIMAGE_NT_HEADERS32½á¹¹ÔÚpeÎļþµÄÆ«ÒÆ.
    ²¹³äÉùÃ÷Ò»ÏÂ:ÕâÀïµÄ֪ʶÊÇÊÊÓÃÓÚ32λ×ֵĻúÆ÷ÉϵÄ.
   
    ÏÂÃæÎÒÃǽÓ×Å¿´IMAGE_NT_HEADERS32½á¹¹,Õâ¸ö²¿·ÖÔÚpeÎļþµÄѧϰÀïÖÁ¹ØÖØÒª.
   
    IMAGE_NT_HEADERS32µÄ½á¹¹¶¨ÒåÈçÏÂ:
   
    typedef struct _IMAGE_NT_HEADERS {
         DWORD Signature;                         **PEÎļþ±êʶ "PE",0,0
         IMAGE_FILE_HEADER FileHeader;            **Ó³ÏñÎļþÍ·
         IMAGE_OPTIONAL_HEADER32 OptionalHeader;  **Ó³Ïñ¿Éѡͷ
     } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
     
    ÕâÆäÖÐÓÖ°üº¬ÁËÁ½¸ö½á¹¹.ÎÒÃÇÒ»µãÒ»µãµÄÍùÏ¿´.
    IMAGE_FILE_HEADERÕâ¸ö½á¹¹µÄ¶¨ÒåÈçÏÂ:
    typedef struct _IMAGE_FILE_HEADER {
     00h   WORD    Machine;                   **ÔËÐÐÆ½Ì¨
     02h   WORD    NumberOfSections;          **Çø¿éÊýÄ¿
     06h   DWORD   TimeDateStamp;             **ÎļþÈÕÆÚʱ¼ä´Á
     0Ah   DWORD   PointerToSymbolTable;      **Ö¸Ïò·ûºÅ±í
     0Eh   DWORD   NumberOfSymbols;           **·ûºÅ±íÖеķûºÅÊýÁ¿
     12h   WORD    SizeOfOptionalHeader;      **Ó³Ïñ¿Éѡͷ½á¹¹µÄ´óС
     14h   WORD    Characteristics;           **ÎļþÌØÕ÷Öµ
    } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
   
    ÎÒÃÇ¿´Ò»ÏÂÕ⼸¸öÓò:
   
    1) MachineÓò˵Ã÷Õâ¸öpeÎļþÔÚʲôCPUÉÏÔËÐÐ,¾ßÌåÈçÏÂ:
    #define IMAGE_FILE_MACHINE_UNKNOWN     0
    #define IMAGE_FILE_MACHINE_I386        0x014c  // Intel 386.
    #define IMAGE_FILE_MACHINE_R3000       0x0162  // MIPS little-endian, 0x160 big-endian
    #define IMAGE_FILE_MACHINE_R4000       0x0166  // MIPS little-endian
    #define IMAGE_FILE_MACHINE_R10000      0x0168  // MIPS little-endian
    #define IMAGE_FILE_MACHINE_WCEMIPSV2   0x0169  // MIPS little-endian WCE v2
    #define IMAGE_FILE_MACHINE_ALPHA       0x0184  // Alpha_AXP
    #define IMAGE_FILE_MACHINE_POWERPC     0x01F0  // IBM PowerPC Little-Endian
    #define IMAGE_FILE_MACHINE_SH3         0x01a2  // SH3 little-endian
    #define IMAGE_FILE_MACHINE_SH3E        0x01a4  // SH3E little-endian
    #define IMAGE_FILE_MACHINE_SH4         0x01a6  // SH4 little-endian
    #define IMAGE_FILE_MACHINE_ARM         0x01c0  // ARM Little-Endian
    #define IMAGE_FILE_MACHINE_THUMB       0x01c2
    #define IMAGE_FILE_MACHINE_IA64        0x0200  // Intel 64
    #define IMAGE_FILE_MACHINE_MIPS16      0x0266  // MIPS
    #define IMAGE_FILE_MACHINE_MIPSFPU     0x0366  // MIPS
    #define IMAGE_FILE_MACHINE_MIPSFPU16   0x0466  // MIPS
    #define IMAGE_FILE_MACHINE_ALPHA64     0x0284  // ALPHA64
    #define IMAGE_FILE_MACHINE_AXP64       IMAGE_FILE_MACHINE_ALPHA64
   
    2) NumberOfSections
    peÎļþÖÐÇø¿éµÄÊýÁ¿,¹ØÓÚÇø¿éÏÂÃæ»¹Òª½²µ½,ÕâÀïÏÈÓиöÓ¡Ïó¾Í¿ÉÒÔÁË.
   
    3)TimeDateStamp
    ÎļþÈÕÆÚʱ¼ä´Á,Ö¸Õâ¸öpeÎļþÉú³ÉµÄʱ¼ä,ËüµÄÖµÊÇ´Ó1969Äê12ÔÂ31ÈÕ16:00:00ÒÔÀ´µÄÃëÊý.
   
    4)PointerToSymbolTable
    Coffµ÷ÊÔ·ûºÅ±íµÄÆ«ÒÆµØÖ·.
   
    5)NumberOfSymbols
    Coff·ûºÅ±íÖзûºÅµÄ¸öÊý. Õâ¸öÓòºÍǰ¸öÓòÔÚrelease°æ±¾µÄ³ÌÐòÀïÊÇ0.
   
    6)SizeOfOptionalHeader
    IMAGE_OPTIONAL_HEADER32½á¹¹µÄ´óС(¼´¶àÉÙ×Ö½Ú).ÎÒÃǽÓמÍÒªÌáµ½Õâ¸ö½á¹¹ÁË.ÊÂʵÉÏ,peÎļþµÄ´ó²¿·ÖÖØÒªµÄÓò¶¼ÔÚIMAGE_OPTIONAL_HEADER½á¹¹Àï.
   
    7)Characteristics
    Õâ¸öÓòÃèÊöpeÎļþµÄһЩÊôÐÔÐÅÏ¢,±ÈÈçÊÇ·ñ¿ÉÖ´ÐÐ,ÊÇ·ñÊÇÒ»¸ö¶¯Ì¬Á¬½Ó¿âµÈ.¾ßÌ嶨ÒåÈçÏÂ:
#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // ÖØ¶¨Î»ÐÅÏ¢±»ÒƳý
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // Îļþ¿ÉÖ´ÐÐ
#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Ðкű»ÒƳý
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // ·ûºÅ±»ÒƳý
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // ³ÌÐòÄÜ´¦Àí´óÓÚ2GµÄµØÖ·
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32λ»úÆ÷
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // .dbgÎļþµÄµ÷ÊÔÐÅÏ¢±»ÒƳý
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // Èç¹ûÔÚÒÆ¶¯½éÖÊÖÐ,¿½µ½½»»»ÎļþÖÐÔËÐÐ
#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // Èç¹ûÔÚÍøÂçÖÐ,¿½µ½½»»»ÎļþÖÐÔËÐÐ
#define IMAGE_FILE_SYSTEM                    0x1000  // ϵͳÎļþ
#define IMAGE_FILE_DLL                       0x2000  // ÎļþÊÇÒ»¸ödll
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // ÎļþÖ»ÄÜÔËÐÐÔÚµ¥´¦ÀíÆ÷ÉÏ
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
    Ò»¸öpeÎļþµÄÌØÕ÷Öµ¾ÍÊÇÕâЩÊôÐÔÖµ¼ÓÔÚÒ»ÆðµÄ.
   
   Ï£ÍûÕâЩûÓÐÈÃÄãÍ·ÔÎ,ÆäʵÄÚÈݲ»¶à,Ö»ÊÇÒ»¸öIMAGE_FILE_HEADER½á¹¹,¶øÕâ¸ö½á¹¹°üº¬7¸öÓò¶øÒÑ.
   ÈÃÎÒÃÇÏÈÊìϤÕâ¸ö½á¹¹,ÎÒÃDZà¸ö³ÌÐòÀ´ÏÔʾÕâЩÐÅÏ¢.

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "conio.h"

int main(int argc, char* argv[])
{
        FILE *p;
        LONG e_lfanew;  //Ö¸ÏòIMAGE_NT_HEADERS32½á¹¹ÔÚÎļþÖÐµÄÆ«ÒÆ
        IMAGE_FILE_HEADER myfileheader;
      
        p = fopen("test1.exe","r+b";
        if(p == NULL)return -1;

        fseek(p,0x3c,SEEK_SET);
        fread(&e_lfanew,4,1,p);
        fseek(p,e_lfanew+4,SEEK_SET);  //Ö¸ÏòIMAGE_FILE_HEADER½á¹¹µÄÆ«ÒÆ
        fread(&myfileheader,sizeof(myfileheader),1,p);

        printf("IMAGE_FILE_HEADER½á¹¹:\n";
        printf("Machine              : %04X\n",myfileheader.Machine);
        printf("NumberOfSections     : %04X\n",myfileheader.NumberOfSections);
        printf("TimeDateStamp        : %08X\n",myfileheader.TimeDateStamp);
        printf("PointerToSymbolTable : %08X\n",myfileheader.PointerToSymbolTable);
        printf("NumberOfSymbols      : %08X\n",myfileheader.NumberOfSymbols);
        printf("SizeOfOptionalHeader : %04X\n",myfileheader.SizeOfOptionalHeader);
        printf("Characteristics      : %04X\n",myfileheader.Characteristics);
        getch();
        return 0;
}
   
´Ë³ÌÐòÔÚwin98 + vc6.0 »·¾³Ï±àÒëͨ¹ý.





¡¡

[ Last edited by sdlj8051 on 2006-10-6 at 12:49 ]
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

pe֪ʶѧϰ£¨ËÄ£©





   
    ÏÂÃæÎÒÃÇҪѧϰµÄ¿ÉÒÔ˵ÊÇpeÎļþµÄºËÐÄÄÚÈÝÁË.¼´¿é±í(section table)ºÍ¸÷ÖÖ¿é(Çø¶Î)µÄ½á¹¹.ÕâЩÄÚÈݱȽ϶àÇÒ³¤.Òò´ËÎÒ»á°ÑдÍêµÄÏÈ·¢³öÀ´,È»ºóÔÚÂýÂýµÄÐøÍê.Ï£ÍûÄãÓÐÄÍÐÄ¿´ÏÂÈ¥.ѧϰÓÐʱÊǺܿÝÔïµÄ.Òò´ËÔÚÊʵ±µÄʱºòÎÒÒ²»á¸ø³öµãÓ¦ÓõÄʵÀý.

    Äã¿ÉÄÜ»¹¼ÇµÃ,Çø¿éµÄÊýÁ¿ÔÚIMAGE_FILE_HEADER½á¹¹µÄNumberOfSectionsÓò¶¨Òå.ºÃÁË,ÎÒÃÇ¿´¿´ºÍÇø¿éÃÜÇÐÏà¹ØµÄ¿é±íµÄ½á¹¹¶¨Òå.
    ¿é±í½á¹¹µÄ¶¨ÒåÈçÏÂ:
   
#define IMAGE_SIZEOF_SHORT_NAME              8

typedef struct _IMAGE_SECTION_HEADER {
    00h BYTE    Name[IMAGE_SIZEOF_SHORT_NAME]; //¿éÃû,8¸ö×Ö½Ú³¤
    08h union {
            DWORD   PhysicalAddress; //objÎļþÖÐ,Çø¶ÎµÄʵ¼ÊµØÖ·
            DWORD   VirtualSize;    //exeºÍdllÎļþÖÐÇø¶ÎÔÚÎļþÖÐ¶ÔÆëǰµÄ´óС
        } Misc;
    0ch DWORD   VirtualAddress;         //¿éµÄRVA(Ïà¶ÔÐéÄâµØÖ·)
    10h DWORD   SizeOfRawData;          //ÔÚÎļþÖÐ¶ÔÆëºóµÄ´óС
    14h DWORD   PointerToRawData;       //ÔÚÎļþÖÐµÄÆ«ÒÆ
    18h DWORD   PointerToRelocations;   //ÖØ¶¨Î»µÄÆ«ÒÆ(objÎļþÖÐʹÓÃ)
    1ch DWORD   PointerToLinenumbers;   //ÐкűíµÄÆ«ÒÆ(µ÷ÊÔÓÃ)
    1eh WORD    NumberOfRelocations;    //ÖØ¶¨Î»ÏîÊýÄ¿(objÎļþÖÐʹÓÃ)
    20h WORD    NumberOfLinenumbers;    //ÐкűíÖÐÐкŵÄÊýÄ¿
    24h DWORD   Characteristics;        //¿éÊôÐÔ
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

    ¿é±í½á¹¹ÃèÊöÁËÇø¶ÎµÄÒ»Ð©ÖØÒªµÄÊôÐÔ,ÏÂÃæ¾ßÌå½âÊÍһϸ÷¸öÓòµÄº¬Òå.
1)Name[8] 8¸ö×Ö½ÚµÄÇø¶ÎÃû,²»×ã8¸öºóÃæÓÃ0²¹Æë.

2)VirtualSize  ÔÚexeºÍdllÎļþÖÐÕâ¸öÓò°üº¬µÄÊÇÇø¶Î»¹Ã»Óа´FileAlignmentÓò¶ÔÆëǰµÄ´óС.Èç¹ûÕâ¸ö½á¹¹ÃèÊöµÄÊÇ´úÂë¶Î,ÄÇôÕâ¸öÓòµÄÖµ¾ÍÊÇʵ¼ÊµÄ´úÂëÁ¿µÄ´óС.ÔÚpeÎļþµÄdiyʱ,Õâ¸öÓòºÜÓÐÓÃ.ËüÖ¸³öÁËÇø¶ÎÖÐÓжàÉÙûÓÐʹÓõĿռä.ÎÒÃÇ¿ÉÒÔÔÚûÓÐʹÓõĿռäÀï²åÈë×Ô¼ºµÄ´úÂë.ºÃ¶à²¡¶¾Ò²ÊǰѴúÂë²åÈëÊ£ÓàµÄ¿Õ¼äÀï.(ºÇºÇ,²»ÒªÑ§»µ.)
  
3)VirtualAddress ÔÚexeÎļþÖÐ,Õâ¸öÓòÊÇpeÎļþÓ³Éäµ½ÐéÄâÄÚ´æºó¸ÃÇø¶ÎµÄRVAµØÖ·.Õâ¸öÖµ¼ÓÉÏ»ùµØÖ·(IMAGE_OPTIONAL_HEADER32.ImageBase)ºó,¾ÍµÃµ½Á˸ÃÇø¶ÎÔÚÄÚ´æÖеÄʵ¼ÊÆðʼµØÖ·.
  
4)SizeOfRawData  Õâ¸öÓòÊÇËüÃèÊöµÄÇø¶Î°´IMAGE_OPTIONAL_HEADER32.FileAlignmentÓò¶ÔÆëºóÔÚÎļþÖеĴóС.Èç¹ûFileAlignmentΪ 0200h,VirtualSizeΪ035Ah,ÔòÕâ¸öֵΪ 0400h.
  
5)PointerToRawData ËüÃèÊöµÄÇø¶ÎµÄÆðʼµØÖ·ÔÚpeÎļþÖÐµÄÆ«ÒÆ.  

6)PointerToRelocations
7)PointerToLinenumbers
8)NumberOfRelocations
9)NumberOfLinenumbers   
    ÉÏÃæÕâËĸöÓòÔÚ·¢Ðа汾µÄ³ÌÐòÀï¶¼ÊÇ0.

10)Characteristics ¸ÃÇø¶ÎµÄÊôÐÔÐÅÏ¢.ÓÃÓÚ±íʾÕâ¸öÇø¶ÎÊÇ´úÂë¡¢Êý¾Ý¡¢¿É¶Á¡¢¿ÉдµÈµÈ.
    Õâ¸öÓò¶¨ÒåÈçÏÂ(ÖØÒªµÄÒѾ­×öÁËÖÐÎÄ×¢ÊÍ)£º

//      IMAGE_SCN_TYPE_REG                 0x00000000  // Reserved.
//      IMAGE_SCN_TYPE_DSECT               0x00000001  // Reserved.
//      IMAGE_SCN_TYPE_NOLOAD              0x00000002  // Reserved.
//      IMAGE_SCN_TYPE_GROUP               0x00000004  // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD              0x00000008  // Reserved.
//      IMAGE_SCN_TYPE_COPY                0x00000010  // Reserved.

#define IMAGE_SCN_CNT_CODE                 0x00000020  // Section contains code.
                                                       //Çø¶Î°üº¬´úÂë
#define IMAGE_SCN_CNT_INITIALIZED_DATA     0x00000040  // Section contains initialized data.
                                                       //Çø¶Î°üº¬Òѳõʼ»¯Êý¾Ý
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA   0x00000080  // Section contains uninitialized data.
                                                       //Çø¶Î°üº¬Î´³õʼ»¯Êý¾Ý
#define IMAGE_SCN_LNK_OTHER                0x00000100  // Reserved.
#define IMAGE_SCN_LNK_INFO                 0x00000200  // Section contains comments
                                                       // or some other type of information.
//      IMAGE_SCN_TYPE_OVER                0x00000400  // Reserved.
#define IMAGE_SCN_LNK_REMOVE               0x00000800  // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT               0x00001000  // Section contents comdat.
//                                         0x00002000  // Reserved.
//      IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC        0x00004000  // Reset speculative exceptions handling bits
                                                       // in the TLB entries for this section.
#define IMAGE_SCN_GPREL                    0x00008000  // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA              0x00008000
//      IMAGE_SCN_MEM_SYSHEAP  - Obsolete  0x00010000
#define IMAGE_SCN_MEM_PURGEABLE            0x00020000
#define IMAGE_SCN_MEM_16BIT                0x00020000
#define IMAGE_SCN_MEM_LOCKED               0x00040000
#define IMAGE_SCN_MEM_PRELOAD              0x00080000

#define IMAGE_SCN_ALIGN_1BYTES             0x00100000  //
#define IMAGE_SCN_ALIGN_2BYTES             0x00200000  //
#define IMAGE_SCN_ALIGN_4BYTES             0x00300000  //
#define IMAGE_SCN_ALIGN_8BYTES             0x00400000  //
#define IMAGE_SCN_ALIGN_16BYTES            0x00500000  // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES            0x00600000  //
#define IMAGE_SCN_ALIGN_64BYTES            0x00700000  //
#define IMAGE_SCN_ALIGN_128BYTES           0x00800000  //
#define IMAGE_SCN_ALIGN_256BYTES           0x00900000  //
#define IMAGE_SCN_ALIGN_512BYTES           0x00A00000  //
#define IMAGE_SCN_ALIGN_1024BYTES          0x00B00000  //
#define IMAGE_SCN_ALIGN_2048BYTES          0x00C00000  //
#define IMAGE_SCN_ALIGN_4096BYTES          0x00D00000  //
#define IMAGE_SCN_ALIGN_8192BYTES          0x00E00000  //
// Unused                                  0x00F00000

#define IMAGE_SCN_LNK_NRELOC_OVFL          0x01000000  // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE          0x02000000  // Section can be discarded.
                                                       //¸ÃÇø¶Î¿É¶ªÆú
#define IMAGE_SCN_MEM_NOT_CACHED           0x04000000  // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED            0x08000000  // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED               0x10000000  // Section is shareable.
                                                       //¸ÃÇø¶Î¿É¹²Ïí
#define IMAGE_SCN_MEM_EXECUTE              0x20000000  // Section is executable.
                                                       //¸ÃÇø¶Î¿ÉÖ´ÐÐ
#define IMAGE_SCN_MEM_READ                 0x40000000  // Section is readable.
                                                       //¸ÃÇø¶Î¿É¶Á
#define IMAGE_SCN_MEM_WRITE                0x80000000  // Section is writeable.
                                                       //¸ÃÇø¶Î¿Éд
                                                      
    ÏÂÃæÎÒÃÇ¿´Ò»ÏÂpeÎļþÀï³£ÓõÄÒ»ÏÂÇø¶Î:
1).text
    code
    ÕâÀïÒ»°ã·ÅµÄÊÇ´úÂë.
  
2).data
    ÕâÀïÒ»°ã·ÅµÄÊÇÒѳõʼ»¯µÄÊý¾Ý.
  
3).idata
    ÕâÀïÒ»°ã·ÅµÄÊÇÊäÈë±í.Õâ¸öºóÃæ»¹ÒªÏêϸ½².
  
4).rsrc
    ÕâÀïÒ»°ã·ÅµÄÊÇ×ÊÔ´.
  
5).reloc
    ÕâÀïÒ»°ã·ÅµÄÊÇ»ùµØÖ·Öض¨Î»±í.

6).edata
    ÕâÀïÒ»°ã·ÅµÄÊÇÊä³ö±í.
  
7).tls
    ÕâÀïÒ»°ãÊÇÏֲ߳̾¿´æ´¢Êý¾Ý.
  
8).bbs
    ÕâÀïÒ»°ã·ÅµÄÊÇδ³õʼ»¯µÄÊý¾Ý.
3Â¥2006-08-26 09:32:24
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
²é¿´È«²¿ 5 ¸ö»Ø´ð

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

pe֪ʶѧϰ£¨Èý£©




    ǰÁ½¸öÌù×ÓÎÒÃÇÒѾ­½éÉÜÁËpeÎļþµÄÁ½¸ö½á¹¹,Ï£Íû»¹Ã»ÓÐÈÃÄã¿´ÔÎ.ÏÂÃæÎÒ°ÑpeÎļþµÄ½á¹¹ÁгöÀ´,ÈÃÎÒÃÇÓиöÈ«¾ÖµÄÓ¡Ïó.
    _______________________________
    |   IMAGE_DOS_HEADER          |       <-- Dos²¿Ê×
    -------------------------------
    |   'PE',0,0                  |       <-- PEÎļþ±êÖ¾
    -------------------------------
    |   IMAGE_FILE_HEADER         |       <-- Ó³ÏñÎļþÍ·
    -------------------------------
    |   IMAGE_OPTIONAL_HEADER32   |       <-- Ó³Ïñ¿Éѡͷ
    -------------------------------
    |   Section Table             |       <-- ½Ú±í
    -------------------------------
    |   .text                     |       <-- ´úÂëÇø¶Î
    -------------------------------
    |   .data                     |       <-- Êý¾ÝÇø¶Î
    -------------------------------
    |   .idata                    |       <-- ÊäÈë±í
    -------------------------------
    |   .edata                    |       <-- Êä³ö±í
    -------------------------------
    |   .reloc                    |       <-- ÖØ¶¨Î»±íÇø¶Î
    -------------------------------
    |    ....                     |
    -------------------------------
    |    µ÷ÊÔÐÅÏ¢                  |
    -------------------------------
   
    ºÃÁË,ÎÒÃǽÓ×Å¿´¿´IMAGE_OPTIONAL_HEADER32½á¹¹.Õâ¸ö½á¹¹µÄÓò±È½Ï¶à,µ«ÊǺͺóÃæÒª½²µ½µÄ½Ú±íÒ»Ñù,·Ç³£ÖØÒª.Ï£ÍûÄãÄܹ»ÓÃÐÄÌå»á,²¢¶¯ÊÖʵ¼ùÒ»ÏÂ.
    IMAGE_OPTIONAL_HEADER32µÄ½á¹¹¶¨ÒåÈçÏÂ:
   
    typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //

    00h WORD    Magic;                   //»ÃÊý,32λpeÎļþ×ÜΪ010bh
    02h BYTE    MajorLinkerVersion;      //Á¬½ÓÆ÷Ö÷°æ±¾ºÅ
    03h BYTE    MinorLinkerVersion;      //Á¬½ÓÆ÷¸±°æ±¾ºÅ
    04h DWORD   SizeOfCode;              //´úÂë¶Î×Ü´óС
    08h DWORD   SizeOfInitializedData;   //Òѳõʼ»¯Êý¾Ý¶Î×Ü´óС
    0ch DWORD   SizeOfUninitializedData; //δ³õʼ»¯Êý¾Ý¶Î×Ü´óС
    10h DWORD   AddressOfEntryPoint;     //³ÌÐòÖ´ÐÐÈë¿ÚµØÖ·(RVA)
    14h DWORD   BaseOfCode;              //´úÂë¶ÎÆðʼµØÖ·(RVA)
    18h DWORD   BaseOfData;              //Êý¾Ý¶ÎÆðʼµØÖ·(RVA)

    //
    // NT additional fields.
    //

    1ch DWORD   ImageBase;               //³ÌÐòĬÈϵÄ×°ÈëÆðʼµØÖ·
    20h DWORD   SectionAlignment;        //ÄÚ´æÖÐÇø¿éµÄ¶ÔÆëµ¥Î»
    24h DWORD   FileAlignment;           //ÎļþÖÐÇø¿éµÄ¶ÔÆëµ¥Î»
    28h WORD    MajorOperatingSystemVersion; //ËùÐè²Ù×÷ϵͳÖ÷°æ±¾ºÅ
    2ah WORD    MinorOperatingSystemVersion; //ËùÐè²Ù×÷ϵͳ¸±°æ±¾ºÅ
    2ch WORD    MajorImageVersion;       //×Ô¶¨ÒåÖ÷°æ±¾ºÅ
    2eh WORD    MinorImageVersion;       //×Ô¶¨Ò帱°æ±¾ºÅ
    30h WORD    MajorSubsystemVersion;   //ËùÐè×ÓϵͳÖ÷°æ±¾ºÅ
    32h WORD    MinorSubsystemVersion;   //ËùÐè×Óϵͳ¸±°æ±¾ºÅ
    34h DWORD   Win32VersionValue;       //×ÜÊÇ0
    38h DWORD   SizeOfImage;             //peÎļþÔÚÄÚ´æÖеÄÓ³Ïñ×Ü´óС
    3ch DWORD   SizeOfHeaders;           //´ÓpeÎļþ¿ªÊ¼µ½½Ú±í(°üº¬½Ú±í)µÄ×Ü´óС
    40h DWORD   CheckSum;                //peÎļþCRCУÑéºÍ
    44h WORD    Subsystem;               //Óû§½çÃæÊ¹ÓõÄ×ÓϵͳÀàÐÍ
    46h WORD    DllCharacteristics;      //Ϊ0
    48h DWORD   SizeOfStackReserve;      //ΪÏ̵߳ÄÕ»³õʼ±£ÁôµÄÐéÄâÄÚ´æµÄĬÈÏÖµ
    4ch DWORD   SizeOfStackCommit;       //ΪÏ̵߳ÄÕ»³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС
    50h DWORD   SizeOfHeapReserve;       //Ϊ½ø³ÌµÄ¶Ñ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС
    54h DWORD   SizeOfHeapCommit;        //Ϊ½ø³ÌµÄ¶Ñ³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС
    58h DWORD   LoaderFlags;             //Ϊ0
    5ch DWORD   NumberOfRvaAndSizes;     //Êý¾ÝĿ¼½á¹¹Êý×éµÄÏîÊý,×ÜΪ 00000010h
    60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
                                     //Êý¾ÝĿ¼½á¹¹Êý×é
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;


    ÏÂÃæÔÙ¾ßÌå½âÊÍһϸ÷¸öÓòµÄº¬Òå.²»ÒªÏÐÂÞàÂ,ºóÃæÕâЩ֪ʶʵÔÚÊÇÌ«ÖØÒªÁË.
1)Magic »ÃÊý,32λpeÎļþ×ÜΪ010bh
    Õâ¸ö³£ÊýµÄ¶¨ÒåÈçÏÂ:
  #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
  #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
  #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
  
2)MajorLinkerVersion Á¬½Ó³ÌÐòµÄÖ÷°æ±¾ºÅ Èçvc6.0µÄΪ06h

3)MinorLinkerVersion Á¬½Ó³ÌÐòµÄ´Î°æ±¾ºÅ Èçvc6.0µÄΪ00h

4)SizeOfCode peÎļþ´úÂë¶ÎµÄ´óС.ÊÇFileAlignmentµÄÕûÊý±¶.

5)SizeOfInitializedData ËùÓк¬Òѳõʼ»¯Êý¾ÝµÄ¿éµÄ´óС,Ò»°ãÔÚ.data¶ÎÖÐ.

6)SizeOfUninitializedData ËùÓк¬Î´³õʼ»¯Êý¾ÝµÄ¿éµÄ´óС,Ò»°ãÔÚ.bss¶ÎÖÐ.

7)AddressOfEntryPoint ³ÌÐò¿ªÊ¼Ö´ÐеĵØÖ·,ÕâÊÇÒ»¸öRVA(Ïà¶ÔÐéÄâµØÖ·).¶ÔÓÚexeÎļþ,ÕâÀïÊÇÆô¶¯´úÂë;¶ÔÓÚdllÎļþ,ÕâÀïÊÇlibMain()µÄµØÖ·.
     ÔÚÍÑ¿ÇʱµÚÒ»¼þʾÍÊÇÕÒÈë¿Úµã,Ö¸µÄ¾ÍÊÇÕâ¸öÖµ.
     
8)BaseOfCode ´úÂë¶Î»ùµØÖ·,΢ÈíµÄÁ¬½Ó³ÌÐòÉú³ÉµÄ³ÌÐòÒ»°ã°ÑÕâ¸öÖµÖÃΪ1000h,   
     
9)BaseOfData Êý¾Ý¶Î»ùµØÖ·

10)ImageBase peÎļþĬÈϵÄ×°ÈëµØÖ·.windows9xÖÐexeÎļþΪ400000h,dllÎļþΪ10000000h.

11)SectionAlignment ÄÚ´æÖÐÇø¿éµÄ¶ÔÆëµ¥Î».Çø¿é×ÜÊÇ¶ÔÆëµ½Õâ¸öÖµµÄÕûÊý±¶.x86µÄ32λϵͳÉÏĬÈÏֵλ1000h

12)FileAlignment peÎļþÖÐÇø¿éµÄ¶ÔÆëµ¥Î».peÎļþÖÐĬÈÏֵΪ 200h.

13)MajorOperatingSystemVersion
14)MinorOperatingSystemVersion
    ÉÏÃæÁ½¸öÓòÊÇÖ¸ÔËÐÐÕâ¸öpeÎļþËùÐèµÄ²Ù×÷ϵͳµÄ×îµÍ°æ±¾ºÅ.windows95/98ºÍwindows nt 4.0 µÄÄÚ²¿°æ±¾ºÅ¶¼ÊÇ 4.0 ,¶øwindows2000µÄÄÚ²¿°æ±¾ºÅÊÇ5.0
   
15)MajorImageVersion
16)MinorImageVersion
    ÉÏÃæÁ½¸öÓòÊÇÖ¸Óû§×Ô¶¨ÒåµÄpeÎļþµÄ°æ±¾ºÅ.¿ÉÒÔͨ¹ýÁ¬½Ó³ÌÐòÀ´ÉèÖÃ,Èç: LINK /VERSION:2.0 MyApp.objÒ»°ãÔÚÉý¼¶Ê±Ê¹ÓÃ.
   
17)MajorSubsystemVersion   
18)MinorSubsystemVersion
   ÉÏÃæÁ½¸öÓòÊÇÖ¸ÔËÐÐÕâ¸öpeÎļþËùÒªÇóµÄ×ÓϵͳµÄ°æ±¾ºÅ.  
   
19)Win32VersionValue ×ÜÊÇ0

20)SizeOfImage peÎļþ×°ÈëÄÚ´æºóÓ³ÏñµÄ×Ü´óС.Èç¹ûSectionAlignmentÓòºÍFileAlignmentÓòÏàµÈ,ÄÇôÕâ¸öÖµÒ²ÊÇpeÎļþÔÚÓ²ÅÌÉϵĴóС.
   
21)SizeOfHeaders ´ÓÎļþ¿ªÊ¼µ½½Ú±í(°üº¬½Ú±í)µÄ×Ü´óС.ÆäºóÊǸ÷¸öÇø¶ÎµÄÊý¾Ý.               

22)CheckSum peÎļþµÄCRCУÑéºÍ.

23)Subsystem peÎļþµÄÓû§½çÃæÊ¹ÓõÄ×ÓϵͳÀàÐÍ.¶¨ÒåÈçÏÂ:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE               1   // Image doesn't require a subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Image runs in the Windows GUI subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Image runs in the Windows character subsystem.
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // image runs in the OS/2 character subsystem.
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // image runs in the Posix character subsystem.
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.

24)DllCharacteristics ×ÜΪ0

25)SizeOfStackReserve ΪÏ̵߳ÄÕ»³õʼ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС,ĬÈÏΪ00100000h.Èç¹ûÔÚµ÷ÓÃCreateThreadº¯Êýʱָ¶¨¶ÑÕ»µÄ´óСΪ0,±»´´½¨µÄÏ̵߳ĶÑÕ»µÄ³õʼ´óС¾ÍÓëÕâ¸öÖµÏàͬ.

26)SizeOfStackCommit ΪÏ̵߳ÄÕ»³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС.΢ÈíµÄÁ¬½Ó³ÌÐò°ÑÕâ¸öÖµÖÃΪ 1000h.
   
27)SizeOfHeapReserve Ϊ½ø³ÌµÄ¶Ñ±£ÁôµÄÐéÄâÄÚ´æµÄ´óС.ĬÈÏֵΪ 00100000h.

28)SizeOfHeapCommit  Îª½ø³ÌµÄ¶Ñ³õʼÌá½»µÄÐéÄâÄÚ´æµÄ´óС.΢ÈíµÄÁ¬½Ó³ÌÐò°ÑÕâ¸öÖµÖÃΪ1000h.
   
29)LoaderFlags ͨ³£Îª0

30)NumberOfRvaAndSizes Êý¾ÝĿ¼½á¹¹Êý×éµÄÏîÊý,×ÜΪ 00000010h
   Õâ¸öÖµ¶¨ÒåÈçÏÂ:
   #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
   
31)IMAGE_DATA_DIRECTORY DataDirectory[0x10] Êý¾ÝĿ¼½á¹¹Êý×é
   IMAGE_DATA_DIRECTORY½á¹¹¶¨ÒåÈçÏÂ:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress; Ïà¶ÔÐéÄâµØÖ·
    DWORD   Size;           ´óС
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

    Õâ¸ö½á¹¹°üº¬ÁËpeÎļþÖÐÖØÒª²¿·ÖµÄRVAµØÖ·ºÍ´óС.Õâ¸öÊý×éʹ²Ù×÷ϵͳµÄ¼ÓÔØ³ÌÐòÄܹ»¿ìËÙ¶¨Î»Ìض¨µÄÇø¶Î.¾ßÌ嶨ÒåÈçÏÂ:
#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor
2Â¥2006-08-26 09:31:31
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

pe֪ʶѧϰ(Îå)



    ´ÓÕâÌù¿ªÊ¼,ÎÒ½éÉܼ¸¸ö³£ÓõÄÇø¶Î:ÊäÈë±í,Êä³ö±íºÍÖØ¶¨Î»±í.
   
    ÎÒÃÇÖªµÀ,³ÌÐòµ÷ÓÃÍⲿµÄdllº¯Êýͨ³£¶¼ÊÇÏÂÃæÕâÖÖÐÎʽ:
    call my_label
    ...
my_label: jmp dword ptr [xxxxxxxx]
    ¶ÔÒ»¸ödllÖеĺ¯ÊýµÄµ÷ÓÃ×ÜÊÇͨ¹ýÒ»¸öµØÖ·¼ä½ÓµÄµ÷ÓõÄ.ÕâЩµØÖ·¾Í·ÅÔÚÊäÈë±íÀï.
      
    ÊäÈë±í(Import Table),¼ò¶øÑÔÖ®,¾ÍÊÇÃèÊö¸ÃpeÎļþ´ÓÄö¶¯Ì¬Á¬½Ó¿âµ¼ÈëÁËʲôº¯ÊýµÄÒ»×é½á¹¹Êý×é.ÔÚÕâÀïÎÒÏ£ÍûÄÜÓÃ×î¼ò½àµÄÓïÑÔÈÃÄãÃ÷°×ʲôÊÇÊäÈë±í.ÊäÈë±íµÄ×é³É²¢²»¸´ÔÓ,Ö»Óõ½Èý¸ö½á¹¹.ËüÃÇÊÇ:IMAGE_IMPORT_DESCRIPTOR£¬IMAGE_THUNK_DATA£¬IMAGE_IMPORT_BY_NAME.
    ÎÒÃÇÏÈ¿´Ò»Ï¿òͼ.
   
                          IMAGE_IMPORT_DESCRIPTOR
                          |--------------------|
|-------------------------| OriginalFirstThunk |
|                         |--------------------|
|                         |   TimeDateStamp    |
|                         |--------------------|
|                         |   ForwarderChain   |
|                         |--------------------|
|                         |       Name         |----> "USER32.DLL"
|                         |--------------------|
|                         |     FirstThunk     |---------------------------|
|                         |--------------------|                           |
|                                                                          |
|     Hint-name table      IMAGE_IMPORT_BY_NAME  import address table(IAT) |
|   |------------------|   |--------------------|   |------------------|    |
|-> | IMAGE_THUNK_DATA |-->| 44 | "GetMessage"  |<--| IMAGE_THUNK_DATA |<---|
    |------------------|   |----|---------------|   |------------------|
    | IMAGE_THUNK_DATA |-->| 72 | "LoadIcon"    |<--| IMAGE_THUNK_DATA |
    |------------------|   |----|---------------|   |------------------|
    |     ......       |-->| .. |    ......     |<--|      ......      |
    |------------------|   |----|---------------|   |------------------|
    |       NULL       |                            |       NULL       |
    |------------------|                            |------------------|
   
    µ±È»,ÕâÊÇÃèÊö´ÓÒ»¸ödllÖÐÒýÈ뺯ÊýµÄÇéÐÎ.´Ó¼¸¸ödllÖÐÒýÈ뺯Êý,ÄÇô¾ÍÓм¸¸öÕâÑùµÄ½á¹¹.ͬʱ,ÕâÒ²ÊÇ´ÅÅÌÎļþÉϵĽṹ.×°ÈëÄÚ´æºóFirstThunkÖ¸ÏòµÄ½á¹¹Êý×é»á±»ÐÞ¸Ä.¿ÉÒÔ¿´ÏÂÃæµÄͼ.
    ÎÒÃÇÏÈÀ´ÊìϤһÏÂÕâÈý¸ö½á¹¹µÄ¶¨Òå:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;    // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    };
    DWORD   TimeDateStamp;          // 0 if not bound,
                                    // -1 if bound, and real date\time stamp
                                    //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                    // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;         // -1 if no forwarders
    DWORD   Name;
    DWORD   FirstThunk;             // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;   

typedef struct _IMAGE_THUNK_DATA32 {
    union {
        PBYTE  ForwarderString;
        PDWORD Function;
        DWORD Ordinal;
        PIMAGE_IMPORT_BY_NAME  AddressOfData;
    } u1;
} IMAGE_THUNK_DATA32;

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;              //Ö¸³öº¯ÊýÔÚËùÔÚµÄdllµÄÊä³ö±íÖеÄÐòºÅ
    BYTE    Name[1];           //Ö¸³öÒªÊäÈëµÄº¯ÊýµÄº¯ÊýÃû
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

    ÏÂÃæÎÒÃǽ²½âÒ»ÏÂIMAGE_IMPORT_DESCRIPTOR½á¹¹µÄ¸÷¸öÓòµÄº¬Òå:
1)union {
        DWORD   Characteristics;   
        DWORD   OriginalFirstThunk;
  };
     Õâ¸öÁªºÏÖ¸ÏòÒ»¸ö IMAGE_THUNK_DATA ÀàÐ͵ĽṹÊý×é.Õâ¸öÁªºÏ²»ÊǺÜÖØÒª,¿ÉÒÔΪ0.
  
2)TimeDateStamp
    ¸ÃdllµÄʱ¼äÈÕÆÚ´Á,Ò»°ãΪ0.
  
3)ForwarderChain
    ÕýÏòÁ¬½ÓË÷Òý.Ò»°ãΪ0.
  
4)Name
    dllÃû×ÖµÄRVA.
  
5)FirstThunk
    Õâ¸öÓòÒ²ÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öDWORDÊý×é,Êý×éÒÔNULL½áÊø.Êý×éÖеÄÿ¸öDWORDʵ¼ÊÉÏÊÇÒ»¸öIMAGE_THUNK_DATA½á¹¹µÄÁªºÏÌå¡£IMAGE_THUNK_DATAÁªºÏÌåͨ³£±»½âÊÍΪһ¸öÖ¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹µÄRVA.

    ´ÓÉÏͼÎÒÃÇ¿ÉÒÔ¿´³öÓÐÁ½¸ö²¢ÐеÄÖ¸ÕëÊý×é¶¼Ö¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹.ÊÂʵÉÏ,OriginalFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATA½á¹¹Êý×é´ÓÀ´²»±»ÐÞ¸Ä,¸ÃÊý×éÓÐʱҲ½ÐÌáʾÃû±í(Hint-name table),ÌáʾÃû±í×ÜÊÇÖ¸ÏòIMAGE_IMPORT_BY_NAME½á¹¹Êý×é.¶øFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATA½á¹¹Êý×éÔÚ¸ÃpeÎļþ±»¼ÓÔØÊ±,¼ÓÔØ³ÌÐò»áÐ޸ĸÃÊý×éµÄÄÚÈÝ.¼ÓÔØ³ÌÐòµü´úËÑË÷Êý×éµÄÿһ¸öÖ¸Õë,ÕÒµ½Ã¿Ò»¸öIMAGE_IMPORT_BY_NAME½á¹¹Ëù¶ÔÓ¦µÄÊäÈ뺯ÊýµÄµØÖ·,È»ºó¼ÓÔØ³ÌÐòÓÃÕÒµ½µÄµØÖ·ÐÞ¸ÄÏàÓ¦µÄIMAGE_THUNK_DATA½á¹¹.
    ÈçÇ°ÃæÌáµ½µÄ
          call my_label
          ...
my_label: jmp dword ptr [xxxxxxxx]
    ÆäÖеÄxxxxxxxx¾ÍÊÇFirstThunkÖ¸ÏòµÄIMAGE_THUNK_DATAÊý×éÖеÄÒ»¸öµÄÖµ.ÒòΪFirstThunkËùÖ¸ÏòµÄÊý×éÔÚ¼ÓÔØºóÊÇËùÓÐÊäÈ뺯ÊýµÄµØÖ·,Òò´ËËü±»³ÆÎªÊäÈëµØÖ·±í(Import Address Table,IAT).
    peÎļþ¼ÓÔØºóÊäÈë±íµÄÇéÐÎÈçÏÂ:
                          IMAGE_IMPORT_DESCRIPTOR
                          |--------------------|
|-------------------------| OriginalFirstThunk |
|                         |--------------------|
|                         |   TimeDateStamp    |
|                         |--------------------|
|                         |   ForwarderChain   |
|                         |--------------------|
|                         |       Name         |----> "USER32.DLL"
|                         |--------------------|
|                         |     FirstThunk     |---------------------------|
|                         |--------------------|                           |
|                                                                          |
|     Hint-name table      IMAGE_IMPORT_BY_NAME  import address table(IAT) |
|   |------------------|   |--------------------|   |------------------|    |
|-> | IMAGE_THUNK_DATA |-->| 44 | "GetMessage"  |   |ptr of GetMessage |<---|
    |------------------|   |----|---------------|   |------------------|
    | IMAGE_THUNK_DATA |-->| 72 | "LoadIcon"    |   | ptr of LoadIcon  |
    |------------------|   |----|---------------|   |------------------|
    |     ......       |-->| .. |    ......     |   |      ......      |
    |------------------|   |----|---------------|   |------------------|
    |       NULL       |                            |       NULL       |
    |------------------|                            |------------------|
   
    ÊäÈë±íÔÚpe֪ʶÀïÊÇ×îÖØÒªµÄÒ»²¿·Ö.Ï£ÍûÄãÄܹ»½áºÏÒ»ÏÂpe¹¤¾ßʵ¼ÊÀí½âÕⲿ·ÖµÄÄÚÈÝ.

pe֪ʶѧϰ(Áù)



    ÓÐÊäÈë±í¾ÍÓÐÊä³ö±í,±¾Ìù¿ªÊ¼½éÉÜÊä³ö±í.

    ´ó²¿·Ödll¶¼»áÊä³öһЩº¯Êý.ÓÐЩpeÎļþÒ²»áÓÐÊä³ö±í.ͨ³£Êä³ö±í¶¼ÊÇ·ÅÔÚ.edataÇø¶ÎµÄ.Òò´Ë.edataÇø¶ÎµÄ×¢Òª³É·ÖÊǺ¯ÊýÃû±í,Èë¿ÚµãµØÖ·,Êä³öº¯ÊýµÄÐòºÅ.
    Êä³ö±íµÄ¿ªÊ¼²¿·ÖÊÇÒ»¸öIMAGE_EXPORT_DIRECTORY½á¹¹,Ö®ºó½ô½Ó×ÅÊÇÓɸýṹÖеÄij¸öÓòËùÖ¸ÏòµÄÊý¾Ý.
    IMAGE_EXPORT_DIRECTORY½á¹¹¶¨ÒåÈçÏÂ:
   
    typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;
    DWORD   Base;
    DWORD   NumberOfFunctions;
    DWORD   NumberOfNames;
    DWORD   AddressOfFunctions;     // RVA from base of image
    DWORD   AddressOfNames;         // RVA from base of image
    DWORD   AddressOfNameOrdinals;  // RVA from base of image
    } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
   
1)Characteristics
    Õâ¸öÖµ×ÜΪ0.

2)TimeDateStamp
    º¬ÓÐÕâ¸öµ¼³ö±íµÄÎļþ±»Éú³ÉµÄʱ¼ä.

3)MajorVersion
4)MinorVersion
    °æ±¾ÐÅÏ¢.×ÜΪ0.

5)Name
    º¬ÓÐÕâ¸öµ¼³ö±íµÄpeÎļþµÄÃû×ÖµÄRVA.
  
6)Base
    Êä³öº¯ÊýÐòºÅµÄ¿ªÊ¼Öµ.
  
7)NumberOfFunctions
    Êý×é AddressOfFunctions ÖÐÔªËØµÄ¸öÊý.Õâ¸öÖµ¾ÍÊǵ¼³ö±íÖе¼³öº¯ÊýµÄ¸öÊý.
  
8)NumberOfNames
    ÒÔÃû×ÖÊä³öµÄº¯ÊýµÄ¸öÊý.
  
9)AddressOfFunctions
    ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öÓɺ¯ÊýµØÖ·×é³ÉµÄÊý×é.ÿһ¸öº¯ÊýµØÖ·ÊDZ¾Ä£¿éÖеÄÒ»¸öÊä³öº¯ÊýµÄÈë¿ÚµØÖ·.

10)AddressOfNames
    ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öÓÉ×Ö·û´®Ö¸Õë×é³ÉµÄÊý×é,ÿ¸ö×Ö·û´®ÊDZ¾Ä£¿éÖÐÒÔÃû×ÖÊä³öµÄÊä³öº¯ÊýµÄº¯ÊýÃû.
   
11)AddressOfNameOrdinals
    ÕâÊÇÒ»¸öRVA,Ö¸ÏòÒ»¸öwordÀàÐ͵ÄÊý×é,¸ÃwordÀàÐÍÊý×éÊDZ¾Ä£¿éÖÐËùÓÐÒÔÃû×ÖÊä³öµÄÊä³öº¯ÊýµÄÊä³öÐòºÅ.
      
    ¼ÙÉèÒ»¸ödllÓÐÈý¸öµ¼³öº¯Êý,·Ö±ðÈçÏÂ:
     
   ÐòºÅ   º¯ÊýÃû
   1      "myfun1"
   2      
   3      "myfun2"
    ÆäÖÐÐòºÅΪ2µÄº¯ÊýÖ»ÄÜͨ¹ýÐòºÅµ¼³ö.ͼʾÈçÏÂ:
   
   IMAGE_EXPORT_DIRECTORY                        º¯ÊýµØÖ·±í
   |---------------------------|  |------->|------------------|
   |      Characteristics      |  |        | 0x400042"myfun1" |
   |---------------------------|  |        |------------------|
   |         ......            |  |        |    0x400085      |
   |---------------------------|  |        |------------------|
   |   NumberOfFunctions = 3   |  |        | 0x400197"myfun2" |
   |---------------------------|  |        |------------------|
   |    NumberOfNames  = 2     |  |        
   |---------------------------|  |             º¯ÊýÃû±í
   |   AddressOfFunctions      |--| |----->|------------|
   |---------------------------|    |      | 0xXXXXXXXX |->"myfun1"
   |   AddressOfNames          |----|      |------------|
   |---------------------------|           | 0xXXXXXXXX |->"myfun2"
   |   AddressOfNameOrdinals   |----|      |------------|
   |---------------------------|    |
                                    |     º¯ÊýÃû³ÆµØÖ·Ë÷Òý±í
                                    |----->|-----------|
                                           |     1     |
                                           |-----------|
                                           |     3     |
                                           |-----------|
                                          
    ÎÒÃÇÀ´¿´Ò»ÏÂpe¼ÓÔØ³ÌÐòµÄ¹¤×÷»úÖÆ.¼ÙÉèËüÖªµÀº¯ÊýÃû"myfun2",ÄÇô¼ÓÔØ³ÌÐò½«Ê×ÏȱéÀúº¯ÊýÃû±í,ÕÒµ½Æ¥ÅäµÄº¯ÊýÃû"myfun2".ÓÉÓÚ"myfun2"ÔÚº¯ÊýÃû±íÀïµÄË÷ÒýÊÇ2,ËùÒÔ¼ÓÔØº¯Êý½«ÔÚº¯ÊýÃû³ÆµØÖ·Ë÷Òý±íµÄµÚ¶þ¸öÔªËØÀïÈ¡µÃº¯ÊýÔÚº¯ÊýµØÖ·±íÀïµÄË÷Òý3,È»ºó¼ÓÔØ³ÌÐò¾Í»áÔÚº¯ÊýµØÖ·±íµÄµÚÈý¸öÔªËØÀïÈ¡µÃº¯ÊýµÄÈë¿ÚµØÖ·0x400197.
    Õâ¾ÍÊÇÒÔÃû³Æµ¼³öº¯ÊýµÄ¹ý³Ì.
    Èç¹ûÊÇÒÔÐòºÅµ¼³öº¯ÊýµØÖ·µÄ,Äǽ«¸ü¼òµ¥.¼ÓÔØ³ÌÐò½«Ö±½ÓÓÃÐòºÅÔÚº¯ÊýµØÖ·±íÀïÈ¡³öº¯ÊýµÄÈë¿ÚµØÖ·.¿ÉÒÔ¿´³ö,ÒÔÐòºÅµ¼³öº¯Êý±ÈÒÔÃû³Æµ¼³öº¯Êý¿ì,µ«ÒÔÐòºÅµ¼³öº¯ÊýµØÖ·»á´øÀ´Î¬»¤µÄÎÊÌâ.ÓÐЩapiº¯ÊýÔÚ²»Í¬µÄϵͳÉϵ¼³öÐòºÅ²¢²»Ïàͬ.ËùÒÔ΢Èí²»ÍÆ¼öʹÓÃÐòºÅÀ´µ¼³öº¯Êý.
    ÕâÀï½²µÄÊÇBaseΪ1ʱµÄÇéÐÎ,Èç¹ûBaseÓò´óÓÚ1,ÔòÔÚÈ¡µÃº¯ÊýÔÚº¯ÊýµØÖ·±íÖеÄË÷Òýºó,ÓÃÕâ¸öË÷ÒýÖµ¼õÈ¥Base¾Í¿ÉÒԵõ½º¯ÊýÔÚº¯ÊýµØÖ·±íÖÐµÄÆ«ÒÆÖµ.

pe֪ʶѧϰ(Æß)--Íê

¡¡


    ÕâÒ»Ìù½éÉÜÒ»ÏÂpeÎļþÖеÄÖØ¶¨Î»±í.
    ÖØ¶¨Î»µÄ¸ÅÄî²»ÄÑÀí½â.¼òµ¥µÄ˵,¾ÍÊÇÒòΪ³ÌÐò±»Á¬½ÓºóһЩ±äÁ¿»òÕߺ¯Êýµ÷ÓûòÌø×ªÖ¸ÁîʹÓÃÁ˾ø¶ÔµØÖ·,µ±×°ÔسÌÐò²»ÄܰÑpeÓ³Ïñ×°µ½Ô¤¶¨µÄµØÖ·(ImageBase)ʱ,ÄÇôÕâЩ¾ø¶ÔµØÖ·¾ÍÐèÒªµ÷Õû.·ñÔò³ÌÐò½«·ÃÎʵ½´íÎóµÄµØÖ·.
    exeÎļþÒ»°ã²»ÐèÒªÖØ¶¨Î»,ÒòΪÿ¸öexeÎļþÓ³Ïñ¶¼ÓÐ×Ô¼º¶ÀÁ¢µÄµØÖ·¿Õ¼ä,Ëü×ÜÄܱ»Ó³Éäµ½Ô¤¶¨µÄµØÖ·.¶ødllÎļþÒ»°ãÊÇÓ³Éäµ½exeÎļþµÄµØÖ·¿Õ¼äµÄ.µ±¶à¸ödllÎļþµÄÔ¤¶¨µØÖ··¢Éú³åͻʱ,¾Í²»Äܱ£Ö¤»á±»Ó³Éäµ½Ô¤¶¨µÄµØÖ·ÁË.ËùÒÔdllÎļþÒ»°ã¶¼ÐèÒªÖØ¶¨Î»µÄ.
    ÄÇÃ´ÖØ¶¨Î»ÊÇÔõÑùʵÏÖµÄÄØ?
    ÔÚpeÎļþÀïÓÃÕâÑùÒ»¸ö½á¹¹À´ÃèÊöÒ»¸öÖØ¶¨Î»Êý¾ÝÏî:
    typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;

1)VirtualAddress
    Õâ¸öÓò°üº¬Õâ¸öÖØ¶¨Î»Êý¾ÝÏîµÄÆðʼRVAÖµ,½ô¸úÔڽṹºóÃæµÄÆ«ÒÆÖµÒª¼ÓÉÏÕâ¸öÖµ²ÅÊÇÒ»¸öÕæÕýµÄÐèÒªÖØ¶¨Î»µÄÊý¾ÝµÄRVAÖµ.
    Èç¹ûÕâ¸öÓòΪ0,Ôò´ú±íһϵÁÐÖØ¶¨Î»Êý¾ÝÏîµÄ½áÊø.

2)SizeOfBlock
    ÖØ¶¨Î»Êý¾ÝÏîµÄ´óС.

3)TypeOffset[1]
    ÕâÊÇÒ»¸öWORDÀàÐ͵ÄÊý×é.Êý×éµÄÔªËØ¸öÊýÓÉ(SizeOfBlock - 8 ) \ 2 µÃµ½.ÿ¸öÔªËØµÄµÍ12λ´ú±íÒ»¸öÆ«ÒÆÖµ,¸ÃÆ«ÒÆÖµ¼ÓÉÏVirtualAddress¾ÍÊÇÐèÒªÐÞÕýµÄÊý¾ÝµÄRVAÖµ.¶ø¸ß4λ´ú±í¸ÃÆ«ÒÆÖµµÄÀàÐÍ.¸ÃÀàÐͶ¨ÒåÈçÏÂ:
#define IMAGE_REL_BASED_ABSOLUTE              0
#define IMAGE_REL_BASED_HIGH                  1
#define IMAGE_REL_BASED_LOW                   2
#define IMAGE_REL_BASED_HIGHLOW               3
#define IMAGE_REL_BASED_HIGHADJ               4
#define IMAGE_REL_BASED_MIPS_JMPADDR          5
#define IMAGE_REL_BASED_SECTION               6
#define IMAGE_REL_BASED_REL32                 7

#define IMAGE_REL_BASED_MIPS_JMPADDR16        9
#define IMAGE_REL_BASED_IA64_IMM64            9
#define IMAGE_REL_BASED_DIR64                 10
#define IMAGE_REL_BASED_HIGH3ADJ              11
    ÆäÖкÍintelµÄcpuÓйصÄÖ»ÓÐÁ½ÖÖÀàÐÍ.ÆäËûµÄ¶¼ÓÃÓÚi386ÒÔÍâµÄcpu.
  0 (IMAGE_REL_BASED_ABSOLUTE):´ú±í¸ÃÆ«ÒÆÖµÎÞÒâÒå.Ö»ÊÇΪÁËʹËùÓÐÖØ¶¨Î»Êý¾ÝÏîµÄ´óСλDWORDµÄÕûÊý±¶.
  3 (IMAGE_REL_BASED_HIGHLOW): °Ñ¸ÃÆ«ÒÆÖµ¼ÓÉÏ VirtualAddress¾ÍÊÇÒªÐÞÕýµÄÊý¾ÝµÄRVAÖµ.
   
    ÓÉÓÚWORDÖÐÖ»ÓеÍ12λ±íÊ¾Æ«ÒÆÖµ,Òò´ËÒ»¸öÖØ¶¨Î»ÏîÖ»ÄÜÐÞÕýÒ»Ò³µÄÊý¾Ý(4k).Èç¹ûÐèÒªÖØ¶¨Î»µÄÊý¾Ý³¬¹ý4k,ÄÇôһ¸öpeÎļþÀï¾ÍÓжà¸öÖØ¶¨Î»Ïî.
   
    ¼ÓÔØ³ÌÐòÐÞÕý¹ý³ÌÈçÏÂ:¼ÙÉèIMAGE_OPTIONAL_HEADER.ImageBaseµÄֵΪ0x400000,¶øÊµ¼ÊpeÓ³Ïñ±»¼ÓÔØµÄµØÖ·Îª0x500000,ʵ¼Ê¼ÓÔØµÄµØÖ·±ÈÔ¤¶¨µÄ¸ß0x100000,ÄÇôÐèÒªÐÞÕýµÄÊý¾Ý¶¼»á±»¼ÓÉÏ0x100000.
    ÕâÀïËù˵µÄÐèÒªÐÞÕýµÄÊý¾ÝÊÇÖ¸Ç°ÃæÌáµ½µÄ±äÁ¿µÄ¾ø¶ÔµØÖ·ºÍµ÷ÓûòÌø×ªÖ¸ÁîÀﺬÓеľø¶ÔµØÖ·.


    µ½ÕâÀïpe֪ʶѧϰ¾Í¸æÒ»¶ÎÂäÁË.Ï£ÍûÕâЩÌû×ÓÄܰïÖúÄãÁ˽âpeÎļþµÄ´ó¸Å֪ʶ.¸üϸ½ÚµÄ֪ʶ¿ÉÒÔµ½msdnÀï²éÕÒ.ÎÒµÄˮƽÓÐÏÞ,´íÎóÖ®´¦»¹ÍûÄãÄܹ»¸øÓèÖ¸Õý.ÎÒ½«²»Ê¤¸Ð¼¤.
4Â¥2006-08-26 09:32:35
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

¿É¿ÉÎ÷Àï

ľ³æÖ®Íõ (ÎÄѧ̩¶·)

çÞÌåÕß˵

1

ÓÐÄѶÈ

²»¶®°¡
ÇóÖúÎÄÏ×ÏÂÔØºó£¬¼°Ê±ÆÀ·ÖºÍEPI¡£
5Â¥2006-08-26 20:15:53
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û