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

Windows PE文件内未用空间学习

    未用空间,是指编译好的PE文件,整个可执行文件内,有一些空间是本exe没有用到的。有几种情况;
一种是未用的字段,PE格式定义了各种结构体,其中一些结构体的一些字段,是保留的,或者是赋什么值都不影响;
一种是大小不固定的数据块;还不太理解这种;
一种是操作系统对PE文件的强制对齐,为对齐而补足的0;
在未用空间插入一些构造好的代码,可以实现对程序打补丁的功能,或者制作病毒。对于打补丁来说,这就是可利用空间。

1 未用的字段

    根据资料,PE文件的DOS头,除了e_magic和e_lfanew字段,有54字节的未用空间。
看一下为什么会有这54字节;
DOS头定义如下,

//大小为: 0x40(64)字节#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZtypedef struct _IMAGE_DOS_HEADER {      // DOS .EXE headerWORD   e_magic;                     // MZ标记 0x5a4dWORD   e_cblp;                      // 最后(部分)页中的字节数WORD   e_cp;                        // 文件中的全部和部分页数WORD   e_crlc;                      // 重定位表中的指针数WORD   e_cparhdr;                   // 头部尺寸以段落为单位WORD   e_minalloc;                  // 所需的最小附加段WORD   e_maxalloc;                  // 所需的最大附加段WORD   e_ss;                        // 初始的SS值(相对偏移量)WORD   e_sp;                        // 初始的SP值WORD   e_csum;                      // 补码校验值WORD   e_ip;                        // 初始的IP值WORD   e_cs;                        // 初始的SS值WORD   e_lfarlc;                    // 重定位表的字节偏移量WORD   e_ovno;                      // 覆盖号WORD   e_res[4];                    // 保留字WORD   e_oemid;                     // OEM标识符(相对m_oeminfo)WORD   e_oeminfo;                   // OEM信息WORD   e_res2[10];                  // 保留字LONG   e_lfanew;                    // NT头(PE标记)相对于文件的偏移地址} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

e_magic是可执行文件标记,e_lfanew字段是用来找NT头的,这两个必须有,其他都是没用到的。

拿工具观察一下,

只有Signature和Offset to Nex EXE Header是有用的;有54个字节不在意放什么; 

其他还有,
标准PE头有12个字节的未用空间;
扩展PE头有 14+8+8+2+4+4 字节的未用空间;

有时间继续;

http://www.dtcms.com/a/291638.html

相关文章:

  • Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章
  • wed前端简单解析
  • wangEditor5添加键盘事件/实现定时保存功能
  • 【文献笔记】ARS: Automatic Routing Solver with Large Language Models
  • SpringMVC快速入门之启动配置流程
  • C语言基础:函数练习题
  • 【洛谷】用两个数组实现静态单链表、静态双向链表,排队顺序
  • C#初学知识点总结
  • 假发行业数字化突围,外贸ERP重构外协管理引擎,助力效率飞跃
  • 智联智造:国内新能源汽车品牌AGV小车无线控制系统创新实践
  • 面试题:sql题一
  • 前端项目启动后,只有localhost地址,没有ip地址
  • vs2017 c++ 使用sqlite3数据库
  • Java 邂逅 WebSocket:解锁实时通信的无限可能​
  • Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)
  • 【计算机网络 篇】TCP基本认识和TCP三次握手相关问题
  • ArKTS: DAL,Model,BLL,Interface,Factory using SQLite
  • docker-desktop启动失败
  • 【电影剖析】千钧一发
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 【openbmc6】entity-manager
  • C# 转换(is和as运算符)
  • 【人工智能99问】transformer的编码器和解码器是如何协同工作的?(15/99)
  • 【面经】实习经历
  • Thread 类
  • Java注解家族--`@ResponseBody`
  • 2025杭电多校赛(2)1006 半
  • 微信二维码扫描登录流程详解
  • Pytorch版本、安装和检验
  • 简单讲解HTTPS如何保证安全性和可靠性