当前位置:
文档之家› 第三讲 PE文件结构与计算机病毒
第三讲 PE文件结构与计算机病毒
IMAGE_FILE_HEADER STRUCT Machine WORD ? NumberOfSections WORD ? TimeDateStamp dd ? PointerToSymbolTable dd ? NumberOfSymbols dd ? SizeOfOptionalHeader WORD ? Characteristics WORD ? IMAGE_FILE_HEADER ENDS
Characteristics-节属性
0x00000020? 这个块包含代码。置位 0x00000040? 这个块包含已初始化的数据。 0x00000080? 这个块包含未初始化的数据(如 .bss 块) 0x00000200? 这个块包含注释或其它的信息。 0x00000800? 这个块的内容不应放进最终的EXE文件中。 0x02000000? 这个块可以被丢弃,因为一旦它被载入,其进程就 不需要它。最通常的可丢弃块是基本重定位块( .reloc )。 0x10000000? 这个块是可共享的。 0x20000000? 这个块是可执行的。 0x40000000? 这个块是可读的。 0x80000000? 这个块是可写的。
IMAGE_DATA_DIRECTORY VitualAddress DD? Size DD? IMAGE_DATA_DIRECTORY ENDS
3.4hello-2.5.exe的IAT与引入表
3.4节表
节表其实就是紧挨着 PE header 的一结 构数组。
该数组成员的数目由 File header (IMAGE_FILE_HEADER) 结构中 NumberOfSections 域的域值来决定。
节表结构又命名为 IMAGE_SECTION_HEADER。
结构中放的是一个节的信息,如名字、地 址、长度、属性等。
hello-2.5.exe的节表
IMAGE_SECTION_HEADER
typedef struct _IMAGE_SECTION_HEADER { UCHAR Name[8]; union { ULONG PhysicalAddress//OBJ中表示物理地址 ULONG VirtualSize; //在EXE中,它保存的实际尺寸 } Misc; ULONG VirtualAddress; //本节的相对虚拟地址 ULONG SizeOfRawData; //本节的经过文件对齐后的尺寸 ULONG PointerToRawData; ULONG PointerToRelocations; ULONG PointerToLinenumbers; USHORT NumberOfRelocations; USHORT NumberOfLinenumbers; ULONG Characteristics; //节属性 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
IMAGE_SECTION_HEADER
顺序 1 2 3 4 5 Name * PhysicalAddress或 VirtualSize Virtual Address * SizeOfRawData * PointerToRawData * 名字 大小 (字节) 8 4 4 4 4 节名 OBJ文件用作表示本节物理地址 EXE文件中表示节的真实尺寸 这个值+映像基地址=本节在内 存中的真正地址。OBJ中无意义。 本节的经过文件对齐后的尺寸 本节原始数据在文件中的位置 描述
Subsystem DataDirectory
DataDirectory数据目录
一个IMAGE_DATA_DIRECTORY数组,里面放 的是这个可执行文件的一些重要部分的RVA和尺 寸,目的是使可执行文件的装入更快,数组的项 数由上一个域给出。 IMAGE_DATA_DIRECTORY包含有两个域,如 下:
3.5.2 已初始化的数据节
这个节一般取名为.data或DATA 已初始化的数据节中放的是在编译时刻就已 确定的数据。如Hello World 中的字符串 “Hello World!”。
.data节
3.5.3 未初始化的数据节
3.5 节
“节(Section)”跟在节表 3.5.2已初始化的数据节 3.5.3未初始化的数据节 3.5.4引入函数节 3.5.5引出函数节 3.5.6资源节
3.5.1 代码节
代码节
代码节一般名为.text或CODE,该节含 有程序的可执行代码。 每个PE文件都有代码节
IMAGE_SECTION_HEADER
顺序 6 7 8 9 10 名字 PointerToRelocations PointerToLinenumbers NumberOfRelocations NumberOfLinenumbers Characteristics * 大小 (字节) 4 4 2 2 4 描述 OBJ中表示该节重定位信息的偏 移EXE文件中无意义 行号偏移 本节要重定位的数目 本节在行号表中的行号数目 节属性
LONG e_lfanew; //e_lfanew成员用于定位PE头。
该字段位于3CH处,该位置给出了PE文件头部的开始位置。 在本例中,PE文件头部开始位置为0B0H。
3.2.1MS-DOS MZ header
typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部 USHORT e_magic; // 魔数 USHORT e_cblp; // 文件最后页的字节数 USHORT e_cp; // 文件页数 USHORT e_crlc; // 重定义元素个数 USHORT e_cparhdr; // 头部尺寸,以段落为单位 USHORT e_minalloc; // 所需的最小附加段 USHORT e_maxalloc; // 所需的最大附加段 USHORT e_ss; // 初始的SS值(相对偏移量) USHORT e_sp; // 初始的SP值 USHORT e_csum; // 校验和 USHORT e_ip; // 初始的IP值 USHORT e_cs; // 初始的CS值(相对偏移量) USHORT e_lfarlc; // 重分配表文件地址 USHORT e_ovno; // 覆盖号 USHORT e_res[4]; // 保留字 USHORT e_oemid; // OEM标识符(相对e_oeminfo) USHORT e_oeminfo; // OEM信息 USHORT e_res2[10]; // 保留字 LONG e_lfanew; // 新exe头部的文件地址 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
3.3 PE header(P78)
Pe header 由三部分组成
字串 “PE\0\0”(Signature) 映像文件头(FileHeader) 可选映像头(OptionalHeader)
3.3.1 字串 “PE\0\0”
Signature 一dword类型,值为50h, 45h, 00h, 00h(PE\0\0)。 本域为PE标 记,我们可以此识别给定文件是否为有效PE 文件。
顺序 1 2 3 4 5 6 7 Machine *
名字
大小 (字节) 2 2 4 4 4 2 2
描述 机器类型,x86为14CH 文件中节的个数 生成该文件的时间 COFF符号表的偏移 符号数目 可选头的大小 关于文件信息的标记,比如文件是 exe还是dll
NumberOfSection ** TimeDataStamp PointerToSymbleTable NumberOfSymbols SizeOfOptionalHeader* Characteristics *
可选映像头中的一些关键字段1
名字 AddressOfEntryPoint * 描述 PE装载器准备运行的PE文件的第一个指令的 RVA。若要改变整个执行的流程,可以将该 值指定到新的RVA,这样新RVA处的指令首 先被执行。(病毒感染中通用关键字段) PE文件的优先装载地址。比如,如果该值是 400000h,PE装载器将尝试把文件装到虚拟 地址空间的400000h处。若该地址区域已被 其他模块占用,那PE装载器会选用其他空闲 地址。 内存中节对齐的粒度。 文件中节对齐的粒度。
ImageBase
SectionAlignment FileAlignment
可选映像头中的一些关键字段2
名字 描述 MajorSubsystemVersion win32子系统版本。若PE文件是专门为 Win32设计的,该子系统版本必定是4.0否则 MinorSubsystemVersion 对话框不会有3维立体感。 SizeOfImage SizeOfHeaders 内存中整个PE映像体的尺寸。 所有头+节表的大小,也就等于文件尺寸减去 文件中所有节的尺寸。可以以此值作为PE文 件第一节的文件偏移量。 NT用来识别PE文件属于哪个子系统。 一个IMAGE_DATA_DIRECTORY 结构数组。 每个结构给出一个重要数据结构的RVA,比 如引入地址表等。
《计算机病毒分析与对抗》第三讲
PE文件结构与计算机病毒
武汉大学计算机学院 彭国军 guojpeng@
引言
什么是PE文件? 了解PE文件结构和了解PE病毒原理有什么 联系?
课前我们应该思考的问题
计算机病毒如何将自身代码写到PE可执行文 件中并使得感染文件依然能够执行其功能? PE程序如何从其他DLL引入API函数? DLL文件如何使其他可执行文件知道自己实现 的各API函数的代码位置? 传统PE病毒是否可以直接调用API函数?为 什么?如何获取API函数?
几个常用术语
对齐
内存中节对齐的粒度 文件中节对齐的粒度
问题1:桶的容量为100升,现有367升水,请问 需要使用多少个桶? 问题2:代码节的代码实际长度为0x46字节,文件 中节对齐粒度为0x200,内存中节对齐粒度为 0x1000字节,请问代码节在文件和内存中分别占 用多少字节?