当前位置: 首页 > ai >正文

Windows逆向工程提升之IMAGE_SECTION_HEADER

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

IMAGE_SECTION_HEADER 概述

作用

结构体定义

字段详细解析

Name[8]

VirtualSize

VirtualAddress

SizeOfRawData

PointerToRawData

Characteristics

关键知识点

内存与文件布局的差异 

节权限与安全机制

手动添加/修改节


IMAGE_SECTION_HEADER 概述

作用

  • 描述PE文件中各个节(Section)的属性,包括代码、数据、资源等段的文件布局和内存映射规则。
  • 每个节表项对应一个节(如.text.data.rdata),定义其名称、大小、偏移、权限等。
  • 节表位于 IMAGE_OPTIONAL_HEADER 之后,节数据紧随其后。

结构体定义

typedef struct _IMAGE_SECTION_HEADER {BYTE  Name[8];              // 节名称(8字节,非空终止)union {DWORD PhysicalAddress;  DWORD VirtualSize;      // 节在内存中的实际大小(未对齐)} Misc;DWORD VirtualAddress;       // 节的RVA(内存中的起始地址)DWORD SizeOfRawData;        // 节在文件中的大小(对齐后的值)DWORD PointerToRawData;     // 节在文件中的偏移DWORD PointerToRelocations; // 重定位表偏移(OBJ文件用)DWORD PointerToLinenumbers; // 行号表偏移(调试用)WORD  NumberOfRelocations;  // 重定位项数WORD  NumberOfLinenumbers;  // 行号项数DWORD Characteristics;     // 节的属性(可读/写/执行等)
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

字段详细解析

Name[8]

  • 作用:标识节的名称(如.text、.data、.rsrc)。
  • 特点:
    • 长度为8字节,可能不以空字符(\0)结尾(需手动处理)。
    • 部分名称有特殊含义(如.reloc表示重定位表)。
  • 示例:
    • .text:代码段,存放可执行指令。
    • .data:已初始化的全局/静态变量。
    • .rdata:只读数据(如字符串常量)。
    • .rsrc:资源数据(图标、对话框等)。

VirtualSize

  • ​作用:节在内存中实际占用的未对齐大小(可能小于内存对齐后的空间)。
  • ​示例:若代码段实际大小为0x1234字节,对齐为0x1000,则内存中占用0x2000字节,但VirtualSize仍为0x1234。

VirtualAddress

  • 作用:节在内存中的起始RVA(Relative Virtual Address)。
  • ​计算内存地址:内存地址 = ImageBase + VirtualAddress。

SizeOfRawData

  • ​作用:节在文件中的对齐后大小(必须是FileAlignment的整数倍)。
  • ​填充规则:若实际数据不足对齐值,文件末尾填充0x00。

PointerToRawData

  • ​作用:节在文件中的偏移地址(文件指针位置)。
  • ​文件读取:通过此偏移可直接定位节数据。

Characteristics

  • ​作用:节的属性标志位(通过位掩码组合)。
  • ​常见标志:
  • 标志值(十六进制)宏定义描述
    0x20000000IMAGE_SCN_MEM_EXECUTE可执行(代码段)
    0x40000000IMAGE_SCN_MEM_READ可读
    0x80000000IMAGE_SCN_MEM_WRITE可写(如.data段)
    0x00000020IMAGE_SCN_CNT_CODE包含代码
    0x00000040IMAGE_SCN_CNT_INITIALIZED_DATA包含已初始化数据
    0x00000080IMAGE_SCN_CNT_UNINITIALIZED_DATA包含未初始化数据(.bss)
    0x02000000IMAGE_SCN_MEM_DISCARDABLE可丢弃(如.reloc段)
    0x10000000IMAGE_SCN_MEM_SHARED内存中共享(DLL用)
    0x00000008IMAGE_SCN_MEM_NOT_PAGED不可分页(驱动程序用)

关键知识点

内存与文件布局的差异 

  • 对齐规则:
    • 内存对齐:由SectionAlignment(通常0x1000)决定。
    • 文件对齐:由FileAlignment(通常0x200)决定。
  • ​填充示例:
    • 文件中的.text段实际数据为0x300字节,对齐到0x200后占用0x400字节。
    • 内存中的同一段对齐到0x1000,占用0x1000字节,末尾填充未初始化数据或0xCC(调试版)。

节权限与安全机制

  • ​DEP(数据执行保护)​:若某节同时具有WRITE和EXECUTE权限,可能被利用执行Shellcode。
  • ​修改权限:恶意软件可能添加可写且可执行的节以注入代码。

手动添加/修改节

  • ​步骤:
    • 在节表中新增条目,设置名称、文件偏移、内存RVA和权限。
    • 调整SizeOfImage(在IMAGE_OPTIONAL_HEADER中)。
    • 在文件末尾追加节数据(需对齐到FileAlignment)。
  • ​用途:
    • 添加加密代码段(常见于壳程序)。
    • 隐藏敏感数据(如恶意配置)。
http://www.xdnf.cn/news/8185.html

相关文章:

  • 解决androidstudio不能识别夜神模拟器的问题
  • 前端 git仓库
  • 蜂鸣器模块
  • Java单例模式终极指南:从原理到防御性编程
  • 在线教育系统源码开发新趋势:白板教学、多端适配与智能组卷机制解读
  • CESM 运行环境搭建实战:Linux 基础、编译体系与 Machine File 配置
  • Java-System工具类深度解析
  • Elabscience CD161/NK1.1 抗体 [PK136]:肿瘤免疫与 NK 细胞活化研究新工具!
  • 灰度矫正算法详解【Halcon】:线性光照不均的处理方法【附代码下载】
  • DAY33
  • CRichEditCtrl 控件实现日志输出
  • 深入解析JMM:Java内存模型与并发编程
  • 2025-05-22 学习记录--Python-函数
  • 使用docker compose部署dify(大模型开发使用平台)
  • DV通配符和OV通配符区别?如何选择?
  • hicFindTADs生成的domains.bed文件解析
  • Android --- CopyOnWriteArrayList 的使用场景及讲解
  • 技术篇-2.5.Matlab应用场景及开发工具安装
  • DDR5和LPDDR5的CA采样时刻对比,含DDR5的1N/2N模式
  • JDK8中的 Stream流式编程用法优化(工具类在文章最后)
  • ollama接口配合chrome插件实现商品标题和描述生成
  • CLIP阅读笔记
  • 亚远景-ASPICE评估中的常见挑战及应对策略
  • 云蝠智能大模型:深度赋能的智能化功能,是怎么做到的?
  • 深入对比分析 Python 中字典和集合 异同
  • 高等数学-曲线积分与曲面积分
  • SpringBoot 对象转换 MapStruct
  • 《函数指针数组:创建与使用指南》
  • 【T2I】Controllable Generation with Text-to-ImageDiffusion Models: A Survey
  • 嵌入式学习笔记 D25 :标准i/o操作(2)、文件i/o