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 。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版