久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PE文件結(jié)構(gòu)及其加載機(jī)制

 firefox_zyw 2014-03-15

PE文件結(jié)構(gòu)及其加載機(jī)制(三)


上次我們學(xué)習(xí)了IMAGE_OPTIONAL_HEADER的前十個(gè)參數(shù),,下面我們繼續(xù)學(xué)習(xí),。
第十一個(gè)值SectionAlignment,表示節(jié)對(duì)齊粒度,。這個(gè)值一定要大于或等于文件對(duì)齊粒度,。
The alignment of sections loaded in memory, in bytes. This value must be greater than or equal to the FileAlignment member.
The default value is the page size for the system.




原來(lái)是4096B,也就是4kb了,。



第十二個(gè)值是FileAlignment,,表示文件對(duì)齊粒度,。



The alignment of the raw data of sections in the image file, in bytes.
The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member
is less than the system page size, this member must be the same as SectionAlignment.





這個(gè)值應(yīng)該是512B的倍數(shù)。



第十三個(gè)值是MajorOperatingSystemVersion,,所需操作系統(tǒng)的主版本號(hào),。



The major version number of the required operating system.





第十四個(gè)值是MinorOperatingSystemVersion,所需操作系統(tǒng)的副版本號(hào),。



The minor version number of the required operating system.





第十五個(gè)值是MajorImageVersion



The major version number of the image.





第十六個(gè)值是MinorImageVersion



The minor version number of the image.





第十七個(gè)值是MajorSubsystemVersion



The major version number of the subsystem.





第十八個(gè)值為MinorSubsystemVersion



The minor version number of the subsystem.





第十九個(gè)值為Win32VersionValue,,保留值,且必須為零,。



This member is reserved and must be 0.



 





 



 



第二十個(gè)值為SizeOfImage,,4個(gè)字節(jié),表示程序調(diào)入后占用內(nèi)存大?。ㄗ止?jié)),,等于所有段的長(zhǎng)度之和。



The size of the image, in bytes, including all headers. Must be a
multiple of SectionAlignment.



 





0x2B000=,?





好吧,,兩三天了,終于弄明白這個(gè)值了,,由于在實(shí)驗(yàn)過(guò)程中,,為了防止意外,所以復(fù)制了一個(gè)副本在當(dāng)前文件夾下,,通過(guò)二進(jìn)制的對(duì)比,,發(fā)現(xiàn)這兩個(gè)文件的SizeOfImage值是不一樣的,所以走了彎路,。



既然錯(cuò)了文件,,那么我還是以這個(gè)文件為例吧,因?yàn)槠渌牟糠侄家粯?,所以就不修改其他的部分了?/p>




0x25000+0x5188=0x2A188,,再考慮內(nèi)存對(duì)齊,我們?cè)囍眠@個(gè)值除以對(duì)齊粒度0x1000,,看是否能除盡,。



結(jié)果是不能除盡,所以要求大一點(diǎn),,結(jié)果這個(gè)SizeOfImage就變成了0x2B000,。



第二十一個(gè)值為SizeOfHeaders,占用4個(gè)字節(jié),,表示所有頭加節(jié)表的大小,。



The combined size of the following items, rounded to a multiple of
the value specified in the FileAlignment member.



 




  • 4 byte signature

  • size of IMAGE_FILE_HEADER

  • size of optional header

  • size of all section headers


 





也就是0x1000了。



 



第二十二個(gè)值為CheckSum,占用四個(gè)字節(jié),。



The image file checksum. The following files are validated(驗(yàn)證) at
load time: all drivers, any DLL loaded at boot time, and any DLL loaded into a critical (關(guān)鍵)system process.





 



 



第二十三個(gè)值為Subsystem,,占用兩個(gè)字節(jié)。表示文件運(yùn)行所需的子系統(tǒng),。



 The subsystem required to run this image. The following values are
defined.



 






























































Value

Meaning



IMAGE_SUBSYSTEM_UNKNOWN

0



Unknown subsystem.





IMAGE_SUBSYSTEM_NATIVE

1



No subsystem required (device drivers and native system processes).





IMAGE_SUBSYSTEM_WINDOWS_GUI

2



Windows graphical user interface (GUI) subsystem.





IMAGE_SUBSYSTEM_WINDOWS_CUI

3



Windows character-mode user interface (CUI) subsystem.





IMAGE_SUBSYSTEM_OS2_CUI

5



OS/2 CUI subsystem.





IMAGE_SUBSYSTEM_POSIX_CUI

7



POSIX CUI subsystem.





IMAGE_SUBSYSTEM_WINDOWS_CE_GUI

9



Windows CE system.





IMAGE_SUBSYSTEM_EFI_APPLICATION

10



Extensible Firmware Interface (EFI) application.





IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER

11



EFI driver with boot services.





IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER

12



EFI driver with run-time services.





IMAGE_SUBSYSTEM_EFI_ROM

13



EFI ROM image.





IMAGE_SUBSYSTEM_XBOX

14



Xbox system.





IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION

16



Boot application.




 



 



 





 



第二十四個(gè)值為DllCharacteristics,占用兩個(gè)字節(jié),。表示dll文件的屬性值,。



The DLL characteristics of the image. The following values are defined.



 


































































Value

Meaning



0x0001



Reserved.(保留)





0x0002



Reserved.





0x0004



Reserved.





0x0008



Reserved.





IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE

0x0040



The DLL can be relocated at load time.(允許在載入的時(shí)候進(jìn)行重定位)





IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY

0x0080



Code integrity checks are forced. If you set this flag and a section contains only uninitialized data, set the PointerToRawData member
of IMAGE_SECTION_HEADER for
that section to zero; otherwise, the image will fail to load because the digital signature cannot be verified.





IMAGE_DLLCHARACTERISTICS_NX_COMPAT

0x0100



The image is compatible(兼容) with data execution prevention (DEP).





IMAGE_DLLCHARACTERISTICS_NO_ISOLATION

0x0200



The image is isolation(隔離) aware, but should not be isolated.





IMAGE_DLLCHARACTERISTICS_NO_SEH

0x0400



The image does not use structured exception handling (SEH). No handlers can be called in this image.





IMAGE_DLLCHARACTERISTICS_NO_BIND

0x0800



Do not bind the image.





0x1000



Reserved.





IMAGE_DLLCHARACTERISTICS_WDM_DRIVER

0x2000



A WDM driver.





0x4000



Reserved.





IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE

0x8000



The image is terminal server aware.




 



 



 





第二十五個(gè)值為SizeOfStackReserve,占用4個(gè)字節(jié),。表示初始化是的堆棧大小,。



The number of bytes to reserve for the stack. Only the memory specified
by the SizeOfStackCommit member is committed at load time; the rest is made available one page
at a time until this reserve size is reached.



 





0x00100000=1MB



第二十六個(gè)值為SizeOfStackCommit,占用四個(gè)字節(jié),。表示初始化時(shí)實(shí)際提交的堆棧大小,。



The number of bytes to commit for the stack.



 





0x1000字節(jié)=4kb



第二十七個(gè)值為SizeOfHeapReserve,占用四個(gè)字節(jié),。初始化時(shí)保留堆的大小,。



The number of bytes to reserve for the local heap. Only the memory specified by the SizeOfHeapCommit member
is committed at load time; the rest is made available one page at a time until this reserve size is reached.



 





第二十八個(gè)值為SizeOfHeapCommit,占用四個(gè)字節(jié),。初始化時(shí)實(shí)際提交的堆得大小,。



The number of bytes to commit for the local heap.



 





第二十九個(gè)值為LoaderFlags,占用4個(gè)字節(jié),。未使用,。



This member is obsolete. 





第三十個(gè)值為NumberOfRvaAndSizes,占用四個(gè)字節(jié),。表示下面?zhèn)€成員數(shù)據(jù)目錄結(jié)構(gòu)的數(shù)量,。



 





這個(gè)值一般就直接是16.



 





下面是最后一個(gè)成員DataDirectory,,占用128個(gè)字節(jié),,為一個(gè)IMAGE_DATA_DIRECTORY structure結(jié)構(gòu)體數(shù)組(16個(gè)),。



A pointer to the first IMAGE_DATA_DIRECTORY structure
in the data directory.



 





 



typedef struct _IMAGE_DATA_DIRECTORY {
     DWORD VirtualAddress;
     DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;



 



這個(gè)結(jié)構(gòu)體有兩個(gè)成員,,一個(gè)成員占用4個(gè)字節(jié),,也就是8個(gè)字節(jié),。這個(gè)數(shù)組有16個(gè)數(shù)據(jù),,也就是16*8=128字節(jié),。



我們來(lái)看第一個(gè),。



IMAGE_DIRECTORY_ENTRY_EXPORT    導(dǎo)出表





這個(gè)程序沒有導(dǎo)出函數(shù),,所以沒有導(dǎo)出表。



第二個(gè)IMAGE_DIRECTORY_ENTRY_IMPORT  導(dǎo)入表



這個(gè)程序需要用到dll中的函數(shù)



 





我們用PEiD來(lái)查看下



 





結(jié)果是一樣的,。這個(gè)是RVA,,表示偏移地址哦。



 



第三個(gè)IMAGE_DIRECTORY_ENTRY_RESOURCE   資源目錄





從上面這張圖也可以看出,。RVA為00025000,,大小為5188byte



 



第四個(gè)IMAGE_DIRECTORY_ENTRY_EXCEPTION  異常目錄



 





未使用,。



 





第五個(gè) IMAGE_DIRECTORY_ENTRY_SECURITY  安全目錄



 





 



第六個(gè) IMAGE_DIRECTORY_ENTRY_BASERELOC   重定位表



 





 



第七個(gè) IMAGE_DIRECTORY_ENTRY_DEBUG  調(diào)試信息



 





 



第八個(gè) IMAGE_DIRECTORY_ENTRY_COPYRIGHT 版權(quán)信息



 





 



第九個(gè)  IMAGE_DIRECTORY_ENTRY_GLOBALPTR 



 





 



第十個(gè) IMAGE_DIRECTORY_ENTRY_TLS  線程的本地存儲(chǔ)器



 





 



第十一個(gè) IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 載入配置目錄



Load configuration table address and size



 





 



第十二個(gè) IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  綁定導(dǎo)入表地址和大小



Bound import table address and size



 





 



第十三個(gè) IMAGE_DIRECTORY_ENTRY_IAT  導(dǎo)入函數(shù)地址表Import Address Table



Import address table address and size



 





用Exeinfo PE 查看



 





 



第十四個(gè) IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT



Delay import descriptor address and size



 





 



 



第十五個(gè) IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR



The CLR header address and size



 





 



第十六個(gè) IMAGE_NUMBEROF_DIRECTORY_ENTRIES   保留值



 





 



到此,整個(gè)PE文件頭結(jié)束了,。





PE文件結(jié)構(gòu)及其加載機(jī)制(四)






下面我們開始學(xué)習(xí)節(jié)表,。



不知道還記不記得在前面哪個(gè)結(jié)構(gòu)體中出現(xiàn)過(guò)節(jié)的數(shù)量?



 



嘿嘿,,忘記了吧,,我們翻開以前的記錄,看看,。



原來(lái)是



typedef struct IMAGE_NT_HEADERS
  {
        DWORD Signature;
        IMAGE_FILE_HEADER FileHeader;
        IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  }IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS; 



中的




復(fù)制代碼

typedef struct _IMAGE_FILE_HEADER {   
        WORD      Machine;                 //運(yùn)行平臺(tái) 
        WORD      NumberOfSections;        //塊(section)數(shù)目      
        DWORD     TimeDateStamp;           //時(shí)間日期標(biāo)記     
        DWORD     PointerToSymbolTable;    //COFF符號(hào)指針,,這是程序調(diào)試信息    
        DWORD     NumberOfSymbols;         //符號(hào)數(shù)  
        WORD      SizeOfOptionalHeader;    //可選部首長(zhǎng)度,是IMAGE_OPTIONAL_HEADER的長(zhǎng)度    
        WORD      Characteristics;         //文件屬性 
}


復(fù)制代碼



第二個(gè)成員就是了,。



我們回去找找這個(gè)程序的這個(gè)值是多少,。





原來(lái)是四個(gè)節(jié)啊,當(dāng)然了,,也可以說(shuō)四個(gè)段,。





果然是四個(gè)段。



好了,,復(fù)習(xí)完需要的知識(shí),,我們就繼續(xù)學(xué)習(xí)。



 



================================================














typedef struct _IMAGE_SECTION_HEADER
{


  BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];


  union {


    DWORD PhysicalAddress;


    DWORD VirtualSize;


  }
Misc;


  DWORD VirtualAddress;


  DWORD SizeOfRawData;


  DWORD PointerToRawData;


  DWORD PointerToRelocations;


  DWORD PointerToLinenumbers;


  WORD  NumberOfRelocations;


  WORD  NumberOfLinenumbers;


  DWORD Characteristics;


}
IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;







 同樣的,,這也是一個(gè)結(jié)構(gòu)體,,而且有幾個(gè)節(jié),就有幾個(gè)這種類似的結(jié)構(gòu)體,。



"#define IMAGE_SIZEOF_SHORT_NAME 8"    原來(lái)是個(gè)8



IMAGE_SECTION_HEADER的結(jié)構(gòu)如下

 

typedef struct _IMAGE_SECTION_HEADER  



        BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     // 節(jié)表名稱,如“.text”  

        //IMAGE_SIZEOF_SHORT_NAME=8 

        union 

         { 

                DWORD PhysicalAddress;        // 物理地址 

                DWORD VirtualSize;                // 真實(shí)長(zhǎng)度,,這兩個(gè)值是一個(gè)聯(lián)合結(jié)構(gòu),可以使用其中的任何一個(gè),,一 

                                                              // 般是取后一個(gè) 

        } Misc; 

        DWORD VirtualAddress;              // 節(jié)區(qū)的RVA 地址 

        DWORD SizeOfRawData;            // 在文件中對(duì)齊后的尺寸 

        DWORD PointerToRawData;        // 在文件中的偏移量 

        DWORD PointerToRelocations;     // 在OBJ文件中使用,,重定位的偏移 

        DWORD PointerToLinenumbers;   // 行號(hào)表的偏移(供調(diào)試使用地) 

        WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位項(xiàng)數(shù)目 

        WORD NumberOfLinenumbers;    // 行號(hào)表中行號(hào)的數(shù)目 

        DWORD Characteristics;              // 節(jié)屬性如可讀,,可寫,,可執(zhí)行等} IMAGE_SECTION_HEADER,
*PIMAGE_SECTION_HEADER;  


Name 里面存的是區(qū)塊的名字

.text code 什么的就是放代碼用的

.data 就是放數(shù)據(jù),已經(jīng)初始化好的

.idata 就是輸入表 ,,很多加殼程序會(huì)修改輸入表,,hook api 在程序運(yùn)行api時(shí),讓殼取得一定時(shí)間的權(quán)限來(lái)反跟蹤,,脫殼的一大步驟就是還原輸入表。

.edata 輸出表

.bbs 未初始化的數(shù)據(jù)

VirtualSizes是一個(gè)非常牛逼的成員,其中的值是區(qū)塊沒有按FileAlignment對(duì)其前的大小,,通過(guò)它可以推算出區(qū)塊中還有多少?zèng)]有被使用,,很多病毒會(huì)在未被是用的空間里

插入自己的代碼。

Characteristics 表示該區(qū)塊的屬性 可讀啊 可寫啊什么的

 

//   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. 

                           //區(qū)段包含代碼 

#define IMAGE_SCN_CNT_INITIALIZED_DATA  0x00000040 // Section contains initialized
data. 


                           //區(qū)段包含已初始化數(shù)據(jù) 

#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized
data. 


                           //區(qū)段包含未初始化數(shù)據(jù) 

#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. 

                           //該區(qū)段可丟棄 

#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. 

                           //該區(qū)段可共享 

#define IMAGE_SCN_MEM_EXECUTE       0x20000000 // Section is executable. 

                           //該區(qū)段可執(zhí)行 

#define IMAGE_SCN_MEM_READ        0x40000000 // Section is readable. 

                           //該區(qū)段可讀 

#define IMAGE_SCN_MEM_WRITE        0x80000000 // Section is writeable. 

                           //該區(qū)段可寫 

 

最后寫個(gè)程序把這個(gè)結(jié)構(gòu)讀出來(lái)

由于我比較懶就只讀了Name這個(gè)成員,,有些加殼軟件會(huì)修改Name這個(gè)字段使讀出來(lái)的東西亂七八糟,,比如UPX的壓縮殼,會(huì)把Name字段改成UPX0,,UPX1這樣

 

#include "windows.h" 

#include "stdio.h" 

 

int main(int argc, char* argv[]) 



    FILE *p; 

    int i; 

    unsigned long Signature; 

    IMAGE_FILE_HEADER myfileheader; 

    IMAGE_DOS_HEADER mydosheader; 

    IMAGE_OPTIONAL_HEADER myoptionalheader; 

    IMAGE_SECTION_HEADER mysectionheader; 

 

    p = fopen("test.exe","r+b"); 

    if(p == NULL)return -1; 

 

    fread(&mydosheader,sizeof(mydosheader),1,p); 

    fseek(p,mydosheader.e_lfanew,SEEK_SET); 

    fread(&Signature,sizeof(Signature),1,p); 

 

    fseek(p,mydosheader.e_lfanew+sizeof(Signature),SEEK_SET);//指向IMAGE_FILE_HEADER結(jié)構(gòu)的偏移 

    fread(&myfileheader,sizeof(myfileheader),1,p); 

 

    fseek(p,mydosheader.e_lfanew+sizeof(Signature)+sizeof(myfileheader)+sizeof(myoptionalheader),SEEK_SET); 

    printf("Signature          : %04X\n",Signature); 

    printf("IMAGE_SECTION_HEADER       結(jié)構(gòu):\n"); 

    for(i=0;i<myfileheader.NumberOfSections;i++){ 

        fread(&mysectionheader,sizeof(mysectionheader),1,p); 

        printf("Name               : %s\n",mysectionheader.Name); 

    } 

    fclose(p); 

    return 0; 















    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多