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

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

PointerToLinenumbers:表示行号表的基于文件的偏移量。一个行号表把源文件行号和一个地址对应起来,在该地址上可找到给定行产生的代码。主要用于调试中。

NumberOfRelocations:表示本节重定向表中重定向的数目(PointerTorRelocations域已在前面列出)。该域只用于OBJ文件。

WORD NumberOfLinenumbers:表示本节行号表中行号的数目(PointerRoLinenumbers域已在前面列出)。

Characteristics:含标记以指示节属性,比如节是否含有可执行代码、初始化数据、未初始数据,是否可写、可读等。对所有可能的节属性的列表请见WINNT.H中的IMAGE_SCN_XXX_XXX #defines。

下面我们列出了一些常见的节名。

1. .text节

.text节又叫代码节,它是编译器或汇编器产生的所有通用码。在.text节中,除了我用编译器创建的和从运行时间库中用到的外,还有另外附加的代码时,我感到很惊奇。在PE文件中,当你调用另一个模块中的函数(例如USER32.DLL的GetMessage())时,编译器产生的CALL指令并不是把控制直接传给DLL中的该函数。取而代之的是,该调用指令把控制传给也是在该.text节中的一个JMP DWORD PTR[XXXXXXXX]指令。该JMP指令跳转到以一个DWORD存于.idata节中的一个地址上。这个.idata节的DWORD含该操作系统函数入口点的真正地址。

通过一个位置把所有对一个给定的DLL函数的调用进行归结后,装载器就没有必要对每个调用DLL的指令进行拼凑了。PE装载器必须要做的只是把目标函数的正确地址放入.idata节中的该DWORD中就行了。没有任何的CALL指令需要拼凑。这与NE文件有明显的不同,后者中每个段含有一个用在该段上的安置表。如果该段调了某个DLL函数20次,则装载器必须将该函数的地址拷贝到该段中20次。在PE方法下,你不能用一个DLL函数的真正地址来初始化一个变量,你会以为如下句子:

FARPROC pfnGetMessage=GetMessage;

将会把GetMessage的地址放入变量pfnGetMessage中。在Win16中,这确实如此,但在Win32中则行不通。在Win32中,变量pfnGetMessage结果存的是在.text节中转换了的JMP DWORD PTR[XXXXXXXX]的地址。如果你通过函数指针来调用,结果会像你期望的那样出现。然而,如果要在GetMessage()的开始处读这些字节,则就不那么幸运了(除非你自己做一些附加的工作来跟随.idata的“指针”)。

2. .data节

正像.text是代码的默认节一样,.data节就是初始化了的数据所在的地方。初始化了的数据由全局变量和静态变量组成,他们在编译时被初始化。它还包括字符串文字(例如,在一个C/C++程序中的字符串“HELLO WORLD”)。连接器把来自于OBJ和LIB文件的所有.data节组合成EXE中的一个.data节。局部变量是被定位在一个线程栈上的,并且在.data或.bss节中不占空间。

3. .bss节

.bss节是未初始化的静态和全局变量存储的地方。连接器把来自于OBJ和LIB文件的所有.bss节组合成为EXE中的一个.bss节。在节表中,为.ss节所用的RawDataOffset域被置为0,表示这一节在文件中未占任何空间。TLINK32不产生.bss节,代之的是它扩展DATA节的虚拟尺寸以说明未被初始化的数据。

4. .CRT节

.CRT节是另一个初始化了的数据节,它被微软C/C++运行时间库(因而称为.CRT)所使用。该节中的数据被用于这样一些事情,如在Main或WinMain被执行之前调用静态C++类的构造函数。

5. .rsrc节

.rsrc节包含了本模块所用的资源。在NT出现后的较早时期,16位RC.EXE产生的.RES文件输出格式不能被微软连接器所识别。CVTRES程序把这些.RES文件转换成COFF格式的OBJ,并把数据放入OBJ内部的.rsrc节中。连接器然后才能把资源OBJ当做另一个OBJ连接进来。这意味着连接器并不必知道关于资源的任何特殊的东西。微软较新的连接器似乎能够直接处理.RES文件。

6. .idata节

.idata节包含模块从其他DLL引入的函数(和数据)的信息。该节等价于NE文件的一个模块访问表。不同的关键点在于:PE文件引入的每个函数特别地要在这一节列出。要在一个NE文件中找等价的信息,你不得不深入到每段所用的生数据尾端处的重定位。

7. .edata节

.edata是被其他模块使用的PE文件引出的函数和数据的一个列表。NE文件与此等价的是项表、驻留名字表和非驻留名字表这三个表的结合。不像在Win16中那样,几乎没有理由从一个EXE文件中输出任何东西,因此,通常只能在DLL文件中看到.edata节。例外的是Borland C++产生的EXE文件,它似乎总是引出一个函数(_ _GetExceptDLLinfo),该函数为运行时间库内部使用。

当使用微软工具时,.edata节中的数据通过.EXP文件到PE文件中。另一方面,连接器本身不产生这些信息,而是依靠库管理器(LIB32)来扫描OBJ文件,并创建.EXP文件,然后连接器把该.EXP文件加到模块列表中以便连接。那些麻烦的.EXP文件确实正是具有一个不同扩展名的OBJ文件。通过用/S(显示符号表)选项来运行PEDUMP程序,可以看到从一个.EXP中引出的函数。

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

相关文章:

  • 2026年质量好的神州飞碟游乐设施 厂家推荐:旋风骑士游乐设施/旋转的士高游乐设施/家庭过山车游乐设施生产厂家推荐几家 - 行业平台推荐
  • 2026年中山空气干燥机厂家推荐:冷冻式、风冷高温冷冻式、吸附式、微气耗鼓风热再生、零气耗鼓风热再生、微气耗压缩热再生、零气耗压缩热再生吸附式干燥机 - 海棠依旧大
  • 第3章 Windows运行机理-3.5 PE结构分析(3)
  • 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年热门的虾仁 工厂推荐:高邮大虾仁口碑好的厂家推荐 - 行业平台推荐
  • 【开题答辩全过程】以 高校学生社团管理系统为例,包含答辩的问题和答案
  • 智能体工程模式:编码新路径