您好,登錄后才能下訂單哦!
接上一篇的win32下PE文件分析之NT頭
(一).FileBuffer與ImageBuffer
(1).FileBuffer是將文件原原本本的讀入申請的內(nèi)存區(qū)域中,那部分區(qū)域就是FileBuffer,里面的內(nèi)容與磁盤中的文件一模一樣.如下圖:
(2).ImageBuffer是按照一定規(guī)則加載到內(nèi)存中的某個區(qū)域,并且通過一定的處理,能立刻執(zhí)行的區(qū)域,那部分區(qū)域叫做ImageBuffer.其大小就是可選PE頭中的SizeOfImage.結(jié)構(gòu)如下圖:
(3).二者之間的關(guān)系:
ImageBuffer是按照文件FileBuffer中給定的條件,按照一定的規(guī)定加載到ImageBuffer.如果內(nèi)存對齊與文件對齊大小一樣,則ImageBuffer幾乎是FileBuffer的一份完整拷貝(圖中×××部分是節(jié)表中的Misc).
(二).節(jié)表:
從上面的圖中,可以看到節(jié)表的位置就挨著可選PE頭的,所以只要從FileBuffer的起始位置加上幾個頭的大小,就是節(jié)表的位置.一個PE文件中,節(jié)表的數(shù)量可能不一樣.各個節(jié)表是緊挨著的.以下是Visual C++ 6.0中winnt.h中定義的節(jié)表結(jié)構(gòu):
#define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //該節(jié)的名字 union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; //該節(jié)在內(nèi)存中對齊前的大小 DWORD VirtualAddress; //該節(jié)在ImageBuffer中的偏移 DWORD SizeOfRawData; //該節(jié)在文件中對齊后的大小 DWORD PointerToRawData; //該節(jié)在在文件中的偏移 DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; //該節(jié)的屬性(比如是否可讀,是否可寫...) } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
(三).遍歷節(jié)表:
通過循環(huán)遍歷notepad.exe中的節(jié)表,節(jié)的數(shù)量為標準PE頭中NumberOfSections的值,代碼如下:
section.h:
void OutputSections(void* buffer) { void* buf = buffer; IMAGE_DOS_HEADER* pdos = (IMAGE_DOS_HEADER*)buf; IMAGE_FILE_HEADER* pfile = (IMAGE_FILE_HEADER*)((unsigned char*)buf + pdos->e_lfanew + 0x4); //定位節(jié)表在文件緩沖中的位置 IMAGE_SECTION_HEADER* psec = (IMAGE_SECTION_HEADER*)((unsigned char*)buf + pdos->e_lfanew + 0x4 + 0x14 + pfile->SizeOfOptionalHeader); //遍歷節(jié)表 for(int sec_num = 1; sec_num <= pfile->NumberOfSections; sec_num++) { printf("\nSection%d: %s\n", sec_num, psec->Name); printf("Misc: %#X\n", psec->Misc); printf("VirtualAddress: %#X\n", psec->VirtualAddress); printf("SizeOfRawData: %#X\n", psec->SizeOfRawData); printf("PointToRawData: %#X\n", psec->PointerToRawData); printf("Charactoeristcs: %#X\n", psec->Characteristics); psec++; } }
注釋掉解析其他頭的函數(shù),運行結(jié)果如下圖:
(四).說明:
上面的代碼中只輸出了部分信息,主要是一些比較有用的信息.
節(jié)表中最后一個成員的值Characteristics,決定了這個節(jié)的權(quán)限.下圖是其屬性的對照表:
有空會繼續(xù)更新.有任何建議請留評論.
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。