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

第3章 Windows运行机理-3.5 PE结构分析(3)

8. .reloc节

.reloc节容纳了一个基址重定位的表。基址重定位是对指令或初始化过的变量值的一个调整;如果装载器不能把EXE或DLL文件装到连接器假定它应该放置的地址上时,则该文件需要做这个调整。如果装载器能把映像装到连接器预先确定的基地址上,则装载器将忽略该节中的重定位信息。

如果你想要进行一个选择,并且希望装载器能够总把映像装到假定的基地址上,可使用/FIXED选项来告诉连接器除去这个信息。尽管这样可在可执行文件中节省空间,但它可能使该可执行文件不能在别的Win32平台上运行。例如,假设你建立了一个NT下的EXE文件,并把该EXE基址定到0x10000处。如果你告诉连接器除去重定位信息,则该EXE将不能在95下运行,因为在95下,地址0x10000不是有效的(在95中,最小的装载地址是0x400000,即4MB)。

注意被编辑器产生的JMP和CALL指令用的是相对于其指令的偏移量,而不是在32位段中的实际偏移量。假如映像需要装载到与连接器所指定的基地址不同的位置上,这些指令也不需改变,因为他们用的是相对地址。如果需要重定位的并没有像你想像得那么多,通常只有使用了对某些数据的32位偏移量的指令才需要重定位。例如,假如有如下的全局变量声明:

int Addr;

int *ptr=& Addr;

如果连接器给映像指定的基址是0x10000,则变量Addr的地址结构是含像0x12004之类的值。在存指针ptr的内存处,连接器将写值0x12004,因为那是变量Addr的地址。如果装载器(不管是什么原因)决定在0x70000为基地址的地方装载该文件,Addr的地址则将为0x72004。然而,这样该预先初始化的ptr变量的值就不正确了,因为Addr现在在内存中比原来高了0x60000字节。

这正是重定位信息发挥作用的地方。.reloc节实际上是记录了映像中一些位置的一张表,在这些位置上,连接器所假定的装载地址和实际装载地址之间的差别需要考虑。

3.5.3 PE文件引入

我们知道函数是如何对外部DLL文件调用的。它并不是直接调DLL的函数地址,而通过CALL指令转向该可执行文件中的.text节中其他地方上的一个JMP DWORD PTR[XXXXXXXX]。作为一种选择,如果在VC中用了_ _declspec(dllimprot),则函数调用变成CALL DWORD PTR[XXXXXXXX]。在这两种情况下,JMP或CALL要查的地址存于.idata节中。JMP或CALL指令把控制传给该地址,该地址是所要求的目的地址。

在被装入内存之前,PE文件的.idata节包含了一些信息。这些信息对于装载器确定目标函数的地址并把它们拼入可执行的映像中,是必不可少的。在.idata节被装入后,它包含了一个指针,该指针指向EXE/DLL引入的函数。注意,在本节我所讨论的所有数组和结构都被包含在.idata节中。

.idata节(从文件来说可以是idata节,如果内存映射就是import table,即引入表)用一个IMAGE_IMPORT_DESCRIPTOR的数组作为开始。对于PE文件隐含连接的每个DLL,都有一个IMAGE_IMPORT _DESCRIPTOR。对于该数组,没有任何计数来指示该数组中结构的数目,数组的最后一个元素是通过在最后域中填入NULL的一个IMAGE_IMPORT_DESCRIPTOR来表示的。一个IMAGE_IMPORT_ DESCRIPTOR的格式如下:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {

union {

// 0 for terminating null import descriptor

DWORD Characteristics;

// RVA to original unbound IAT (PIMAGE_THUNK_DATA)

DWORD OriginalFirstThunk;

};

// 0 if not bound,

// -1 if bound, and real date\time stamp

// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT

//(new BIND) O.W. date/time stamp of DLL bound to (Old BIND)

DWORD TimeDateStamp;

// -1 if no forwarders

DWORD ForwarderChain;

DWORD Name;

// RVA to IAT (if bound this IAT has actual addresses)

DWORD FirstThunk;

} IMAGE_IMPORT_DESCRIPTOR;

typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED

 Characteristics/OriginalFirstThunk:该域是相对的一个偏移量(RVA)。它指向一个IMAGE_THUNK_DATA类型的数据。其中,每个IMAGE_THUNK_DATA DWORD对应一个被该EXE/DLL引入的函数。

 TimeDataStamp:表示该时间/日期印记指示文件是什么时间建立的。该域一般为0。

 ForwarderChain:该域与传递相关联,包括一个DLL把对它的一个函数的访问传递给另一个DLL。例如,在Windows中,KERNEL32.DLL把它的一些引出函数传递给NTDLL.DLL,一个应用程序或许认为它调用了KERNEL32.DLL中的一个函数,但实际上它的调用进入到了NTDLL.DLL中。该域把一个索引含到FirstThunk数组中,被该域索引过的函数将被传递给另一个DLL。

 Name:这是相对一个用null作为结束符的ASCII字符串的一个RVA,该字符串含的是该引入DLL文件的名字(例如,KERNEL32.DLL或者USER32.DLL)。

 PIMAGE_THUNK_DATA FirstThunk: 该域是相对一个PIMAGE_THUNK_DATA DWORD数组的一个偏移量(RVA)。大多数情况下,该DWORD被解释成指向一个IMAGE_IMPORT_ BYNAME结构的一个指针。然而,也有可能用顺序值引入一个函数。

一个IMAGE_IMPORT_DESCRIPTOR的重要部分是引入DLL的名字和两个IMAGE_THUNK_DATA DWORD数组。每个IMAGE_THUNK_ DATA DWORD对应一个引入函数。在EXE文件中,这两个数组(被Characteristics和FirstThunk域所指向)并行地运行,并且都是在尾端处以一个NULL指针项作为中止。

为什么会有两个并行的指向IMAGE_THUNK_DATA结构的指针数组呢?

第一个数组(被Characteristics指向的那一个)被单独留下,并且绝不会被修改,它有时也被称做提示名称表(hint-name table)。

第二个数组(被IMAGE_IMPORT_DESCRIPTOR的FirstThunk域所指向)被PE装载器改写,然后用该引入函数的地址来改写IMAGE_ THUNK_DATA DWORD的值。

http://www.jsqmd.com/news/436413/

相关文章:

  • 2026年比较好的铝型材深加工 工厂推荐:工业铝型材深加工生产商哪家强 - 行业平台推荐
  • 一文深入了解深拷贝 和 浅拷贝
  • 2026年知名的反弹缓冲隐藏轨 工厂推荐:三节缓冲隐藏轨/抽屉缓冲隐藏轨/定制缓冲隐藏轨实力厂家如何选 - 行业平台推荐
  • MySQL范围查询的“截断”效应的庖丁解牛
  • 【人工智能】一文看懂SecondMe协议(SMP):你的AI数字分身“代言人”
  • 2026年比较好的白刚玉砂 品牌推荐:白刚玉磨料/白刚玉微粉/白刚玉颗粒正规生产厂家推荐 - 行业平台推荐
  • CSS 规则的庖丁解牛
  • phpstorm 设置 vmoptions后生成的在什么具体位置
  • HRP体系与独立成本核算管理系统应用价值分析 - 业财科技
  • 阶跃星辰深度开源,Agent 模型潜力几何?
  • 微服务开发面试题标准答案+速记要点
  • MyBatis-Plus 批量操作 SQL 日志不打印问题解决方案
  • 2026年口碑好的水环真空机组 厂家推荐:长吊引水真空机组值得信赖的生产厂家 - 行业平台推荐
  • 多模态大模型对齐实战教程(非常硬核),数据有限也能搞定,收藏这一篇就够了!
  • 2026年热门的EVA TAIC交联剂 品牌推荐:粉末TAIC交联剂/50粉末TAIC交联剂品牌厂家哪家靠谱 - 行业平台推荐
  • Node 快捷方式路径怎么获取
  • 用OpenClaw组建AI团队:一人顶一个部门的实战玩法
  • 重新安装指定 Node 版本、并切换了 Node 版本、但这里运行>npm -v 还是报错:‘npm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
  • CodeGenius Memory系统构建教程(非常详细),代码生成上下文控制从入门到精通,收藏这一篇就够了!
  • 【开题答辩全过程】以 衡水微法院小程序的设计与实现为例,包含答辩的问题和答案
  • 【机乎】Clawdbot之后,中文AI社交平台开启“祛魅”时刻
  • OpenClaw+RAG+Agent实战:打造能自动干活的数字员工
  • 2026 公认好用的 AI 论文软件,导师看了都夸专业
  • 阿里千问核心人员离职,AI战略何去何从?
  • 2026年热门的虾仁 工厂推荐:高邮大虾仁口碑好的厂家推荐 - 行业平台推荐
  • 【开题答辩全过程】以 高校学生社团管理系统为例,包含答辩的问题和答案
  • 智能体工程模式:编码新路径
  • 2026年评价高的悬链通过式抛丸机 厂家推荐:网带通过式抛丸机供应商怎么选 - 行业平台推荐
  • 从0到1打造专业职配助手:基于openJiuwen记忆库新特性的AI职业规划实战
  • 谷歌为 Pixel 推全新桌面模式