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

PE结构 --->8.PE对齐的概念 文件对齐VS磁盘对齐

目录

PE结构中对齐概念详解

原理

磁盘文件对齐(File Alignment, 0x200):

内存对齐(Section Alignment, 0x1000):

关系与CPU页管理:

详细步骤:PE文件加载到内存的对齐过程

读取DOS头和PE头:

解析可选头:

读取节表:

处理重定位:

执行入口点:

内存以及磁盘PE结构介绍

内存对齐磁盘对齐的重要性

动静态分析PE的区别要搞明白

dump状态


PE结构中对齐概念详解

  • PE文件对齐是指节在磁盘文件和内存映像中的边界对齐机制,确保高效存储和访问。

  • 磁盘文件对齐通常为0x200(512字节,源于磁盘扇区大小),内存对齐为0x1000(4KB,源于CPU页管理单位)。

原理

PE对齐的核心源于操作系统和硬件的协作:

  1. 磁盘文件对齐(File Alignment, 0x200)
    1. 文件存储时,每个节的大小和位置必须是文件对齐值的倍数(PE可选头中的FileAlignment字段,默认0x200)。

    2. 这是因为硬盘以扇区(512字节)为最小读写单位,对齐可减少I/O操作碎片,提高读写效率。

    3. 如果不对齐,系统需额外处理填充,导致性能损失。

  2. 内存对齐(Section Alignment, 0x1000)
    1. 文件加载到内存时,每个节被映射到虚拟地址空间,以页为单位(x86/x64系统页大小4KB,即0x1000)。

    2. CPU使用分页机制管理内存:内存分为固定大小页,页表跟踪访问权限(如读/写/执行)。

    3. 对齐确保每个节起始于新页,避免一个页包含多个节的不同权限,防止安全漏洞(如缓冲区溢出跨节)。

    4. 如果文件节大小不是页倍数,加载器(Windows的ntdll.dll)会用0填充尾部扩展到页边界。

    5. 这可能导致“膨胀”:小文件在内存中占大空间。

  3. 关系与CPU页管理
    1. CPU通过MMU(内存管理单元)处理分页,页大小固定为0x1000以优化TLB(翻译后备缓冲器)缓存和减少页表开销。

    2. 文件对齐小于内存对齐是为了节省磁盘空间,而内存对齐优先安全和性能。

    3. 图片中左侧文件紧凑(200h),右侧内存膨胀(1000h),体现了这种权衡。

详细步骤:PE文件加载到内存的对齐过程

读取DOS头和PE头

  1. 加载器打开文件,读前64字节验证“MZ”,然后从e_lfanew偏移跳到PE头,验证“PE\0\0”。

解析可选头

  1. 从IMAGE_OPTIONAL_HEADER获取FileAlignment(0x200)和SectionAlignment(0x1000)。

读取节表

  1. 根据NumberOfSections,读取每个节的VirtualAddress、VirtualSize(内存大小)、PointerToRawData(文件偏移)、SizeOfRawData(文件大小)。

  2. 计算内存布局

    1. 每个节的内存起始地址 = ImageBase + VirtualAddress,必须是SectionAlignment的倍数。

    2. 如果VirtualSize > SizeOfRawData,超出部分填0;

    3. 如果VirtualSize不是0x1000倍数,扩展到下一个页边界。

  3. 映射和填充

    1. 使用VirtualAlloc分配内存页,将文件数据复制到对应位置,未占部分用ZeroMemory填0。应用页保护(如.text为PAGE_EXECUTE_READ)。

处理重定位

  1. 如果实际加载基址 != ImageBase,调整地址(但与对齐无关)。

执行入口点

  1. 跳转到AddressOfEntryPoint开始执行。

内存以及磁盘PE结构介绍

  • 磁盘也就是ox200

  • 内存就是ox1000

同样是400的位置显示的数据是不一样的

  • 也就是dos头 dos体 NT头 节表 这四处都是相同的 但是走到了节数据段磁盘和内存段就是不一样了

  • 也就是说在磁盘PE结构转换成内存结构后会进行一个拉伸的操作

  • 为什么要拉伸 也就是磁盘是0x200(512) 内存是0x1000的效率是最高的(4096)

  • 对齐也就是通过0x200进行一个数据段的对齐存放 内存就是0x1000进行存放

内存对齐磁盘对齐的重要性

  • PELoader

  • 内存重载

  • dump技术

  • 都要使用到到对齐分析

动静态分析PE的区别要搞明白

  • 也就是我们在静态分析的时候 节数据都是进行了加密以及混淆的

  • 所以我们在动态内存分析的时候其实加密和混淆就出来了

  • 也就是我们在运行的时候在加密和解密 我们的节数据都是一个解密的后的数据了

dump状态

  • 运行成内存状态 我们就可以进行一个反打包的状态而这个状态我们称之为dump状态 也就是把内存数据打包成文件状态(也就是进行一个解密的处理)加密后的数据就显现了(1小时30分钟)。

http://www.jsqmd.com/news/587753/

相关文章:

  • task jitter计算方法
  • 告别繁琐安装:用快马平台在线环境,三步创建你的第一个网页应用
  • 【ESP32-S3 深度实战】从小智AI底层移植到自定义LVGL表情:M5Stack CoreS3 避坑与架构指南
  • 硬件笔记——立创逻辑派开关电源案例解读
  • 零基础学Java:用快马AI生成你的第一个集合与对象管理程序
  • 提升开发效率:用快马一键生成智能排序工具模块
  • PE结构 ---> 9.RvaToFoa 内存状体到文件状态
  • 如何用PHP实现线程安全的单例模式?
  • 《黄金周人山人海,节后门可罗雀——景区怎么把这个差距缩小?》
  • 3种突破:ctfileGet如何解除城通网盘限速枷锁
  • 快马平台快速构建mysql博客系统原型:十分钟搞定数据库与api
  • Oracle EBS 资产类别是 真正的树形层级结构(通过弹性域实现父子关系),而 SAP 资产类别(Asset Class)是 扁平结构(无系统内置层级)
  • 飞牛openclaw使用指南(免费模型,不消耗token,响应快,无qps限制,无限使用!!)
  • 实战指南:基于快马生成openclaw千问的智能文档问答系统完整项目
  • 番茄小说下载器:3分钟搭建你的个人离线图书馆完整指南
  • 面试“逆袭率”第一的秘密:让我为你细细阐述
  • Oracle EBS和SAP在资产类别层级关系上的差异
  • 【小兔鲜电商前台 | 项目笔记】第三天
  • 在Windows系统下使用fastboot命令
  • 【SMPL-X】AMASS动捕数据集与SMPL格式概述
  • 房屋建筑学——变形缝
  • Flink 个人学习实时数据管道框架--2 技术架构设计
  • 简单工厂、工厂方法、抽象工厂的PHP代码区别?
  • LLM 怎么生成回答?揭秘“思考“过程
  • Phi-4-mini-reasoning作品集:离散数学归纳法严谨性验证生成案例
  • OpenClaw人人养虾:后台执行
  • MySQL函数及条件查询相关用法
  • 2025_NIPS_Fast Monte Carlo Tree Diffusion: 100× Speedup via Parallel Sparse Planning
  • AI赋能论文研究:调用快马平台模型智能分析文本与提取关键词
  • OpenClaw多终端控制:千问3.5-9B实现跨设备协同