PE文件解析-加载配置表、绑定导入表、导入地址表与延迟导入表

PE——PE结构中数据表 PE结构中的数据包主要作用是用于引导操作系统去怎么操作这个文件,大多是为了程序能顺利运行起来做一些前置准备工作。 PE结构中的数据表由可选文件头中的DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 字段来指示。 这个字段中有IMAGE_NUMBEROF_DIRECTORY_ENTRIES个下面的结构,IMAGE_NUMBEROF_DIRECTORY_ENTRIES也就是可选文件头中的NumberOfRvaAndSizes。 struct _IMAGE_DAT 阅读详情

一、加载配置表

1.位置与简介

    载入配置表早期是用于描述当PE文件头或PE可选头无法描述或者因为太大而无法描述的各种功能。
    后来以XP及以后的系统主要是为了存储SEH句柄,称为安全结构化异常处理程序列表,如果SEH异常处理没有经过注册,在载入配置表中没有句柄,这个异常处理就不会被执行。
    据微软官方说明,这个载入配置表的作用是为了防止“x86异常处理程序劫持”的漏洞。因为年代久远就无从考据了。

    PE文件头可选映像头中数据目录表的第11成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]指向加载配置表。

2.数据结构

    加载配置表起始于IMAGE_LOAD_CONFIG_DIRECTORY,它的定义如下:

typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {
    DWORD   Characteristics;              //属性,当前没使用
    DWORD   TimeDateStamp;                //(GMT时间)
    WORD    MajorVersion;                 //主版本号
    WORD    MinorVersion;                 //子版本号
    DWORD   GlobalFlagsClear;             //启动时清除全局标志
    DWORD   GlobalFlagsSet;               //启动时设置全局标志
    DWORD   CriticalSectionDefaultTimeout;//程序关键部分默认超时值
    DWORD   DeCommitFreeBlockThreshold;   //返回系统前必须释放的内存,以字节为单位
    DWORD   DeCommitTotalFreeThreshold;   //总共释放的内存
    PVOID   LockPrefixTable;              //预加锁表
    DWORD   MaximumAllocationSize;        //最大配置体积
    DWORD   VirtualMemoryThreshold;       //最大虚拟内存尺寸
    DWORD   ProcessHeapFlags;             //进程堆栈标志
    DWORD   ProcessAffinityMask;          //进程内部掩码
    WORD    CSDVersion;                   //CSD版本
    WORD    Reserved1;                    //保留,必须为0
    PVOID   EditList;                     //保留
    DWORD   Reserved[ 1 ];
} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;

二、绑定导入表

1.位置与简介

    绑定导入表的作用是加快程序的启动速度,一个PE程序在启动时会去加载导入表中的dll文件,并将导入表的FirstThunk指向的数组填入函数的真实地址,这需要耗去时间,当绑定导入表有效时,即使是未运行状态,系统也会自动将导入表中的FirstThunk填入函数的真实地址,否则导入表的IAT在未载入内存时的值通常跟OriginFirstThunk中的一样。

绑定导入表的生效,有两个前提条件:

  1. 程序初始化时,导入的DLL都加载到了首选基址中
  2. 程序执行了绑定导入操作以后,导入DLL中引用的符号位置一直没有变化

如果有任何一个条件没有满足,系统就会忽略绑定导入操作。

    PE文件头可选映像头中数据目录表的第12成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]指向绑定导入表。

2.数据结构

    绑定导入表起始于IMAGE_BOUND_IMPORT_DESCRIPTOR,它的定义如下:

typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
    DWORD   TimeDateStamp;               //时间戳
    WORD    OffsetModuleName;            //dll名称偏移地址,基址是IMAGE_BOUND_IMPORT_DESCRIPTOR的开端
    WORD    NumberOfModuleForwarderRefs; //后面IMAGE_BOUND_FORWARDER_REF结构的数量
// Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

    IMAGE_BOUND_FORWARDER_REF的结构体定义如下:

typedef struct _IMAGE_BOUND_FORWARDER_REF {
    DWORD   TimeDateStamp;
    WORD    OffsetModuleName;
    WORD    Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;

    这个结构体的内容跟上面的其实是差不多的,绑定导入表中有一个函数转发链机制,比如说KERNEL32.DLL里面的HeapAlloc函数会转发到NTDLL.DLL中的RtlAllocateHeap函数,_IMAGE_BOUND_FORWARDER_REF 结构体就是用于保存转发函数的,一般情况下NumberOfModuleForwarderRefs为0。

三、导入地址表

    PE文件头可选映像头中数据目录表的第13成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT]指向导入地址表。导入地址表的内容其实就是导入表中的FirstThunk的内容。

四、延迟导入表

1.位置与简介

延迟加载表本质上跟绑定导入表的目的是一样的,都是为了加快程序加载文件的速度,只不过方法不一样。
延迟加载是指在调用某个DLL时才去加载,目的是为了避免在程序启动之初就加载了不必要的DLL而浪费了时间。微软建议在两种情况下使用延迟加载:

程序并非在启动时就会调用DLL里面的函数
程序未必会调用该DLL里面的函数

延迟加载表不是系统支持的一个特性,它是由编译器控制的。

PE文件头可选映像头中数据目录表的第14成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT]指向延迟导入表,它保存在PE文件中,通常在".didata"区段。

2.数据结构

延迟导入表的结构体如下:

typedef struct ImgDelayDescr {  
    DWORD        grAttrs;       //延迟导入结构的属性,0x1为新版本,0x0为老版本
    RVA          rvaDLLName;    //dll名字的RVA
    RVA          rvaHmod;       //dll句柄的RVA
    RVA          rvaIAT;        //IAT表的RVA
    RVA          rvaINT;        //INT表的RVA
    RVA          rvaBoundIAT;   //绑定导入表的RVA
    RVA          rvaUnloadIAT;  //原始IAT的可选拷贝的RVA
    DWORD        dwTimeStamp;   //延迟载入DLL的时间戳,通常为0
} ImgDelayDescr, * PImgDelayDescr;

 

FastAdmin框架Token验证实战:从登录到API调用的完整流程 本文详细解析了在FastAdmin框架中实现Token验证的完整流程,从数据表设计、登录接口签发Token,到核心验证中间件的编写与路由配置,并探讨了在业务API中的调用与安全实践。内容涵盖Token生成策略、有效期管理及安全增强措施,为开发者提供了一套可落地的API身份验证解决方案。 阅读详情

相关推荐

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 691

13.PE文件之绑定导入表(IMAGE_BOUND_IMPORT_DESCRIPTOR)

绑定导入数据的存在主要是为了优化导入信息,提高PE的加载效率. 当PE文件被加载到内存时,加载器会先检查导入表,然后把需要加载的DLL载入到地址空间中. 加载器还有一项比较重要的工作是根据导入信息的描述使用动态链接库里输入函数的实际地址去替换IAT表的内容,这个步骤会花去一部分时间.但是如果知道函数实际的地址,就可以直接把数组中的元素替换为地址,这能节省相当多的时间.这种方法就称为绑定(Binding). 绑定导入表定位以及解析(手动FileBuffer) 测试文件Win7 x86下note..

kernelhack 4423

Linux服务器上后台运行jupyter notebook/Lab

1 安装配置教程2 后台运行jupyter3 更改运行环境kernel4 SSH端口转发 1 安装配置教程 可以参考:https://www.cnblogs.com/thousfeet/p/10647102.html 2 后台运行jupyter screen -S jupyter # 新建一个名为jupyter的后台screen # 在base环境下,先 cd 到指定文件目录 jupyter notebook # or jupyter lab 3 更改运行环境kernel 需要手动为每个环境添加内.

strivequeen的博客 1834

关于绑定导入表

0x01 绑定导入表概念 绑定导入表(The Bound Import Directory)。它包含了可以让加载器判断绑定的地址是否合法的信息。描述它的数据结构是IMAGE_BOUND_IMPORT_DESCRIPTOR,目录表就是这种结构的数组,每一项都对应一个被绑定过的DLL。 每当PE装载器装入PE文件时,检查导入表并将相关DLL映射到进程空间地址。然后通过遍历IA...

abns44296的博客 903

美团外卖mtgsig 1.2逆向工程:从补环境到签名生成全解析

本文深入解析了美团外卖mtgsig 1.2签名算法的逆向工程全流程。从环境检测原理与补环境实战入手,详细拆解了签名JSON中每个关键字段的生成逻辑,并重点剖析了核心签名a2的生成步骤,涉及设备指纹、MD5、AES加密等关键技术。最后提供了构建签名生成器的实践思路与常见坑点,为理解复杂风控体系提供了完整的技术视角。

weixin_29324401的博客 1757

劳特巴赫 Trace32 调试使用教程

详细介绍如何使用trace32进行调试

m0_56208280的博客 4万+

滴水三期:day40.1-绑定导入表

一、引入绑定导入表 > 二、绑定导入表(1.定位 > 2.绑定导入表结构 > 3.作用)> 三、作业(1.打印绑定导入表)

Edimade的博客 706

超声波雷达探测车位及信号处理方法

在APA泊车中用到了超声波雷达,第一次接触,总结研究之。

周陽讀書 1229

《黑客免杀攻防学习笔记》——PE文件结构3

文章中的图片大部分为自己做截屏,少量摘自网络,若有侵权请及时告知,我会尽快删除。转载请注明出处。 接上一篇,上一篇了解了一些常用的结构的基本结构,这一篇从异常结构开始学习。 7.异常          PE文件中的异常目录用于描述异常处理函数、SEH地址等信息,存储于.pdata 段内,数据目录项的第四项指向结构的RVA。异常处理和处理器平台有关,所以书上是用64位处理器的平台作

Traxer的学习之路 1444

4.26华为OD机试真题 新系统 - 端口流量统计 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2334

2万字长文:海豚调度器(DolphinScheduler)面试题深入了解

DAG图(有向无环图)是海豚调度器中表示工作流任务依赖关系的一种方式。在DolphinScheduler中,每个任务是一个节点,任务之间的依赖关系通过有向边连接这些节点来表示。无环:保证了工作流的执行顺序是确定的,避免了无限循环的问题。有向:箭头指示了任务的执行方向,即上一个任务的输出可以作为下一个任务的输入。依赖表示:通过图形化界面,用户可以通过拖拽连接线来定义任务之间的先后顺序和依赖关系。并行处理:DAG图可以表示出任务的并行关系,允许多个任务在没有直接依赖关系的情况下同时执行。条件分支。

大模型大数据攻城狮的专栏 1331

详解PE文件(二十):导入地址表

导入地址表(IAT)是PE文件中用于支持动态链接的关键数据结构,位于Optional Header数据目录的第13个条目。它由IMAGE_THUNK_DATA数组组成,每个元素对应一个导入函数。结构简单:使用联合体表示不同类型的导入信息动态填充:加载时由加载器填写实际函数地址双重用途:加载前存储函数信息,加载后存储函数地址支持两种导入方式:按名称导入和按序号导入理解IAT的结构和工作原理对于逆向工程、恶意软件分析、程序调试等任务非常重要。

geesehoward20000的博客 1404

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2434

详解PE文件(十九):绑定配置表

绑定导入表是PE文件中用于优化模块加载性能的数据结构,位于Optional Header数据目录的第12个条目。它通过预计算导入模块的地址来加速程序启动过程。性能优化:提高程序启动速度结构简单:由描述符和模块名称组成时间戳验证:确保绑定的有效性兼容性考虑:在绑定失效时回退到正常流程虽然绑定导入表在早期Windows系统中发挥了重要作用,但在现代Windows系统中,由于ASLR等安全机制的普及,其使用已经减少。了解绑定导入表有助于深入理解PE文件结构和Windows加载机制。

geesehoward20000的博客 835

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【免杀前置课——PE文件结构】十八、数据目录表及其内容详解——数据目录表(导出表、导入表、IAT表、TLS表)详解;如何在程序在被调试之前反击?TLS反调试(附代码)

【免杀前置课——PE文件结构】十八、数据目录表及其内容详解——数据目录表(导出表、导入表、IAT表、TLS表)详解;如何在程序在被调试之前反击?TLS反调试(附代码)

m0_62783065的博客 1653

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

详解PE文件(一):PE文件基础概念

PE(Portable Executable)文件格式是Windows操作系统中用于可执行文件(.exe)、动态链接库(.dll)和系统驱动程序(.sys)的标准文件格式。它是Windows平台上软件执行的基础,理解PE文件格式对于系统编程、逆向工程、恶意软件分析和软件安全等领域都很重要。

geesehoward20000的博客 867

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

详解PE文件(十七):TLS表

/ TLS回调函数示例printf("新线程创建\n");break;printf("线程即将退出\n");break;// 在PE文件中注册TLS回调#pragmadata_seg// TLS回调函数示例 void NTAPI TlsCallback(PVOID DllHandle , DWORD Reason , PVOID Reserved) {case DLL_THREAD_ATTACH : printf("新线程创建\n");break;

geesehoward20000的博客 926

union all动态表_[PE](5)数据目录表

一、数据目录表的说明由16个IMAGE_DATA_DIRECTORY结构线性排列而成,用于定义PE中的16种不同类别的数据所在的位置和大小具体的16个数据目录表前面已经说过了,这里再介绍一下:数组编号英文描述中文描述0Export table address and size导出表地址和大小1Importtable address and size导入表地址和大小2Resource...

weixin_39656206的博客 280

逆向入门:Windows可执行文件PE初解

本文系统介绍了Windows可执行文件(PE格式)的核心结构与逆向工程关键技术。首先定义了可执行文件的基本概念,区分了可执行文件与数据文件的本质差异。随后详细解析了PE格式的完整结构,包括DOS头、NT头(文件头与可选头)、节表及各节功能。重点阐述了逆向工程中的六大核心操作:FileBuffer与ImageBuffer转换、RVA与FOA地址转换、.text节代码注入、任意节代码注入、新增节以及扩大最后一节。最后介绍了数据目录结构及主要功能表(导出表、导入表、IAT表、重定位表等)的作用。文章结合C/C++

m0_71332744的博客 383

详解PE文件(二十三):保留

PE文件中的"保留"字段是数据目录数组中的最后一个条目,它被保留供将来使用。根据规范,这个字段应该被设置为零,并且当前没有被任何已知的Windows技术使用。它的存在主要是为了保持PE文件格式的标准化和未来扩展性。在处理PE文件时,这个字段通常被忽略,但验证它是否为零是一个好的实践,以确保文件符合规范。

geesehoward20000的博客 572

二进制文件格式海报系列:从ELF到PE的视觉解剖

二进制文件格式海报系列:从ELF到PE的视觉解剖 本文全面解析了多种二进制文件格式的内部结构和设计原理。首先详细介绍了可执行文件格式的演进历程,从DOS COM格式到现代跨平台的ELF格式,涵盖了Windows PE格式、Unix/Linux ELF格式、macOS Mach-O格式以及嵌入式格式的技术特点。接着深入分析了图像与多媒体格式的层次结构,包括PNG、JPEG的编码机制和多媒体容器格式的...

gitblog_00363的博客 732

制作WinPE的基础知识

制作WinPE的基础知识==以下是转载内容,以供自己学习研究==1、WINPE.INI调用过程 WINPE.INI由PE系统的SYSTEM32\PECONFIG.INI指定:如:进程延时=10外部配置文件=外置程序\WinPE.INI2、编辑PE注册表 运行regedit.exe,光标定位到HKEY_USERS或HKEY_LOCAL_MACHINE项,然后“文件-加载配置单元...

weixin_34378969的博客 440

8、软件配置管理过程——所有表集合

软件配置管理过程——所有表集合 实施中管理软件配置项表 实施中管理软件版本表 实施中确认配置项状态表

红目香薰 1611

计算机程序编译过程,程序编译过程

相对虚拟地址在可执行文件中,许多地方都需要被指定一个在内存中的地址。例如在使用全局变量时需要它的地址。PE文件可以被加载到进程地址空间中的任何地方。虽然它有一个首选地址,但你却不能依赖可执行文件一定会被加载到那个地址。因此就需要按一定方式指定地址,使它们并不依赖于可执行文件的加载地址。为了避免在PE文件中硬编码内存地址,因此就使用了RVA。RVA只是一个相对于PE文件在内存中的加载位置的偏移。例如...

weixin_33048525的博客 479

【PE进阶】手动添加TLS回调函数

前情提要 Demo代码 #include <windows.h> int tls(){ MessageBox(NULL,"This is TLS CallBack!","TLS Success",MB_OK); return 0; } int main(){ MessageBox(NULL,"This ...

weixin_33672109的博客 863

PE文件结构及其加载机制(三)

上次我们学习了IMAGE_OPTIONAL_HEADER的前十个参数,下面我们继续学习。第十一个值SectionAlignment,表示节对齐粒度。这个值一定要大于或等于文件对齐粒度。The alignment of sections loaded in memory, in bytes. This value must be greater than or equal to the FileAl...

weixin_34010949的博客 220
上一篇: PE文件解析-全局指针表与线程局部存储(TLS)
下一篇: PE文件解析-资源(Resource)
zhyulo
博客等级 码龄10年 86粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值