PE格式规范指出:
所有导入符号的图像文件,包括几乎所有可执行文件,都有一个.idata部分。
但是我注意到,虽然调试构建是正确的,但是发行版构建不是这样的(至少在用VS2010编译时是这样)。
Visual将IAT & Import (以及其他一些目录)与只读数据合并到.rdata部分(我想这样做是为了节省空间和加载时间)。
很容易确定IAT & Import (读取目录信息)的位置和大小,但我无法确定实际数据(仅初始化数据)的起始和结束位置。
那么,有没有办法从PE头中获取这些信息呢?
谢谢
发布于 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)。
https://stackoverflow.com/questions/29420618
复制相似问题