PE文件中的IAT和IET

2023-10-09 02:50
文章标签 pe iat iet

本文主要是介绍PE文件中的IAT和IET,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PE文件中的IAT和IET

IAT

IAT中文名叫导入地址表

在IAT中存放的是导入的函数的RVA数组,每个元素对应一个函数的地址(RVA)

通过这个RVA即可找到导入函数的位置

所以说我们必须先知道IAT在哪

1.找到可选头结构体的最后一个成员

可选头结构体的最后一个成员是DataDirectory

它是一个结构体数组

typedef struct _IMAGE_OPTIONAL_HEADER {WORD                 Magic;BYTE                 MajorLinkerVersion;BYTE                 MinorLinkerVersion;DWORD                SizeOfCode;DWORD                SizeOfInitializedData;DWORD                SizeOfUninitializedData;DWORD                AddressOfEntryPoint;DWORD                BaseOfCode;DWORD                BaseOfData;DWORD                ImageBase;DWORD                SectionAlignment;DWORD                FileAlignment;WORD                 MajorOperatingSystemVersion;WORD                 MinorOperatingSystemVersion;WORD                 MajorImageVersion;WORD                 MinorImageVersion;WORD                 MajorSubsystemVersion;WORD                 MinorSubsystemVersion;DWORD                Win32VersionValue;DWORD                SizeOfImage;DWORD                SizeOfHeaders;DWORD                CheckSum;WORD                 Subsystem;WORD                 DllCharacteristics;DWORD                SizeOfStackReserve;DWORD                SizeOfStackCommit;DWORD                SizeOfHeapReserve;DWORD                SizeOfHeapCommit;DWORD                LoaderFlags;DWORD                NumberOfRvaAndSizes;IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

它的每个元素是一个IMAGE_DATA_DIRECTORY(IDD)结构体

typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress;DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

2.找DataDirectory数组的第二个成员

在这里插入图片描述

上图就是DataDirectory数组,每个元素就是上面说的IDD结构体

我们找到第二个元素IMPORT Table

可以得到它的RVA和Size(对应的就是IDD结构体的VirtualAddress和Size成员)

3.通过找到的RVA我们转到IMPORT Table的地址

这个地址也是一个结构体数组,每个元素都是一个IMAGE_IMPORT_DESCRIPTOR(IID)结构体

该结构体有20个字节大小

typedef struct _IMAGE_IMPORT_DESCRIPTOR{union{DWORD Characteristics;DWORD OriginalFirstThunk;	//INT的RVA};DWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name;						//导入的库的名称的RVADWORD FirstThunk;				//IAT的RVA
}IMAGE_IMPORT_DESCRIPTOR;

通过该结构体的最后一个成员我们得到IAT的RVA

在这里插入图片描述

上图中蓝色部分即为IMPORT Table数组中的第一个元素

4.通过IID找IAT

找到IID后(这里我们选的是IMPORT Table数组中的第一个元素)

通过最后一个4字节成员0x1000(即IAT的RVA),找到IAT的地址

在这里插入图片描述

图中蓝色部分即为导入函数的RVA,

注意IAT是一个地址数组,数组元素全都是导入函数的RVA

这里,我们选第一个地址0xC1708,转到相应地址查看

在这里插入图片描述

可以看到导入函数的相应信息

注意:这里的相关信息是一个IMAGE_IMPORT_BY_NAME结构体(图中蓝色部分)

其实上面的IAT地址处是地址数组,也是IMAGE_IMPORT_BY_NAME结构体的指针数组

每个地址都是一个IMAGE_IMPORT_BY_NAME结构体的指针

IMAGE_IMPORT_BY_NAME结构体定义如下:

typedef struct _IMAGE_IMPORT_BY_NAME{WORD Hint;				//导入函数的源(就是一个标识)BYTE Name[1];			//导入函数的名称
}IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

IET

IET简单理解就是一个应用程序或库需要给别的程序用的函数,即导出函数表

怎么找到IET的导出函数的地址?

1.找可选头最后一个成员DataDirectory

找到DataDirectory[0]

DataDirectory的第一个元素就是EXPORT Table

在这里插入图片描述

通过其RVA转到相应地址

2.找到IET倒数第三个成员

在这里插入图片描述

上图蓝色部分即为IET,可以发现:

IET地址处只有一个结构体(IED,40个字节),与IAT地址处相比较,IAT地址处是一个结构体数组,每个元素都是一个20字节的IID结构体

IET地址处的结构体为IMAGE_EXPORT_DIRECTORY(IED)

IED结构体定义如下:

typedef struct _IMAGE_EXPORT_DIRECTORY{DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name;					//库的名称地址(RVA)DWORD Base;DWORD NumberOfFunctions;DWORD NumberOfNames;DWORD AddressOfFunctions;	//导出函数的起始地址(RVA)这个地址里面										是一个地址数组,每个地址就是一个导出函数的地址DWORD AddressOfNames;		//库中导出函数的名称地址(RVA)DWORD AddressOfNameOrdinals;
}IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

找到AddressOfFunctions的RVA

在这里插入图片描述

3.通过找到的AddressOfFunctions转到相应地址

转到B5A0C

在这里插入图片描述

这里我们随便选一个地址看看,如第一个4EF9A(RVA),将其加上文件映射基址(我的环境下是77DE0000),得到77E2EF9A(VA)
77E2EF9A这个地址在OD中即可找到相应导出函数(但是我的环境下不知道为什么OD不显示…请大神指点)

这篇关于PE文件中的IAT和IET的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169818

相关文章

Codewarrior中利用PE multilink下载程序debug时不能连接问题

现象:PC连接PE multilink然后连接单片机,mutilink上的与单片机的连接接口是正确的,但点击codewarrior中debug按钮,则会出现连接失败,如下图: 电脑端口也能识别 但就是不能连接。 解决方案:如下图点击[FAQ#29]然后进入, 按照这个界面给的解决方案去解决即可,重装一下驱动(此页面下面会给出相应的BDM驱动)

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx,

Windows编程系列:PE文件结构

Windows编程系列:PE文件结构 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx, .com等)均使用PE文件结构。这些使用了PE文件结构的可执行文件也称为PE文件。 PE结构包含的结构体有DOS头,PE标识 、文件头、可选头、目录头、目录结构、节表等 整体结构

EEMD-MPE-KPCA-BiLSTM、EEMD-MPE-BiLSTM、EEMD-PE-BiLSTM故障识别、诊断(Matlab)

EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab) 目录 EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-BiLSTM(集合经验模

全网优质PE工具箱都在这,哪款是你的菜

PE工具箱是我们安装电脑以及系统维护常用工具,小编为大家整理了全网最全的优质PE工具箱,看看哪款是你在用的?你觉得哪个比较好呢? 1.微PE工具箱 微PE工具箱是一款轻量级、免安装的Windows PE救急维护工具,它能够在Windows操作系统无法启动时,通过U盘或其他介质进行启动,从而达到修复、维护和安装系统的目的。微PE工具箱的特点在于其小巧、高效,并且支持多种启动方式,包括从U盘、

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if

大白菜PE系统进入时一直 ACPI_BIOS_ERROR

安装系统PE不支持,主板不兼容,换个WIN10的PE就解决了,跟之前部分电脑需要WIN8的PE同理 WIN10PE教程 WIN8PE教程

11. 利用MS为Lammps ReaxFF建模(PE/聚乙烯)基础-2

来源: “码农不会写诗”公众号 链接:利用MS为Lammps ReaxFF建模(PE/聚乙烯)基础-2 文章目录 01 msi2lmp工具简介1. 编译生成msi2lmp可执行文件2. 使用方式 02 赋予模型CVFF力场03 导出car/mdf文件04 生成data文件05 data文件进一步处理 文接上篇   上篇利用Material Studio(MS)完成了

设计师应急设计PE (19043)windows准系统 RAMOS/PE 直接 Administrator登录

设计师应急设计PE (19043)windows准系统 RAMOS/PE 直接 Administrator登录 集成组件: MSI组件 VBS组件 DISM组件 、手机MTP、声网视/扫描仪/打印机驱动、VC++8.9.10运行库、7Z压缩、WIMTOOL工具、IMDISK虚拟磁盘、局域网共享、远程终端服务、VM拖拽、Ventoy启动。 支持功能: 聊天、影音、娱乐、下载、分享、直播、录屏、办公

VMware Workstation虚拟机进入U盘PE系统

注意事项 VMware Workstation虚拟机版本不能高于16.1.2版本!!! 本实验使用的版本如下 实际操作 在已安装好的虚拟机处右键,点击设置。虚拟机安装win10教程请参考VMware Workstation安装win10操作系统-CSDN博客 在弹出的窗口点击 添加 选择硬盘 下一步 这里根据需要选择一种磁盘,我这里选择的默认,点击下一步 这里选