




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 内容nPE文件n相关术语nPE文件格式详解nWindows病毒原理1. PE文件nPE(Portable Executable)是Win32可执行文件的标准格式,如*.EXE、*.DLL、*.OCX等,都是PE格式n病毒籍EXE文件被执行时传播,Win32病毒感染文件时,基本上将EXE文件作为目标Win32病毒运行流程nWin32病毒运行流程病毒运行流程用户点击或系统自动运行HOST程序;装载HOST程序到内存;由PE文件的AddressOfEntryPoint加ImageBase之和,定位第一条语句的位置(程序入口);从第一条语句开始执行(其实是病毒代码);病毒主体代码执行完毕,将控
2、制权交给HOST程序原来的入口代码;HOST程序继续执行。问题计算机病毒怎会在HOST程序之前执行?2. 术语n文件偏移地址文件偏移地址(File offset)(File offset)PE文件存储在磁盘上,各数据段的地址称为文件偏移地址或物理地址(raw offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0不能映射的数据.reloc.data.textDOS头节表PE头.reloc.data.textDOS头节表PE头文件头文件尾磁盘中的PE文件映射到内存中文件偏移地址基地址(ImageBase)某一虚拟地址(VA)相对虚拟地址(RVA)术语(续)n入口点(入口点(Ent
3、ry pointEntry point)程序执行的第一行代码n基地址基地址(Image base)(Image base)p文件执行时将被映射到指定内存地址的存初始地址,由PE文件本身决定。默认,EXE:0 x00400000, DLL:0 x1000000。用链接程序的/BASE选项改变该值术语(续)n虚拟地址虚拟地址( (Virtual Address,VA)Virtual Address,VA)保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(VA),内存偏移地址(memory offset)n相对虚拟地址相对虚拟地址( (Relative Virtual AddressRelat
4、ive Virtual Address,RVARVA) ) 指内存中相对于PE文件装入地址(基地址)的偏移量 RVA=VA imagebase3. PE文件结构nPE文件总体层次结构MZ文 件 头 :DOS MZ HEADERDOS插 桩 程 序 :DOS StubIMAGE_SECTION_HEADERIMAGE_SECTION_HEADERIMAGE_SECTION_HEADERIMAGE_SECTION_HEADER.text.data.edata.reloc.COFF行 号COFF符 号 表Code View调 试 信 息PE文 件 标 志 :“ PE00”映 像 文 件 头 :IMA
5、GE_FILE_HEADER可 选 映 像 头 :IMAGE_OPTIONAL_HEADER32数 据 目 录 表 :IMAGE_DATA_DIRECTORYDOS头PE文 件 头节 表(Section Table)节(Section)调 试 信 息文 件 头文 件 尾3.1 DOS头与DOS插桩程序nDOS头与DOS插桩程序PE结构中紧随MZ文件头之后的DOS插桩程序(DOS Stub)IMAGE_DOS_HEADER结构识别一个合法的DOS头该结构的e_lfanew(偏移60,32bits)成员定位PE开始的标志0 x00004550(“PE00”)病毒通过“MZ”、“PE”这两个标志,初
6、步判断当前程序是否是目标文件PE文件。DOS头数据结构头数据结构typedef struct _IMAGE_DOS_HEADER typedef struct _IMAGE_DOS_HEADER / DOS的.EXE头部 USHORT e_magic; / 魔术数字 “MZ”MZ” USHORT e_cblp; / 文件最后页的字节数 USHORT e_cp; / 文件页数 USHORT e_crlc; / 重定义元素个数 USHORT e_cparhdr; / 头部尺寸,以段落为单位 USHORT e_minalloc; / 所需的最小附加段 USHORT e_maxalloc; / 所需的
7、最大附加段 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_res4; / 保留字 USHORT e_oemid; / OEM标识符(相对e_oeminfo) USHORT e_oeminfo; / OEM信息 USHORT e_res210; / 保留字 LONG e_lfanew;
8、 / LONG e_lfanew; / 新新EXEEXE头部的文件地址头部的文件地址 003c003c IMAGE_DOS_HEADER, IMAGE_DOS_HEADER, * *PIMAGE_DOS_HEADER;PIMAGE_DOS_HEADER;PE文件加载流程Major steps in loading a PE file into memory:nWhen the PE file is run, the PE loader examines the DOS MZ header for the offset of the PE header. If found, it skips t
9、o the PE header. nThe PE loader checks if the PE header is valid. If so, it goes to the end of the PE header. nImmediately following the PE header is the section table. The PE header reads information about the sections and maps those sections into memory using file mapping. It also gives each secti
10、on the attributes as specified in the section table. nAfter the PE file is mapped into memory, the PE loader concerns itself with the logical parts of the PE file, such as the import table. 3.2 PE文件头nPE文件头紧接着DOS Stub的是PE headerPE header是IMAGE_NT_HEADERS的简称,即NT映像头(PE文件头),存放PE整个文件信息分布的重要字段,包含了许多PE装载器用
11、到的重要域。执行体在支持PE文件结构的操作系统中执行时PE装载器将从DOS MZ header中找到PE header的起始偏移量,从而跳过DOS Stub直接定位到真正的文件头PE headerPE文件头(续)nPE文件头结构字符串“PE00”(Signature)(4H字节) IMAGE_NT_HEADERS STRUCT Signature dd ? FileHeader IMAGE_FILE_HEADER OptionalHeader IMAGE_OPTIONAL_HEADER32 IMAGE_NT_HEADERS ENDSPE文件头-映像文件头映像文件头,包含有PE文件的基本信息ty
12、pedef struct _IMAGE_FILE_HEADER typedef struct _IMAGE_FILE_HEADER WORD Machine; / 0 x04,该程序要执行的环境及平台 WORD NumberOfSections;WORD NumberOfSections; / 0 x06/ 0 x06,文件中节的个数,文件中节的个数 DWORD TimeDateStamp; / 0 x08,文件建立的时间 DWORD PointerToSymbolTable; / 0 x0c,COFF符号表的偏移 DWORD NumberOfSymbols; / 0 x10,符号数目 WOR
13、D SizeOfOptionalHeader;WORD SizeOfOptionalHeader; / 0 x14/ 0 x14,可选头的长度可选头的长度 WORD Characteristics; / 0 x16,标志集合 IMAGE_FILE_HEADER, IMAGE_FILE_HEADER, * *PIMAGE_FILE_HEADER;PIMAGE_FILE_HEADER;PE文件头-可选映像头n可选映像头typedef struct _IMAGE_OPTIONAL_HEADER / 标准域: WORD Magic; / 0 x18,一般是0 x010B BYTE MajorLinke
14、rVersion; / 0 x1a,链接器的主/次版本号, BYTE MinorLinkerVersion; / 0 x1b,这两个值都不可靠 DWORD SizeOfCode; / 0 x1c,可执行代码的长度 DWORD SizeOfInitializedData; / 0 x20,初始化数据的长度(数据节) DWORD SizeOfUninitializedData; / 0 x24,未初始化数据的长度(bss节) DWORD AddressOfEntryPoint;DWORD AddressOfEntryPoint; / 0 x28/ 0 x28,代码的入口代码的入口RVARVA地址地
15、址 DWORD BaseOfCode; / 0 x2c,可执行代码起始位置,意义不大 DWORD BaseOfData; / 0 x30,初始化数据起始位置,意义不大 / NT 附加域: DWORD ImageBase; DWORD ImageBase; / 0 x34/ 0 x34,载入程序首选的,载入程序首选的RVARVA地址地址 DWORD SectionAlignment;DWORD SectionAlignment; / 0 x38/ 0 x38,加载后节在内存中的对齐方式,加载后节在内存中的对齐方式 DWORD FileAlignment;DWORD FileAlignment;
16、/ 0 x3c/ 0 x3c,节节在文件中的在文件中的对齐对齐方式方式(待续)PE文件头-可选映像头(续续) WORD MajorOperatingSystemVersion; / 0 x3e,操作系统主/次版本, WORD MinorOperatingSystemVersion; / 0 x40,Loader并没有用这两个值 WORD MajorImageVersion; / 0 x42,可执行文件主/次版本 WORD MinorImageVersion; / 0 x44 WORD MajorSubsystemVersion; / 0 x46,子系统版本号 WORD MinorSubsyst
17、emVersion; / 0 x48 DWORD Win32VersionValue; / 0 x4c,Win32版本,一般是0 DWORD SizeOfImage;DWORD SizeOfImage; / 0 x50/ 0 x50,程序调入后占用内存大小程序调入后占用内存大小( (字节字节) ) DWORD SizeOfHeaders;DWORD SizeOfHeaders; / 0 x54/ 0 x54,文件头的长度之和文件头的长度之和 DWORD CheckSum; / 0 x58,校验和 WORD Subsystem; / 0 x5c,可执行文件的子系统 WORD DllCharact
18、eristics; / 0 x5e,何时DllMain被调用,一般为0 DWORD SizeOfStackReserve; / 0 x60,初始化线程时保留的堆栈大小 DWORD SizeOfStackCommit; / 0 x64,初始化线程时提交的堆栈大小 DWORD SizeOfHeapReserve; / 0 x68,进程初始化时保留的堆大小 DWORD SizeOfHeapCommit; / 0 x6c,进程初始化时提交的堆大小 DWORD LoaderFlags; / 0 x70,装载标志,与调试相关 DWORD NumberOfRvaAndSizes; / 0 x74,数据目录的
19、项数,一般是16 IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES;IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES; IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;PE文件头节表n节通过节表实现索引n节的内容是要真正执行的程序和相关数据n病毒要在PE文件中增加病毒代码节或把病毒插入一个现有节时,需修改节表n节表是紧挨着NT映像头的一结构数组,其成员的数目NumberOfSecti
20、ons决定PE文件头节表元素define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER UCHAR NameIMAGE_SIZEOF_SHORT_NAME; / 节名 union ULONG PhysicalAddress; / OBJ文件中表示本节物理地址 ULONG VirtualSize; / EXE文件中表示节的实际字节数 Misc; ULONG VirtualAddress; / 本节的RVA ULONG SizeOfRawData; / 本节经过文件对齐后的尺寸 ULONG PointerToRawDat
21、a; / 本节原始数据在文件中的位置 ULONG PointerToRelocations; / OBJ文件中表示本节重定位信 / 息的偏移,EXE文件中无意义 ULONG PointerToLinenumbers; / 行号偏移 USHORT NumberOfRelocations; / 本节需重定位的数目 USHORT NumberOfLinenumbers; / 本节在行号表中的行号数目 ULONG Characteristics; / 节属性 IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;PE文件-节n代码节属性一般是 “可执行”、“可读”和
22、“节中包含代码”n数据节属性一般是 “可读”、“可写”和“包含已初始化数据” n病毒在添加新节时,将新添加的节属性设置为可读、可写、可执行PE文件格节PE文件格节n节PE文件的程序内容划分成块,称之为Section(节),每个节是一块拥有共同属性,如代码/数据、读/写等。节名称仅是区别不同节的符号而已,类似“data”、“code”的命名,其属性设置决定节的特性和功能PE文件节n典型地拥有9个预定义节 .text、.bss、.rdata、.data、.rsrc、 .edata、 .idata、 .pdata和.debug可执行代码节:可执行代码节:.text .text 数据节:.bss、.r
23、data、.data资源节:.rsrc引出函数节:引出函数节:.edata.edata引入函数节:引入函数节:.idata.idataPE文件节n代码节.textWindows NT默认地将所有可执行代码组成了一个单独的节,名为“.text”或“.code”.text节也包含了数据目录表中提到过的入口点IAT亦存在于.text节中模块入口点之前。IAT是一系列的跳转指令PE文件节n引入函数节.idata从其它DLL中引入的函数该节开始为IMAGE_IMPORT_DESCRIPTOR结构的结构数组,即引入表,数据目录表表项结构成员VirtualAddress包含引入表地址引入函数节可能被病毒用来
24、直接获取API函数地址PE文件节nIMAGE_IMPORT_DESCRIPTOR的结构如下:typedef struct _IMAGE_IMPORT_DESCRIPTOR typedef struct _IMAGE_IMPORT_DESCRIPTOR union DWORD Characteristics;DWORD OriginalFirstThunk; /IMAGE_THUNK_DATADWORD OriginalFirstThunk; /IMAGE_THUNK_DATA数组的指针数组的指针;DWORD TimeDateStamp; /文件建立时间DWORD ForwarderChain;
25、 /一般为0DWORD Name; /DLL名字的指针DWORD FirstThunk; /DWORD FirstThunk; /通常也是通常也是IMAGE_THUNK_DATAIMAGE_THUNK_DATA数组的指针数组的指针 IMAGE_IMPORT_DESCRIPTOR; ;PE文件节n引出函数节.edata本文件向其它程序提供的可调用函数列表一般用在DLL中,EXE文件很少使用当PE装载器执行一个程序,它将相关DLL都装入该进程的地址空间,然后根据主程序的引入函数信息,查找相关DLL中的真实函数地址来修正主程序PE文件节nIMAGE_EXPORT_DIRECTORY结构typedef
26、 struct _IMAGE_EXPORT_DIRECTORY typedef struct _IMAGE_EXPORT_DIRECTORY DWORD Characteristics; / 一般为0 DWORD TimeDateStamp; / 文件生成时间 WORD MajorVersion; / 主版本号 WORD MinorVersion; / 次版本号 DWORD Name; / 指向DLL的名字 DWORD Base; / 基数,加上序数就是函数地址数组的索引值 DWORD NumberOfFunctions; / AddressOfFunctions数组的项数 DWORD Num
27、berOfNames; / AddressOfNames数组的项数 DWORD AddressOfFunctions; / RVA from base of image DWORD AddressOfNames; / RVA from base of image DWORD AddressOfNameOrdinals; / RVA from base of image IMAGE_EXPORT_DIRECTORY, IMAGE_EXPORT_DIRECTORY, * *PIMAGE_EXPORT_DIRECTORY;PIMAGE_EXPORT_DIRECTORY;PE文件节nDLL/EXE要引
28、出一个函数给其它DLL/EXE使用,可通过函数名引出序号引出PE文件格式应用已知导出函数名,获取函数地址步骤:n定位到PE headern从数据目录表读取导出表的虚拟地址n 定位导出表获取名字数目(NumberOfNames)PE文件格式应用n并行遍历AddressOfNames和AddressOfNameOrdinals指向的数组匹配名字,如果在AddressOfNames指向的数组中找到匹配名字,从AddressOfNameOrdinals指向的数组中提取索引值,例如,若发现匹配名字的RVA存放在AddressOfNames的第6个元素,那就提取AddressOfNameOrdinals数
29、组的第6个元素作为索引值。如果遍历完NumberOfNames个元素,说明当前模块没有所要的名字PE文件格式应用n从AddressOfNameOrdinals数组提取的数值作为AddressOfFunctions数组的索引。即如果值是5,就必须读取AddressOfFunctions数组的第5个元素,此值就是所要函数的RVAPE文件格式应用已知函数的序数,获取函数地址步骤:n定位到PE headern从数据目录表读取导出表的虚拟地址n定位导出表获取Base值n减掉Base值得到指向AddressOfFunctions数组的索引n将该值与NumberOfFunctions做比较,大于等于后者则序
30、数无效n通过上面的索引就可以获取AddressOfFunctions数组中的RVA4.Win32 PE4.Win32 PE病毒的基本原理病毒的基本原理nPE病毒基本功能重定位截获API函数地址搜索感染目标文件内存文件映射实施感染Win32 PEWin32 PE病毒的基本原理病毒的基本原理n重定位原因重定位原因病毒不可避免要用到变量(常量),病毒感染HOST程序,其依附到HOST程序中的位置不同,病毒随着HOST载入内存后,病毒中的各个变量(常量)在内存中的位置也要随着发生变化n病毒重定位方法病毒重定位方法call delta ;执行后,堆栈顶端为delta在内存中的真正地址delta: pop
31、 ebp ;该语句将delta在内存中的真正地址存放在ebp寄存器中 lea eax,ebp + (offset var1-offset delta) ;此时eax中存放着var1在内存中的真实地址Win32 PE病毒的基本原理n为什么要获取API函数地址Win32 PE病毒需要调用API函数实现某些功能,但是Win32 PE病毒只有代码节,并不存在引入函数节病毒无法直接调用相关API函数,需先找出这些API函数在相应DLL中的地址Win32 PE病毒的基本原理n获取API函数地址首先获取KERNEL32的基地址n获取KERNEL32基地址的方法对相应操作系统分别给出固定的Kernel32模块
32、的基地址对于同一版本的Windows操作系统,Kernel32模块的地址是固定的,甚至一些API函数的大概位置都是固定的n利用程序的返回地址,在其附近搜索Kernel32模块基地址Win32 PE病毒的基本原理 mov ecx,esp ;将堆栈顶端的数据(返回Kernel32的地址)赋给ecx xor edx,edxgetK32Base: dec ecx ;逐字节比较验证,也可以一页一页地搜 mov dx,word ptr ecx+IMAGE_DOS_HEADER.e_lfanew ;就是ecx+3ch test dx,0f000h ;Dos Header+stub不可能太大,超过4096by
33、te jnz getK32Base ;加速检验 cmp ecx, dword ptr ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase jnz getK32Base ;看Image_Base值是否等于ecx即模块起始值 mov ebp+offset k32Base,ecx ;如果是,就认为是找到了kernel32的Base值 Win32 PE病毒的基本原理n获取API函数地址在得到了Kernel32的模块地址以后,就可以在该模块中搜索所需要的API地址对于给定的API,搜索其地址可以直接通过Kernel32.dll的引出表信息搜索,同样我们也可
34、以先搜索出GetProcAddress和LoadLibrary两个API函数的地址,然后利用这两个API函数得到所需要的API函数地址Win32 PE病毒的基本原理n搜索文件是病毒寻找目标文件重要手段n在Win32中,用如下API函数进行文件搜索FindFirstFile根据文件名查找文件FindNextFile根据调用FindFirstFile函数时指定的一个文件名查找下一个文件FindClose用来关闭由FindFirstFile函数创建的一个搜索句柄Win32 PE病毒的基本原理WIN32_FIND_DATA STRUCT dwFileAttributes DWORD ? /文件属性,
35、/如果该值为FILE_ATTRIBUTE_DIRECTORY,则说明是目录 ftCreationTime FILETIME /文件创建时间 ftLastAccessTime FILETIME /文件或目录的访问时间 ftLastWriteTime FILETIME /文件最后一次修改时间,对于目录是创建时间 nFileSizeHigh DWORD ? /文件大小的高位 nFileSizeLow DWORD ? /文件大小的地位 dwReserved0 DWORD ? /保留 dwReserved1 DWORD ? /保留 cFileName BYTE MAX_PATH dup(?) /文件名字
36、符串,以0结尾 cAlternate BYTE 14 dup(?) /8.3格式的文件名WIN32_FIND_DATA ENDSWin32 PE病毒的基本原理n文件搜索算法采用递归算法进行搜索,也可以采用非递归搜索方法FindFile ProcFindFile Proc指定找到的目录为当前工作目录开始搜索文件(*.*)该目录搜索完毕?是则返回,否则继续找到文件还是目录?是目录则调用自身函数FindFile,否则继续是文件,如符合感染条件,则调用感染模块,否则继续搜索下一个文件(FindNextFile),转到继续FindFile EndpFindFile EndpWin32 PE病毒的基本原理
37、n内存映射文件内存映射文件内存映射文件提供一组独立函数,使应用程序能够通过内存指针访问磁盘上的文件这组内存映射文件函数将磁盘上的文件的全部或者部分映射到进程虚拟地址空间的某个位置,以后对文件内容的访问就如同在该地址区域内直接对内存访问一样简单对文件中数据的操作便是直接对内存进行操作,提高访问速度,这对于计算机病毒减少资源占用是非常重要Win32 PE病毒的基本原理n使用内存映射文件读写文件步骤调用CreateFileCreateFile函数打开HOST程序,返回文件句柄hFile调用CreateFileMappingCreateFileMapping函数生成基于HOST文件句柄hFile的内存
38、映射对象,返回内存映射对象句柄hMapWin32 PE病毒的基本原理调用MapViewOfFile函数将整个文件(一般还要加上病毒体的大小)映射到内存中。得到指向映射到内存的第一个字节的指针(pMem)用所得到的指针pMem对整个HOST文件进行操作,对HOST程序进行病毒感染Win32 PE病毒的基本原理调用UnMapViewFile函数解除文件映射,传入参数是pMem调用CloseHandle来关闭内存映射文件,传入参数是hMap调用CloseHandle来关闭HOST文件,传入参数是hFileWin32 PE病毒的基本原理n几个内存映射函数CreateFileMapping该函数用来创建
39、一个新的文件映射对象 MapViewOfFile 该函数将一个文件映射对象映射到当前应用程序的地址空间 UnMapViewOfFile 该函数在当前应用程序的内存地址空间解除对一个文件映射对象的映射 CloseHandle 该函数用来关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和同步对象等Win32 PE病毒的基本原理n病毒感染PE文件的基本步骤(1)判断目标文件开始的两个字节是否为“MZ”;(2)判断PE文件标记“PE”;(3)判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续;Win32 PE病毒的基本原理(4)获得Directory(数据目录)的个数,每个数据目录信息占8个字节;(5)得到节表起始位置:Directory的偏移地址+数据目录占用的字节数=节表起始位置;(6)得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节):节表起始位置+节的个数(每个节表占用的字节数28H)=目前最后节表的末尾偏移Win32
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国休闲椅行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国三级电缆行业市场发展趋势与前景展望战略研究报告
- 二年级语文课外活动计划
- 2025企业人力资源战略规划及实施计划
- 小学一年级数学下册分层教学计划
- 高一数学学科教学计划
- 我国的教育制度
- 会计基础档案规范解读
- 一体化防水施工合同
- 商品质量检验合同(2篇)
- 《质量方针与目标》课件
- 幼儿教师一日活动各环节站位
- 服务器设备到货验收单
- 服务器系统故障演练流程
- 高中生创新能力大赛历史类往年试题
- 政策目标确立和方案制定概述
- 2023年陕西西安体育学院考研英语练习题100道(附答案解析)
- 合同管理法律法规学习制度
- 模具主管个人简历
- 吉利收购沃尔沃案例文化维度分析
- 110千伏线路工程施工组织设计方案
评论
0/150
提交评论