破解之PE文件译文(10)

社区服务
高级搜索
猴岛论坛电脑百科破解之PE文件译文(10)
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
4个回复

破解之PE文件译文(10)

楼层直达
不懂也不知道

ZxID:10586231

等级: 禁止发言

举报 只看楼主 使用道具 楼主   发表于: 2010-07-10 0
破解之PE文件译文(10)
最后一个关于输入目录的需要细讲的就是所谓的“新式”绑定(在参考书目[3]中讲述),它也可以由“绑定”工具来处理。当使用这种方式时,“时间日期戳”的所有位被置为1,并且没有中转链;此时所有输入符号的地址都将被补正,而不管它们是不是中转的。尽管如此,你还是需要知道DLL的版本,并且你还是需要将序数符号从中转符号中区分开来。为了达到这个目的,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT(绑定输入目录项)目录被创建了。就我所见,它将不被放在节中,而是被放在头中,处于节头之后第一节之前。(咳,这不是我的发明,我只是讲述它而已!)
这个目录告诉你,每一个已使用的DLL文件的中转输出是从哪些别的DLL文件中来的。
结构是IMAGE_BOUND_IMPORT_DESCRIPTOR(绑定输入描述结构)形式的,包括(按这个顺序):
一个32位数字,“时间戳”。
一个16位数字,“OffsetModuleName(模块名字偏移量)”,是从目录开头到以0结尾的DLL文件名的偏移量;
一个16位数字,“NumberOfModuleForwarderRefs(模块中转参考的数字)”,给出这个DLL文件为它的中转使用的DLL文件数。

紧随这个结构之后你会发现“NumberOfModuleForwarderRefs(模块中转参考的数字)”结构,告诉你这个DLL文件的中转所来自的DLL文件的名称和版本。这些结构就是“IMAGE_BOUND_FORWARDER_REF(绑定中转参考)”结构的:
一个32位的数字“时间日期戳”(TimeDateStamp);
一个16位的数字“模块名称偏移量”(OffsetModuleName),它就是从目录开头到中转来自的那个DLL文件的0结尾的名字处的偏移量;
一个16位的未使用单元。

跟在“IMAGE_BOUND_FORWARDER_REF(绑定中转参考)”后的是下一个“IMAGE_BOUND_IMPORT_DESCRIPTOR(绑定输入描述结构)”,以此类推;列表最终以一个全部为0位的IMAGE_BOUND_IMPORT_DESCRIPTOR(绑定输入描述结构)结束。


我对由此(描述)造成的不便表示歉意,但这就是它看起来的样子:-)


现在,如果你有一个新的绑定输入目录,你得载入所有的DLL文件,并使用目录指针IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT(绑定输入目录项)找到IMAGE_BOUND_IMPORT_DESCRIPTOR(绑定输入描述结构),扫描整个IMAGE_BOUND_IMPORT_DESCRIPTOR(绑定输入描述结构),并检查被载入的DLL文件的“时间日期戳”和这个目录中提供的是否相符。如果不符,就将输入目录中“第一换长”(FirstThunk)中的错误全部修改过来。


8.资源(resources)
-------------------
资源,比如对话框、菜单、图标等等,都存储在IMAGE_DIRECTORY_ENTRY_RESOURCE(“资源目录项”)指向的数据目录中。它们处于一个至少“IMAGE_SCN_CNT_INITIALIZED_DATA(已初始化数据内容节)”和“IMAGE_SCN_MEM_READ(内存可读节)”标志位都被置为1的节中。

资源的基础是“资源目录”(IMAGE_RESOURCE_DIRECTORY);它包含好几个“资源目录项”(IMAGE_RESOURCE_DIRECTORY_ENTRY),其中的每一项反过来又可能指向一个“资源目录”。按照这种方式,你就得到一个以“资源目录项”为树叶的“资源目录”树;它们的树叶指向实际的资源数据。

在实际使用中,情况会稍微简单些。一般你不会遇到不可能理清的特别复杂的树的。
通常,它的层次结构是这样的:一个目录作为根。它指向很多目录,每种资源类型都有一个。这些目录又指向子目录,每个子目录都有一个名字或者ID号并指向这个资源所提供的各种语言的目录;每种语言你都能找到一个资源项,资源项最终指向(具体的)数据。(注意:多语言资源不能在Win95上运行。即使程序有好几种语言,Win95也总是使用相同的资源----我没有查出是哪一种,但我猜测肯定是它最先碰到的那种。多语言资源在NT系统上可以运行。)

没有指针的树大致象这样:

                  ( 根 )
                    |
        +----------------+------------------+
        |          |            |
        菜单      对话框        图标
        |          |            |
    +-----+-----+    +-+----+      +-+----+----+
    |      |    |    |      |    |  |
  "main"    "popup"  0x10  "maindlg"  0x100 0x110 0x120
    |        |    |    |      |    |  |
  +---+-+      |    |    |      |    |  |
  |  |  default  english  default  def.  def. def.
german english

一个“资源目录项”(IMAGE_RESOURCE_DIRECTORY)包含:
32位未使用标志,叫做“特征”(Characteristics);
32位“时间日期戳”(同样按常用的time_t表示法),告诉你资源被创建的时间(如果此项被设置的话);
16位“主版本”(MajorVersion)和16位“最小版本”(MinorVersion),以允许你据此维护资源的几个版本;
16位“已命名项目数”(NumberOfNamedEntries)和另一个16位的“ID项目数”(NumberOfIdEntries)。

紧随此结构后的是“已命名项目数”+“ID项目数”两结构体,它们都是“资源目录项”格式,都以名字开头。它们可能指向下一个“资源目录”或者指向实际的资源数据。

一个“资源目录项”由下面组成:
32位单元提供你它所描述的资源的ID或者是目录;
32位的到数据的偏移量或者是到下一个子目录的偏移量。

ID的含义取决于树中的层次;ID可能是一个数字(如果最高位为0)也可能是一个名字(如果最高位为1)。如果是一个名字,它的低31位就是从资源节原始数据的开始到这个名字(名字有16位长并由unicode的宽字符而不是0结尾符作为结束)的偏移量。

如果你位于根目录之中,且如果ID是一个数字的话,那么它指的就是下面的一种资源类型:
  1: 光标
  2: 位图
  3: 图标
  4: 菜单
  5: 对话框
  6: 字串表
  7: 字体目录
  8: 字体
  9: 快捷键
  10: 未格式化资源数据
  11: 信息表
  12: 组光标
  14: 组图标
  16: 版本信息
任何其它数字都是用户自定义的。任何有类型名的资源类型也是用户自定义的。

如果你处于(树的)下一层当中,此时ID一定是一个数字,且就是资源的一个特例的语言ID号;例如,你可以(同时)拥有澳大利亚英语、加拿大法语和瑞士德语等本地化形式的对话框,并且它们分享同一个资源ID。系统会根据线程的地点来选择要使用的对话框,反过来地点又反映了用户的“区域设置”。(如果资源找不到线程地点,系统将先使用一个中性的子语言资源作为地点,比如它将寻找标准法语而不是用户所拥有的加拿大法语;如果它还是找不到,就使用最小语言ID号的那个实例。必须注意,所有这些只工作于NT系统之上的。)
为便于辨认语言ID,使用宏PRIMARYLANGID()(意为“主语言ID”)和SUBLANGID()(意为“子语言ID”)将它分开为主语言ID和子语言ID,分别使用它的0-9位和10-15位。这些值定义在“winresrc.h”文件中。
语言资源只支持快捷键、对话框、菜单、资源数据或字符串等;其它资源类型必须为LANG_NEUTRAL/SUBLANG_NEUTRAL(中性语言/中性子语言)。

要确定资源目录的下一层是不是另一个目录,你可查看它的偏移量的最高位。如果它是1,剩下的31位就是从资源节原始数据的开始到下一层目录的偏移量,还是按“资源目录”后接“资源目录项”的格式。如果高位为0,它就是从资源节原始数据的开始到资源的原始数据描述,即一个资源数据项的偏移量。资源的原始数据描述包含32位的“OffsetToData”(到数据的偏移量)(指的是到原始数据的偏移量,从资源节原始数据的开头算起),32位的数据的“Size”(大小),32位的“CodePage”(代码页)和一个未使用的32位单元。
(不鼓励使用代码页,你应该使用“语言”的特性来支持多地域。)
 
原始数据格式依赖于资源类型;详细的介绍可在微软的SDK文档中找到。注意:除了用户自定义资源,资源中的任何字符串总是按UNICODE格式,明显的,用户自定义的资源按的是开发者选定的格式。
本帖de评分: 1 条评分 DB +6
DB+6

感谢分享

┌.淫穆”

ZxID:10737016

等级: 上将
..

举报 只看该作者 沙发   发表于: 2010-07-10 0
感谢分享
溪空鹿隐林

ZxID:12131846

等级: 元老

举报 只看该作者 板凳   发表于: 2010-07-10 0
感谢分享
ㄣ若幹年後℡

ZxID:11138743

等级: 元帅
   还是这个头像好点
举报 只看该作者 地板   发表于: 2010-07-10 0
不错不错加油

这一下打的好爽。
ㄣ若幹年後℡

ZxID:11138743

等级: 元帅
   还是这个头像好点
举报 只看该作者 4楼  发表于: 2010-07-10 0
继续努力

这一下打的好爽。
« 返回列表
发帖 回复