首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PE格式-如何查找只读初始化的数据位置和大小

PE格式-如何查找只读初始化的数据位置和大小
EN

Stack Overflow用户
提问于 2015-04-02 19:08:44
回答 1查看 657关注 0票数 0

PE格式规范指出:

所有导入符号的图像文件,包括几乎所有可执行文件,都有一个.idata部分。

但是我注意到,虽然调试构建是正确的,但是发行版构建不是这样的(至少在用VS2010编译时是这样)。

Visual将IAT & Import (以及其他一些目录)与只读数据合并到.rdata部分(我想这样做是为了节省空间和加载时间)。

很容易确定IAT & Import (读取目录信息)的位置和大小,但我无法确定实际数据(仅初始化数据)的起始和结束位置。

那么,有没有办法从PE头中获取这些信息呢?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-04-03 09:28:35

但是我注意到,虽然调试构建是正确的,但是发行版构建不是这样的(至少在用VS2010编译时是这样)。

不同的Microsoft链接器版本产生不同的PE文件。例如,在最新的Win 8.1 Update1 (x64)系统上,大多数系统(来自system32 / syswow64) PE文件都有一个.idata部分(来自可选标题的MinorLinkerVersion字段报告11.0链接器版本,即VS2012链接器)。

但你是对的,一些旧的链接器会产生合并的部分。

Visual将IAT & Import (以及其他一些目录)与只读数据合并到.rdata部分(我想这样做是为了节省空间和加载时间)。

这再一次取决于链接器版本。较早的链接器版本习惯于将导入目录和IAT合并到代码(.text)部分,因为默认情况下代码部分是只读的。我的系统中有一个旧版本的comctl32.ocx (在SysWOW64中),它显示了这种行为(据报告,链接器是v3.10 .)。

很容易确定IAT & Import (读取目录信息)的位置和大小,但我无法确定实际数据(仅初始化数据)的起始和结束位置。 那么,有没有办法从PE头中获取这些信息呢?

我想这里所说的“实际数据”是指代码部分使用的只读数据。

不,不完全是。正如您所提到的,PE头中没有任何内容直接引用代码通常使用的只读数据。因此,您必须避免使用启发式方法,因为您知道在只读数据发现方面不会实现100%的确定性。

如果导入目录和IAT与只读数据合并,一种可能是减去导入目录和IAT的大小和地址:所有不属于导入的内容都将是只读数据(在节标题中有该节的全部原始大小)。

首先,这并不意味着只读数据将是连续的: IAT通常位于节的开头,有时导入目录被推送到其他地方,到处都是只读数据(例如,代码所使用的)。

其次,您不能真正知道链接器是否会将其他只读数据放在该节中(除非这些数据是由一个或多个数据目录引用的),因为链接器有权合并具有完全相同属性的部分(通常类似于IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29420618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档