3、节表 IMAGE_SECTION_HEADERS

3、节表 IMAGE_SECTION_HEADERS

节表是IMAGE_SECTION_HEADER,首先看一下C语言结构体中是什么样子的。

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;

Misc.VirtualSize 表示节再内存中实际的大小,单位为字节

VirtualAddress RVA)后面会解释RVA什么意思,节在内存中偏移的地址

SizeOfRawData 节在文件中按照文件对齐后的大小 必须是FIleAlignment的整数倍

PointerToRawData 节在文件中的便宜地址

Characteristics 节的属性

这里的几个比较重要的已经说完了,下面开始写代码了。就是打印一个dll文件的节区数据。

VOID PrintSecHeader()
{
	//文件读取到内存中
	DWORD dwFileSize = 0;
	PCHAR fileBuff = fileToMem(&dwFileSize);
	if (!fileBuff)
	{
		log_error("fileToMem error");
		return;
	}

	PIMAGE_DOS_HEADER pImgDosHeader = (PIMAGE_DOS_HEADER)fileBuff;
	PIMAGE_NT_HEADERS pImgNtHeader = (PIMAGE_NT_HEADERS)(fileBuff + pImgDosHeader->e_lfanew);
	PIMAGE_FILE_HEADER pImgFileHeader = (PIMAGE_FILE_HEADER)((PCHAR)pImgNtHeader + 4);
	PIMAGE_OPTIONAL_HEADER pImgOptHeader = (PIMAGE_OPTIONAL_HEADER)((PCHAR)pImgFileHeader + IMAGE_SIZEOF_FILE_HEADER);
	// 节表位于可选PE头的下面, 可选PE头的大小在FILEHEADER中
	PIMAGE_SECTION_HEADER pImgSecHeader = (PIMAGE_SECTION_HEADER)((PCHAR)pImgOptHeader + pImgFileHeader->SizeOfOptionalHeader);
	// 节区大小固定的。所以这里直接遍历即可
	for (size_t i = 0; i < pImgFileHeader->NumberOfSections; i ++)
	{
		printf("name: %s,fileSize %#x,fileOffset %#x, MemorySize %#x ,MemoryOffset %#x,Type %#x\n"
			, pImgSecHeader[i].Name, pImgSecHeader[i].SizeOfRawData, 
			pImgSecHeader[i].PointerToRawData, pImgSecHeader[i].Misc.VirtualSize, 
			pImgSecHeader[i].VirtualAddress, pImgSecHeader[i].Characteristics);
	}
}

介绍一下RVA

首先 在文件中的地址称为 物理地址

物理地址加载到内存中,基址会发生改变,内存对齐会发生改变,内存对齐也就是之前说的。

这里的同样的数据,在内存中的地址称为VA

VA - 基址就是RVA了,

其实RVA就是在内存中的偏移,ok了 介绍完毕。

最后一个节区之后40个字节之内必须全部是0 。

posted @   未然king  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
点击右上角即可分享
微信分享提示