接上一篇的win32下PE文件分析之NT头(一).FileBuffer与ImageBuffer    (1).FileBuffer是将文件原原本本的读入申请的内存区域中,那部分区域就是FileB"/>

win32下PE文件分析之节表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32下PE文件分析之节表相关的知识,希望对你有一定的参考价值。

技术分享

接上一篇的win32下PE文件分析之NT头

(一).FileBuffer与ImageBuffer

    (1).FileBuffer是将文件原原本本的读入申请的内存区域中,那部分区域就是FileBuffer,里面的内容与磁盘中的文件一模一样.如下图:

技术分享


    (2).ImageBuffer是按照一定规则加载到内存中的某个区域,并且通过一定的处理,能立刻执行的区域,那部分区域叫做ImageBuffer.其大小就是可选PE头中的SizeOfImage.结构如下图:

技术分享

    (3).二者之间的关系:

        ImageBuffer是按照文件FileBuffer中给定的条件,按照一定的规定加载到ImageBuffer.如果内存对齐与文件对齐大小一样,则ImageBuffer几乎是FileBuffer的一份完整拷贝(图中黄色部分是节表中的Misc).


(二).节表:

    从上面的图中,可以看到节表的位置就挨着可选PE头的,所以只要从FileBuffer的起始位置加上几个头的大小,就是节表的位置.一个PE文件中,节表的数量可能不一样.各个节表是紧挨着的.以下是Visual C++ 6.0中winnt.h中定义的节表结构:

#define IMAGE_SIZEOF_SHORT_NAME              8

typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];        //该节的名字
    union {    
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;                                       //该节在内存中对齐前的大小
    DWORD   VirtualAddress;                       //该节在ImageBuffer中的偏移
    DWORD   SizeOfRawData;                        //该节在文件中对齐后的大小
    DWORD   PointerToRawData;                     //该节在在文件中的偏移
    DWORD   PointerToRelocations;        
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;                       //该节的属性(比如是否可读,是否可写...)
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

(三).遍历节表:

    通过循环遍历notepad.exe中的节表,节的数量为标准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);
	//定位节表在文件缓冲中的位置
	IMAGE_SECTION_HEADER* psec = (IMAGE_SECTION_HEADER*)((unsigned char*)buf + pdos->e_lfanew + 0x4 + 0x14 + pfile->SizeOfOptionalHeader);
	
	//遍历节表
	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++;
	}
}

    注释掉解析其他头的函数,运行结果如下图:

    技术分享


(四).说明:

    上面的代码中只输出了部分信息,主要是一些比较有用的信息.

    节表中最后一个成员的值Characteristics,决定了这个节的权限.下图是其属性的对照表:

技术分享    

有空会继续更新.有任何建议请留评论.

本文出自 “daye8ku” 博客,请务必保留此出处http://daye8ku.blog.51cto.com/12079192/1925011

以上是关于win32下PE文件分析之节表的主要内容,如果未能解决你的问题,请参考以下文章

win32下PE文件分析之DOS头

PE知识复习之PE的节表

PE格式第五讲,手工添加节表

PE文件格式详解,第三讲,可选头文件格式,以及节表

逆向工程之PE文件格式

在PE中,新增节,添加代码