PE结构_01
2016-06-08 10:45
351 查看
ZC: 主要是 非代码的 分析结构
1、
1.1、DosHeader: PE从偏移0开始就是
1.2、NtHeader: 位于 紧接着DosHeader的后面(具体位置为: DosHeader的偏移[0] + DosHeader.e_lfanew)
1.2.1、NtFileHeader: NtHeader.FileHeader
1.2.2、NtOptionalHeader: NtHeader.OptionalHeader
1.3、DataDirectory: NtOptionalHeader.DataDirectory
2、
每次加载exe的基址是否是随机的:(WORD)IMAGE_FILE_HEADER.Characteristics;
IMAGE_FILE_RELOCS_STRIPPED ==> 0x0001
3、IAT 在哪里?
结构体IMAGE_OPTIONAL_HEADER32的最后一个成员:IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
数组的索引为 IMAGE_DIRECTORY_ENTRY_IAT
4、exe 入口点:
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint
100、
100.1、代码:
100.2、控制台输出:
101、
101.1、VC6中 WINNT.H
102、
1、
1.1、DosHeader: PE从偏移0开始就是
1.2、NtHeader: 位于 紧接着DosHeader的后面(具体位置为: DosHeader的偏移[0] + DosHeader.e_lfanew)
1.2.1、NtFileHeader: NtHeader.FileHeader
1.2.2、NtOptionalHeader: NtHeader.OptionalHeader
1.3、DataDirectory: NtOptionalHeader.DataDirectory
2、
每次加载exe的基址是否是随机的:(WORD)IMAGE_FILE_HEADER.Characteristics;
IMAGE_FILE_RELOCS_STRIPPED ==> 0x0001
if (IMAGE_FILE_HEADER.Characteristics & IMAGE_FILE_RELOCS_STRIPPED != 0) exe固定基址 else exe随机基址
3、IAT 在哪里?
结构体IMAGE_OPTIONAL_HEADER32的最后一个成员:IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
数组的索引为 IMAGE_DIRECTORY_ENTRY_IAT
4、exe 入口点:
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint
100、
100.1、代码:
#include <stddef.h> #include <stdio.h> #include <windows.h> void main() { printf("结构体的大小 :\n"); printf("sizeof(IMAGE_DOS_HEADER) : %d [0x%X]\n", sizeof(IMAGE_DOS_HEADER), sizeof(IMAGE_DOS_HEADER)); printf("sizeof(IMAGE_NT_HEADERS32) : %d [0x%X]\n", sizeof(IMAGE_NT_HEADERS32), sizeof(IMAGE_NT_HEADERS32)); printf("sizeof(IMAGE_FILE_HEADER) : %d [0x%X]\n", sizeof(IMAGE_FILE_HEADER), sizeof(IMAGE_FILE_HEADER)); printf("sizeof(IMAGE_OPTIONAL_HEADER32) : %d [0x%X]\n", sizeof(IMAGE_OPTIONAL_HEADER32), sizeof(IMAGE_OPTIONAL_HEADER32)); printf("sizeof(IMAGE_DATA_DIRECTORY) : %d [0x%X]\n", sizeof(IMAGE_DATA_DIRECTORY), sizeof(IMAGE_DATA_DIRECTORY)); printf("\n"); printf("成员在结构体中的偏移 :\n"); size_t iOffset = offsetof(IMAGE_DOS_HEADER, e_lfanew); printf("IMAGE_DOS_HEADER.e_lfanew 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_NT_HEADERS32, FileHeader); printf("IMAGE_NT_HEADERS32.FileHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_NT_HEADERS32, OptionalHeader); printf("IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory); printf("IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint); printf("IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : %d [0x%X]\n", iOffset, iOffset); //IMAGE_NT_OPTIONAL_HDR_MAGIC }
100.2、控制台输出:
结构体的大小 : sizeof(IMAGE_DOS_HEADER) : 64 [0x40] sizeof(IMAGE_NT_HEADERS32) : 248 [0xF8] sizeof(IMAGE_FILE_HEADER) : 20 [0x14] sizeof(IMAGE_OPTIONAL_HEADER32) : 224 [0xE0] sizeof(IMAGE_DATA_DIRECTORY) : 8 [0x8] 成员在结构体中的偏移 : IMAGE_DOS_HEADER.e_lfanew 偏移为 : 60 [0x3C] IMAGE_NT_HEADERS32.FileHeader 偏移为 : 4 [0x4] IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : 24 [0x18] IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : 96 [0x60] IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : 16 [0x10] Press any key to continue
101、
101.1、VC6中 WINNT.H
// Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
102、
相关文章推荐
- PHP基础
- __get __set
- highcharts图表
- Modelica学习
- JS Date的使用例子。
- ubuntu/win双系统无法挂载NTFS分区问题
- Maven最佳实践:Maven仓库 - 续
- Data Stream as Disjoint Interval | leetcode
- Android中自定义View,自定义布局
- Fuel快速安装开源openstack的实践
- 【leetcode】231. Power of Two
- CSS选择器及CSS样式表
- h5在线状态监测
- Net平台下的B/S开发框架
- 一篇登录框的代码
- linux 设置默认网关与网卡ip不同网段
- Linux中zip压缩和unzip解压缩命令详解
- 依赖z-index值创建层叠上下文
- 在博客中用latex写公式
- TCP的连接(三次握手)和释放(四次挥手)