深入剖析Win32可移植可执行文件格式(第二部分)



深入剖析 Win32 可移植可执行文件格式 第二部分
作者:Matt Pietrek
上个月在本文的第一部分中,我首先对可移植可执行文件进行了全面的介绍.我讲了 PE 文 件的历史和组成 PE 文件头的数据结构,还讲了节表.PE 文件头和节表告诉你在可执行文件中都 包含什么类型的代码和数据,以及在哪里能找到它们. 本月我要讲一下常见的节.最后讲一下我的最新的经过彻底改进的PEDUMP程序,它可以在 2002 年 2 月的专栏中下载.如果你不熟悉PE文件的基本概念,应该首先读一下本文的第一部分. 上个月我讲了节是怎样的一个逻辑上属于一起的代码或数据块. 例如可执行文件的所有导入 信息都在一个节中. 现在让我们来看一下在可执行文件和 OBJ 文件中经常遇到的一些节. 除非特 别说明,否则下表中的节名都来自 Microsoft 的工具。
名称 .text .data .rdata .idata 描述 默认的代码节. 默认的可读/可写数据节.全局变量通常在这个节中. 默认的只读数据节.字符串常量和 C++/COM 虚表就放在这个节中. 导入表.实际上,链接器经常把.idata 节合并到其它节中(或者是明确指定的,或者是通 过链接器的默认行为).默认情况下,链接器仅在创建发行版的程序时才把.idata 节合并 到其它节中. .edata 导出表. 当创建要导出函数或数据的可执行文件时, 链接器会创建一个.EXP 文件. 这个.EXP 文件包含一个.edata 节,这个节被添加到最后的可执行文件中.与.idata 节一样,.edata 节也经常被合并到.text 节或.rdata 节中. .rsrc .bss 资源节.这个节是只读的.它不应该被命名为其它名称,也不应该被合并到其它节中. 未初始化的数据节. 在最新的链接器创建的可执行文件中很少见到. 链接器扩展可执行文件 的.data 节的 VirtualSize 域以便容纳未初始化的数据. .crt 添加到可执行文件中的数据,用来支持C++运行时库(CRT).一个比较好的例子就是用于调 用静态C++对象的构造函数和析构函数的指针.要获取更详细的信息,可以参考2001 年 1 月 的Under The Hood专栏. .tls 这个节中的数据用来支持使用\\\\_\\\\_declspec(thread)语法创建的线程局部存储变量. 它包括数 据的初始值,以及运行时需要的附加变量. .reloc 可执行文件中的基址重定位节. 通常 DLL 需要基址重定位信息而 EXE 并不需要. 在创建发行 版的程序时,链接器并不为 EXE 文件生成基址重定位信息.可以使用/FIXED 链接器选项移 除基址重定位信息. .sdata 通过全局指针(Global Pointer)相对寻址的"短(Short)"可读/可写数据.用于 IA-64 和其它使用全局指针寄存器的平台上.IA-64 平台上正常大小的全局变量在这个节中. .srdata 通过全局指针相对寻址的"短(Short)"只读数据.用于 IA-64 和其它使用全局指针寄存 器的平台上. .pdata 异常表.它包含一个 IMAGE\\\\_RUNTIME\\\\_FUNCTION\\\\_ENTRY 结构数组,这个结构与平台体系结构 相关. 数据目录中索引为 IMAGE\\\\_DIRECTORY\\\\_ENTRY\\\\_EXCEPTION 的项指向它. 用于使用基于表 的异常处理的平台,例如 IA-
  64.惟一不使用基于表的异常处理的平台是 x86(它使用的是
名称
描述 基于堆栈的异常处理).
.debug$S
OBJ 文件中的 Codeview 格式的调试符号(Symbol)信息.这是一列可变长度的 CodeView 格 式的调试符号记录.
.debug$T
OBJ 文件中的 Codeview 格式的调试类型(Type)记录.这是一列可变长度的 CodeView 格式 的调试类型记录.
.debug$P .drectve
可以在使用预编译头(Precompiled Headers)生成的 OBJ 文件中找到这个节. 这个节包含链接器指令, 并且只存在于 OBJ 文件中. 这些指令是传递到链接器命令行的 ASCII 码字符串,例如:-defaultlib:LIBC.指令之间用空格分开.
.didat
延迟加载导入数据.可以在非发行版本的可执行文件中找到.在发行版本中,延迟加载数据 被合并到其它节中.
导出表
当一个 EXE 或 DLL 导出函数或变量时,其它 EXE 或 DLL 就可以使用这些导出的函数或变量. 为了简单起见,我把导出的函数和导出的变量统称为"符号".当导出一些符号时,最起码导出 符号的地址需要能够以一种已定义好的方式被获取.每个导出的符号都有一个与之关联的序数, 它可以用来查找这个符号. 同时, 几乎总有一个 ASCII 码格式的字符串名称与这个导出的符号关 联.一般来说,导出的符号名与源文件中的符号名是一样的,尽管它们可以被修改的不一样. 通常,当可执行文件导入符号时,它使用的是符号的名称而不是它的序号.但是当通过名 称导入时, 系统仅使用这个名称去查找所需符号对应的导出序数, 然后根据这个序数值去获取相 应的地址. 如果先使用的是序数值的话查找过程会快一点. 通过名称导出和导入只是为了让程序 员使用方便罢了. 在.DEF 文件中的 Exports 节中使用 ORDINAL 关键字可以告诉链接器创建一个导入库,这个 导入库强制函数只能通过序数导入而不能通过名称导入. 我首先介绍 IMAGE\\\\_EXPORT\\\\_DIRECTORY 结构,如下表所示:
大小 DWORD DWORD 域 Characteristics TimeDateStamp 描述 导出标志.当前未定义任何值. 导出数据的创建时间.这个域的定义与 IMAGE\\\\_NT\\\\_HEADERS.FileHeader.TimeDateStamp 相同 (从 GMT 时间 1970 年 1 月 1 日 00:00 以来的总秒数). WORD WORD DWORD MajorVersion MinorVersion Name 导出数据的主版本号.未用,设置为
  0. 导出数据的次版本号.未用,设置为
  0. 与导出符号相关的 DLL 的名称 ASCII 字符串的 RVA(例如 KERNEL
  32.DLL). DWORD Base 这个域包含了这个可执行文件的导出符号所使用的序数值的起始值. 通常情况下这个值为 1, 但并不总是这样. 当通过序数查找导出符号时, 将序数值减去这个域的值就得到了这个导出符号在导出地址表 (Export Address Table ,EAT)中的索引.
大小 DWORD
域 NumberOfFunctions
描述 EAT 中的元素数.注意 EAT 中的某些元素可能为 0,这表明没有 代码/数据使用那个序数值导出.
DWORD
NumberOfNames
导出名称表(Export Names Table,ENT)中的元素数.这个域的值总 是小于或等于 NumberOfFunctions 域的值.当某些符号仅使用序数导 出时,它就小于那个域的值.如果导出序数之间有间隔,它同样也小 于那个域的值.这个域的值也是导出序数表的大小(见下文).
DWORD
AddressOfFunctions
EAT 的 RVA.EAT 中的每个元素都是一个 RVA.其中每个非 0 的 RVA 都 对应一个导出符号.
DWORD
AddressOfNames
ENT 的 RVA.ENT 中的每个元素都是一个 ASCII 码字符串的 RVA.其中 的每个 ASCII 码字符串都对应一个由名称导出的符号.这些字符串是 按一定顺序排列的.这就使得加载器在查找导出符号时可以进行二进 制搜索.名称字符串的排序是按二进制(与 C++运行时库函数 strcmp 类似),而不是与位置相关的字母表顺序.
DWORD
AddressOfNameOrdinals
导出序号表的 RVA.这个表是一个 WORD 类型的数组.它将 ENT 中的索 引映射到导出地址表中相应的元素上.
导出目录(Export Directory)指向三个数组和一个 ASCII 码字符串表.其中只有导出地 址表是必需的,它是一个由指向导出函数的指针组成的数组.导出序数是这个数组的索引(见下 图).
让我们通过例子来看一下导出表的工作原理. 下图显示了 KERNEL
  32.DLL 导出表的部分内容: exports table: Name: TimeDateStamp: Version: Ordinal base: # of Names: KERNEL
  32.dll 3B7DDFD8 -> Fri Aug 17 23:24:08 2001
  0.00 00000001 000003A0 Characteristics: 00000000
# of functions: 000003A0
Entry Pt Ordn Name
00012ADA 000082C2
1 ActivateActCtx 2 AddAtomA
remainder of exports omitted 假设你调用 GetProcAddress 来获取 KERNEL32 中的 AddAtomA 这个 API 的地址.这时系统开 始查找 KERNEL32 的 IMAGE\\\\_EXPORT\\\\_DIRECTORY 结构. 它从那里获取了导出名称表的起始地址, 知 道了在这个数组中有 0x3A0 个元素,它通过二进制搜索来查找字符串"AddAtomA". 假设加载器发现 AddAtomA 是这个数组中的第二个元素.然后它从导出序数表(Export Ordinal Table)中读取相应的第二个值.这个值就是 AddAtomA 的导出序数.将这个导出序数作 为 EAT 的索引(加上 Base 域的值),它最终获取 AddAtomA 的相对虚拟地址(RVA)是 0x82C
  2. 将此值与 KERNEL32 的加载地址相加就得到了 AddAtomA 的实际地址.
导出转发
导出表一个特别聪明的地方是它能将一个导出函数转发(Forwarding)到其它 DLL.例如 在 Windows NT,Windows 2000 和 Windows XP 中,KERNEL32 中的 HeapAlloc 函数被转发到了 NTDLL 导出的 RtlAllocHeap 函数上.转发是在链接时通过.DEF 文件中的 EXPORTS 节中的一种特 殊语法形式来实现的.对于 HeapAlloc 这个例子,KERNEL32 的.DEF 文件一定包含下面的内容: EXPORTS HeapAlloc = NTDLL.RtlAllocHeap 怎样才能区别转发的函数与正常导出的函数呢?这需要一些技巧.通常 EAT 中包含的是导 出符号的 RVA. 但是如果这个 RVA 位于导出表中 (通过相应的 DataDirectory 中的 VirtualAddress 域和 Size 域进行判断),那么它就是转发的. 当转发一个符号时,它的 RVA 很明显不能是当前模块中的代码或数据的地址.实际上,它 的 RVA 指向一个由 DLL 和转发到的符号名称组成的字符串.在前面的例子中,这个字符串就是 NTDLL.RtlAllocHeap.
导入表
与导出函数或变量相反的就是导入它们.为了与前面保持一致,我仍然使用"符号"这个 术语来指代导入的函数和变量. 导入数据被保存在 IMAGE\\\\_IMPORT\\\\_DESCRIPTOR 结构中.对应着导入表的数据目录项就指向 由这个结构组成的数组.每个 IMAGE\\\\_IMPORT\\\\_DESCRIPTOR 结构都与一个导入的可执行文件对应. 这个数组的最后一个元素的所有域都被设置为
  0.下表是这个结构的内容:
大小 DWORD 域 OriginalFirstThunk 描述 这个域的命名太不恰当.它包含导入名称表的 RVA.导入名称表是一个 IMAGE\\\\_THUNK\\\\_DATA 结构数组.这个域被设置为 0 表示 IMAGE\\\\_IMPORT\\\\_DESCRIPTOR 结构数组的结尾.
大小 DWORD
域 TimeDateStamp
描述 如果可执行文件并未绑定导入的 DLL, 这个域的值为
  0. 当使用老的绑定 类型进行绑定(参考"绑定"一节)时,这个域包含日期/时间戳.当使 用新的绑定类型进行绑定时,这个域的值为-
  1.
DWORD
ForwarderChain
这是首个转发的函数的索引. 如果没有转发的函数, 这个域被设置为-
  1. 它仅用于老的绑定类型,因为那种绑定类型不能很有效地处理转发的函 数.
DWORD DWORD
Name FirstThunk
导入的 DLL 名称字符串(ASCII 码格式)的 RVA. 导入地址表的 RVA.IAT 是一个 IMAGE\\\\_THUNK\\\\_DATA 结构数组.
每个 IMAGE\\\\_IMPORT\\\\_DESCRIPTOR 结构指向两个数组,这两个数组实际上是一样的.它们有 好几种叫法, 但最常用的名称是导入地址表 (Import Address Table, IAT) 和导入名称表 (Import Name Talbe,INT).下图显示的是可执行文件从 USER
  32.DLL 中导入一些 API 时的情况.
这两个数组的元素均为 IMAGE\\\\_THUNK\\\\_DATA 类型的结构,这个结构是一个与指针大小相同的 共用体(或者称为联合).每个 IMAGE\\\\_THUNK\\\\_DATA 结构对应着从可执行文件中导入的一个函数. 这两个数组最后都以一个值为 0 的 IMAGE\\\\_THUNK\\\\_DATA 结构作为结尾.这个共用体(实际是一个 DWORD 值)可以有如下几种含义: DWORD ForwarderString;// 转发函数字符串的 RVA(见上文) DWORD Function; DWORD Ordinal; // 导入函数的内存地址 // 导入函数的序数
DWORD AddressOfData; // IMAGE\\\\_IMPORT\\\\_BY\\\\_NAME 和导入函数名称的 RVA(见下文) IAT中的IMAGE\\\\_THUNK\\\\_DATA结构的用途可以分为两种.在可执行文件中,它们或者是导入函 数的序数,或者是一个IMAGE\\\\_IMPORT\\\\_BY\\\\_NAME结构的RVA.IMAGE\\\\_IMPORT\\\\_BY\\\\_NAME结构只是一个 WORD类型的值,它后面跟着导入函数的名称字符串.这个WORD类型的值是一个"提示(hint)", 它提示加载器导入函数的序号可能是什么. 当加载器加载可执行文件时, 它用导入函数的实际地 址来覆盖IAT中的每个元素. 这一点是理解下文的关键. 我强烈建议你读一读本期杂志中Russell Osterlund的文章??揭开Windows加载器的神秘面纱,这篇文章详细讲述了Windows加载器的行 为. 在可执行文件被加载之前,是否存在一种方法能够区分 IMAGE\\\\_THUNK\\\\_DATA 结构中到底包含 的是导入函数的序数呢, 还是 IMAGE\\\\_IMPORT\\\\_BY\\\\_NAME 结构的 RVA 呢?答案在 IMAGE\\\\_THUNK\\\\_DATA
结构的最高位.如果它为 1,那么低 31 位(在 64 位可执行文件中是低 63 位)中是导入函数的 序数. 如果最高位为 0, 那么 IMAGE\\\\_THUNK\\\\_DATA 结构的值就是 IMAGE\\\\_IMPORT\\\\_BY\\\\_NAME 结构的 RVA. 另一个数组 INT,本质上与 IAT 是一样的.它也是一个 IMAGE\\\\_THUNK\\\\_DATA 结构数组.关键 的区别在于当加载器将可执行文件加载进内存时,它并不覆盖 INT.为什么对于从 DLL 中导入的 每组 API 都需要有两个并列的数组呢?答案在于一个称为绑定(binding)的概念.当在绑定过 程(后面我会讲到)中覆盖可执行文件的 IAT 时,需要以某种方式
  •  
 

相关内容

深入剖析Win32可移植可执行文件格式(第二部分)

  深入剖析 Win32 可移植可执行文件格式 第二部分作者:Matt Pietrek上个月在本文的第一部分中,我首先对可移植可执行文件进行了全面的介绍.我讲了 PE 文 件的历史和组成 PE 文件头的数据结构,还讲了节表.PE 文件头和节表告诉你在可执行文件中都 包含什么类型的代码和数据,以及在哪里能找到它们. 本月我要讲一下常见的节.最后讲一下我的最新的经过彻底改进的PEDUMP程序,它可以在 2002 年 2 月的专栏中下载.如果你不熟悉PE文件的基本概念,应该首先读一下本文的第一部分. 上个 ...

03 第二部分 投标函格式B版071106final

  招标书编号:DPLNG-PL-ITT-016第二部分:投标函格式 第 1 页 共 13 页第二部分 投标函格式广东大鹏液化天然气有限公司招标书编号:DPLNG-PL-ITT-016第二部分:投标函格式 第 2 页 共 13 页目录附件A 投标函(格式) 附件B 投标保函(格式) 附件C 授权书(格式) 附件D 联合协议(如有)广东大鹏液化天然气有限公司招标书编号:DPLNG-PL-ITT-016第二部分:投标函格式 第 3 页 共 13 页附件 A 投标函( 格式) 投标函 ( 格式 )广东大鹏 ...

招标文件格式

  酒泉市物业管理招标文件(示范文本)第一部分投标邀请按照国务院《物业管理条例》《酒泉市物业管理条例》和《酒泉市物业管理招标 、 投标暂行办法》的规定,现决定对 务进行 (项目名称)的物业管理服(公开/邀请)招标。兹邀请合格投标人以密封标书的方式前来投标。一、招标项目的简要说明 本项目位于酒泉市 四至范围:东至 (或见附图) 。 本项目规划设计的物业类型为: 本项目总用地面积 米(其中公建用地 平方米。 本项目总建筑面积 米,地上总建筑面积 用房建筑面积 筑面积 平方米。其中地下总建筑面积 平方米( ...

转发文件格式

  关于转发文件的标题格式的规定在转发式公文标题的拟制中,时常遇到这样一种难以处 理的情况, 如<<xX 县政府关于转发 Xx 行署关于转发 XX 省政 府关于 XXX(事由)的通知的通知的通知>>。在这种标题中, 介词一“关于” ;动词一“转发” ;文种一“通知”反复在一 个标题内出现,令人不知所云。当遇到这种情况时,可采取 以下三种方法进行技术处理。 一是省略法。 一是省略法。当批转、转发、印发(颁发)原文标题中 已有“关于”一词时,新拟标题可省略介词“关于”和文种 “通 ...

投标文件格式

  第四章4.1 投标函格式投标文件格式投标函致: 成都双流国际机场股份有限公司 一、为对 年 月 日的《投标邀请书》表示响应,我们以下签字人 【投标人名称】 ,遵照招标文件的条款和条件,递交完全符合招标文件的关于成都双流国际 机场 T2 航站楼商业招商项目(餐饮类)得投标文件。 二、 我们确认, 我们已仔细阅读并研究了 年 月 日发布的招标文件, 以及于 年 月 日发布的补充通知书(若有) ,我们知道必须放弃对上述文件和资料的所有条款提出含糊不 清的问题的权利。 三、我们确认,我们将自行承担因参加 ...

资格预审文件格式

  广州南沙开发区灵新大道十二涌桥改造工程施工招标公告资格预审文件格式目录1广州南沙开发区灵新大道十二涌桥改造工程施工招标公告1、 资格预审审查表 2、 资格预审申请递交信 3、 投标单位一般情况表 4、 拟投入主要人员资历表 5、 人员履历表 6、 拟投入主要机械设备情况表 7、 近年在广州地区承建类似工程情况一览表 8、 在建工程情况一览表 9、 最新的企业资产负债表 10、 10、 资审材料原件核对表 11、 11、 投标通知书格式 12、 12、 投标复函格式 13、 13、 其它广州南沙开 ...

通知、通告类文件格式

  备 /TO : 忘录指示请 示报告MEMO字号:宋体五号(含下)由 /F RO M : 题 /S UB : 号 /N O : 报 /C /C : 送 /C /C : 签 发 / SI GN ER:通知工作联系加急酒店全体员工: 正文(字号:宋体小四号) #################################### ###################################### ###################################### #######. ...

08招标文件格式文本

  招标投标格式文本八江西省房屋建筑和市政基础设施工程施工招标招 标 文 件赣建 招字[ 招字[201 ]第 号招 标 项 目: 招 标 人: (章) (章) 电话:法定代表人: 联 系 人:编 制 时 间:江西省建设工程招标投标办公室印制 二 ○一 ○年34第一部分 招标文件专用要约条款(备案审查内容汇总) 备案审查内容汇总)条款号 条款名称 名称: 地址: 联系人: 电话: 名称: 地址: 联系人: 电话: 条款内容1.1.2招 标 人1.1.3招标代理机构1.1.4 1.1.5 1.1.6 1 ...

加强管理的通知(文件格式)

  渝商职院纪〔2010〕1 号★中共重庆商务职业学院纪律检查委员会 关于严格纪律、规范管理的通知院属各部门: 一度时期以来,少数教职工不思如何干好岗位工作,疏于学习提 高业务水平,常有利用上班时间从事与教育教学无关的活动,影响较 差。为严肃工作纪律,加强日常管理,特再次作出如下规定: 一、严禁上班时间在办公室利用校园网络从事炒股票、玩游戏、 闲聊等与教育教学无关的活动; 二、各部门负责人要组织员工学习《教职工出勤管理办法》 ,严 格按照制度规定加强日常管理,规范请假手续,禁止无原则、无纪律 的请假 ...

关于统一文件格式的通知

  关于统一文件格式的通知各处室、各部门: 为使我校文书档案做到格式规范、文体规范、文字规范,从即日起学校出台 统一格式要求,具体如下: 1、统一纸张 一般情况下使用 A4 纸,如有特殊情况可使用 A3 纸。(学校可定制印有“学 校全称+文件”或“学校全称”红色文字加下划线的两种文本用纸, 用于管理类文书 档案首页的打印。) 2、统一格式 (1)文章标题:黑体,三号,下空一行接正文,正副标题均居中; (2)正文一级标题:黑体,小四,序号请使用例“一、二、三……”的格式; (3)正文二级标题,宋体,小 ...

热门内容

小学班主任工作经验交流发言稿(请尊重版权,转载请注明)

  班主任工作经验交流发言稿莱西市北京路小学 聂琴 尊敬的各位领导、老师,大家好!今天,很荣幸能在这 里做交流,谈不上经验,只是把我的一些做法汇报一下。 在任班主任工作中,我认为: “一个合格的教师必须心 目中有人, 既要教学生读有字之书, 又要教学生读无字之书, 既要教学生知识,又要引导学生做人。 ” 一、班级管理要勤 勤劳是做好班主任工作的基础。 俗话说得好, 勤能补拙。 要勤到班级中去,勤到学生中去,勤与科任教师交流,勤督 促,勤记录。班主任经常到班里走走,也可以随便问问学生 昨晚或星期六、 ...

女生部十字绣比赛活动策划书

  女生部十字绣比赛活动策划书一、活动背景: 活动背景: 随着人民生活水平的不断提高, 大学生的课外生活是丰富多彩, 美化生活成为一种社会风尚, 个性消费越来越受到,尤其是受到年轻人的青睐,而十字绣是一项易学易懂的手艺,它能根 据个人兴趣,融入个性化风格,更能体现大学生张扬的个性。 活动内容: 二、活动内容: 有女生部主持,动员全校女生参与此次十字绣活动比赛,并从中选出一二三等奖,并对参赛 选手的作品进行展览,进行奖励,以激发同学们参与的积极性,丰富广大女生的课余生活。 三、活动目的: 体现当代女大 ...

三来一补与独资区别

  “三来一补”企业 三来一补”“三来一补”是指来料加工、来样加工、来件装配和补偿贸易。“三来一补”企业是由中国的企业法 人与外商签署合作合同,并以中方的名义办理注册登记。该工厂性质既非外商企业,也非内资法人企业, 形式上均属内资非法人企业。在经营方面,“三来一补”企业不允许内销,加工产品必须全部出口;在企 业管理方面,一般是由外商直接经营管理,成品交由外商出口或转厂销售,中方仅提供协作和必要的协助, 最终双方按议定的方式收取工缴费。 设立三来一补需提供数据 - 外方商业、注册登记证; - 外方法人 ...

长江村村支部创先争优汇报材料

  长江村党支部创先争优汇报材料 长江村党支部创先争优汇报材料(2010 年 11 月 2 日)尊敬的丘组长,各位领导: 大家早上好, 热烈欢迎各位领导莅临我村指导工 作, 我村于今年 7 月,按照县委和镇党委统一部署, 在村支部和党员中深入开展了创建先进基层党组织、 争当优秀共产党员活动。现就具体工作汇报如下: 一、基本情况 长江村位于梅坑镇西部,距离县城 25 公里,全 村共有 650 户,总人口 2846 人,其中贫困户 55 户, 是县委组织部扶贫开发“双到”工作挂扶点。全村共 有 19 个 ...

《防治煤与瓦斯突出规定》解析及瓦斯治理新技术

  办《防治煤与瓦斯突出规定》 解析及瓦斯 瓦斯治理 关 于 举 办《防治煤与瓦斯突出规定》解析及瓦斯治理 新技术培训班的 通 知 技术培训班的 培训班各有关单位: 为贯彻落实 《国务院办公厅关于进一步推进安全生产 “三项行动” 的通知》 (国办发〔2009〕32 号)《国务院安委会办公室关于印发安 、 全生产宣传教育行动实施方案的通知》 (安委办〔2009〕8 号)精神, 提高煤矿通风安全技术人员业务水平,加强煤矿安全技术和基础工 作,加强煤矿安全生产保障能力建设,扎实推动“安全生产年”活动 和“ ...