qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2013年1月11日

摘要: ①:IMAGE_DOS_HEADER STRUCT 【M_DOS头部 共64字节】{ +00 h WORD e_magic // DOS可执行文件标记 MZ(4Dh 5Ah) +02 h WORD e_cblp ; Bytes on last page of file +04 h WORD e_cp ; Pages in file +06 h WORD e_crlc ; Relocations +08 h WORD e_cparhdr ; Size of header in paragraphs +0A h WORD e_minalloc ; M... 阅读全文
posted @ 2013-01-11 23:19 qintangtao 阅读(1127) 评论(0) 推荐(1) 编辑

摘要: Windows 将程序的各种界面定义为资源,包括加速键(Accelerator)、位图(Bitmap)、光标(Cursor)、对话框(Dialog Box)、图标(Icon)、菜单(Menu)、串表(String Table)、工具栏(Toolbar)和版本信息(Version Information)等。资源有很多种类型,每种类型的资源中可能存在多个资源项,这些资源项用不同的ID 或者名称来区分。但是要将这么多种类型的不同ID 的资源有序地组织起来是一件非常痛苦的事情,因此,我们采取类似于磁盘目录结构的方式保存。PE 文件中的资源是按照 资源类型 -> 资源ID -> 资源代码页 阅读全文
posted @ 2013-01-11 23:13 qintangtao 阅读(4988) 评论(1) 推荐(1) 编辑

摘要: 什么是基址重定位?答:重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你霸占,你必须转移到别的地址,这就需要基址重定位但凡涉及到直接寻址的指令都需要进行重定位处理!IMAGE_BASE_RELOCATION STRUC 【基址重定位位于数据目录表的第六项,共8+N字节】{+00 h DWORD VirtualAddress ;重定位数据开始的RVA 地址+04 h DWORD SizeOfBlock ;重定位块得长度,标识重定向字段个数+08 h WORD TypeOffset ;重定项位数组相对虚拟RVA,个数动态分配};IMAGE_BASE_RELOCAT 阅读全文
posted @ 2013-01-11 23:12 qintangtao 阅读(3237) 评论(0) 推荐(0) 编辑

摘要: 当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导入表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一并装入地址空间,再根据DLL 文件中的函数导出信息对被执行文件的IAT 进行修正。导出表就是记载着动态链接库的一些导出信息。通过导出表,DLL 文件可以向系统提供导出函数的名称、序号和入口地址等信息,比便Windows 加载器通过这些信息来完成动态连接的整个过程。注意:扩展名为.exe 的PE 文件中一般不存在导出表,而大部分的.dll 文件中都包含导出表。但注意,这并不是绝对的。例如纯粹用作资源的.dll 文件就不需要导出函数啦,另外有些特殊功能的 阅读全文
posted @ 2013-01-11 23:11 qintangtao 阅读(4101) 评论(0) 推荐(2) 编辑

摘要: 输入表结构 在 PE文件头的 IMAGE_OPTIONAL_HEADER 结构中的 DataDirectory(数据目录表) 的第二个成员就是指向输入表的。而输入表是以一个 IMAGE_IMPORT_DESCRIPTOR(简称IID) 的数组开始。每个被 PE文件链接进来的 DLL文件都分别对应一个 IID数组结构。在这个 IID数组中,并没有指出有多少个项(就是没有明确指明有多少个链接文件),但它最后是以一个全为NULL(0) 的 IID 作为结束的标志。 IMAGE_IMPORT_DESCRIPTOR 结构定义如下: IMAGE_IMPORT_DESCRIPTOR STRUC... 阅读全文
posted @ 2013-01-11 23:10 qintangtao 阅读(2018) 评论(0) 推荐(0) 编辑

摘要: 首先,我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块。这里我们需要注意的问题是:一个区块中的数 据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。例如输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为他们的属性都是可 读不可写的。 其次,由于不同用途的数据有可能被放入同一个区块中,因此仅仅依靠区块表是无法确定和定位的。那要怎么办?对了,PE 文件头中 IMAGE_OPTIONAL_DEADER32 结构的数据目录表来指出他们的位置,我们可以由数据目录表来定位的数据包括输入表、输出表、资源、重定位... 阅读全文
posted @ 2013-01-11 23:09 qintangtao 阅读(2544) 评论(0) 推荐(0) 编辑

摘要: 通常,区块中的数据在逻辑上是关联的。PE 文件一般至少都会有两个区块:一个是代码块,另一个是数据块。每一个区块都需要有一个截然不同的名字,这个名字主要是用来表达区块的用途。例如有一个区块 叫.rdata,表明他是一个只读区块。注意:区块在映像中是按起始地址(RVA)来排列的,而不是按字母表顺序。另外,使用区块名字只是人们为了认识和编程的方便,而对操作系统来说这些是无关紧要的。微软给这些区块取了个有特色的名字,但这不是必须的。当编程从PE 文件中读取需要的内容时,如输入表、输出表,不能以区块名字作为参考,正确的方法是按照数据目录表中的字段来进行定位。各种区块的描述:区块一般是从OBJ 文件开始, 阅读全文
posted @ 2013-01-11 23:08 qintangtao 阅读(5689) 评论(0) 推荐(0) 编辑

摘要: 节表(区块表):PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。全部有效结构的最后以一个空的IMAGE_SECTION_HEADER结构作为结束,所以节表中总的IMAGE_SECTION_HEADER结构数量等于节的数量加一。节表总是被存放在紧接在PE文件头的地方。另外,节表中 IMAGE_SECTION_HEADER 结构的总数总是由PE文件头 IMAGE_NT_HEADERS 结构中的 FileHeader.NumberOfSections 字段来指定 阅读全文
posted @ 2013-01-11 23:07 qintangtao 阅读(5775) 评论(0) 推荐(0) 编辑

摘要: MAGE_NT_HEADERS STRUCT结构体包含了两个子结构体typedef struct _IMAGE_NT_HEADERS { +00h DWORD Signature +04h IMAGE_FILE_HEADER FileHeader +18h IMAGE_OPTIONAL_HEADER32 OptionalHeader } IMAGE_NT_HEADERS ENDS, *PIMAGE_NT_HEADERS32;1.Signature 字段:在一个有效的 PE 文件里,Signature 字段被设置为00004550h, ASCII 码字符是“PE00”。标志这 PE 文件头的开始 阅读全文
posted @ 2013-01-11 23:06 qintangtao 阅读(2481) 评论(0) 推荐(0) 编辑

摘要: 1.M_DOS头部结构体:IMAGE_DOS_HEADER STRUCT { +00h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 +02h WORD e_cblp // Bytes on last page of file +04h WORD e_cp // Pages in file +06h WORD e_crlc // Relocations +08h WORD e_cparhdr // Size of header in paragraphs +0ah WORD e_minalloc // Minimun ex 阅读全文
posted @ 2013-01-11 23:05 qintangtao 阅读(1677) 评论(1) 推荐(1) 编辑