ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:522.72KB ,
资源ID:22265318      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22265318.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PE文件格式分析及修改Word下载.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

PE文件格式分析及修改Word下载.docx

1、在Section Table后,Section数目的多少是不定的。二、程序的装入当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE

2、 Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。三、PE格式高级分析下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。图4 PE文件开始的磁盘数据在文件的一开始有两位16进制数据4D 5A,其对应的ASCII字符是MZ,这个标志就是DOS MZ H

3、eader 的标志。下面是通过Load PE列出 的DOS MZ Header1. DOS Header数据结构名称值e_magic:0x5A4D-MZe_cblp:0x0090e_cp:0x0003e_crlc:0x0000e_cparhdr:0x0004e_minalloc:e_maxalloc:0xFFFFe_ss:e_sp:0x00B8e_csum:e_ip:e_cs:e_lfarlc:0x0040e_ovno:e_res:0x0000000000000000e_oemid:e_oeminfo:e_res2:0x0000000000000000000000000000000000000

4、000e_lfanew:0x000000F8这是一个PE文件的DOS Header,其中我们最关心的就是e_lfanew这个字段的值,它指向了PE Header 在磁盘文件中相对于文件开始的偏移地址,这里是F8。在本文件00F8h处果然找到了“PE”两个字符,那么在00F8h处就是PE Header 的有效头载荷。2. PE Header我们可以在winnt.h这个文件中找到关于PE文件头的定义:typedef struct _IMAGE_NT_HEADERSDWORD Signature;/PE文件头标志:PE00。在开始DOS header的偏移3CH(e_lfanew)处所指向的地址开始

5、IMAGE_FILE_HEADER FileHeader;/PE文件物理分布的信息IMAGE_OPTIONAL_HEADER32 OptionalHeader;/PE文件逻辑分布的信息 IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;2.1 IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADERtypedef struct _IMAGE_FILE_HEADERWORD Machine;/该文件运行所需要的CPU,对于Intel平台是14ChWORD NumberOfSections;/文件的节数目DWORD TimeDateStamp;

6、/文件创建日期和时间DWORD PointerToSymbolTable;/用于调试DWORD NumberOfSymbols;/符号表中符号个数WORD SizeOfOptionalHeader;/OptionalHeader 结构大小WORD Characteristics;/文件信息标记,区分文件是exe还是dll IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;重要的 Characteristics值#define IMAGE_FILE_RELOCS_STRIPPED 0001h / 文件中是否存在重定位信息#define IMAGE_FILE_EXECU

7、TABLE_IMAGE 0002h / 文件是可执行的#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0020h / 程序可以触及大于2G的地址#define IMAGE_FILE_BYTES_REVERSED_LO 0080h / 保留的机器类型低位#define IMAGE_FILE_32BIT_MACHINE 0100h / 32位机器#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0400h / 不可在可移动介质上运行#define IMAGE_FILE_NET_RUN_FROM_SWAP 0800h / 不可在网络上

8、运行#define IMAGE_FILE_SYSTEM 1000h / 系统文件#define IMAGE_FILE_DLL 2000h / 文件是一个DLL#define IMAGE_FILE_UP_SYSTEM_ONLY 4000h / 只能在单处理器计算机上运行#define IMAGE_FILE_BYTES_REVERSED_HI 8000h /保留的机器类型高位typedef struct _IMAGE_OPTIONAL_HEADERWORD Magic;/标志字(总是010bh)BYTE MajorLinkerVersion;/连接器高版本号BYTE MinorLinkerVers

9、ion;/连接器低版本号DWORD SizeOfCode;/代码段大小DWORD SizeOfInitializedData;/已初始化数据块大小DWORD SizeOfUninitializedData;/未初始化数据块大小DWORD AddressOfEntryPoint;/PE装载器准备运行的PE文件的第一个指令的RVA,若要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。DWORD BaseOfCode;/代码段起始RVADWORD BaseOfData;/数据段起始RVADWORD ImageBase;/PE文件的装载地址DWORD SectionAl

10、ignment;/块对齐因子DWORD FileAlignment;/文件块对齐因子WORD MajorOperatingSystemVersion;/所需操作系统高位版本号WORD MinorOperatingSystemVersion;/ 所需操作系统低位版本号WORD MajorImageVersion;/用户自定义高位版本号WORD MinorImageVersion;/用户自定义低位版本号WORD MajorSubsystemVersion;/win32子系统版本。若PE文件是专门为Win32设计的WORD MinorSubsystemVersion;/该子系统版本必定是4.0否则对

11、话框不会有3维立体感DWORD Win32VersionValue;/保留值,系统没用到的,一般被作为是否感染的标志DWORD SizeOfImage;/内存中整个PE映像体的尺寸DWORD SizeOfHeaders;/所有头+节表的大小DWORD CheckSum;/校验和WORD Subsystem;/NT用来识别PE文件属于哪个子系统WORD DllCharacteristics;/ 用来表示一个DLL映像是否为进程和线程的初始化及终止包含入口点的标记DWORD SizeOfStackReserve;/DWORD SizeOfStackCommit;DWORD SizeOfHeapRe

12、serve;DWORD SizeOfHeapCommit;/堆栈大小 这些域控制要保留的地址空间数量,并且负责栈和默认堆的申请。在默认情况下,栈和堆都拥有1个页面的申请值以及16个页面的保留值DWORD LoaderFlags;/ 告知装载器是否在装载时中止和调试,或者默认地正常运行DWORD NumberOfRvaAndSizes;/ 该字段标识了接下来的DataDirectory数组个数。IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES;/IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个

13、重要数据结构的RVA,比如引入地址表等IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;2.2 IMAGE_DATA_DIRECTORYtypedef struct _IMAGE_DATA_DIRECTORYDWORD VirtualAddress;/表的RVA地址DWORD Size;/大小 IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;图5 Load PE 读取的PE Header 的重要部分数据图6 Subsystem 类型 图7 Load Pe 读取的IMAGE_DATA_DIRECTORY

14、 信息在IMAGE_OPTIONAL_HEADER32后部一般是16项IMAGE_DATA_DIRECTORY数据,其中最后一项是保留数据。每一项数据都有其固定的含义,并且位置不可改变。Export Table导出函数表,主要用于DLL中的导出函数Import Table导入函数表,使用外部函数的数据表Resource资源数据表Exception异常处理表Security安全处理数据表Relocation重定位信息表,一般和DLL相关Debug调试信息表Copyright版权信息表Globalptr机器值(MIPS GP)TlsTable线程信息表LoadConfig装配信息表BoundImp

15、ort输入函数绑定信息表IAT也ImportTable对应,由Loader填写的输入函数地址DelayImport延迟装入的函数信息COM公用组件信息表Reserved保留信息,系统没有使用,为以后扩展使用这16项数据,其所在位置由RVA指定,大小由Size指定。对于一般的一个可执行程序(.exe),最重要的是导入表(Import Table和IAT)、资源数据表(Resoruce)。2.3 IMAGE_SECTION_HEADERPE文件头后是节表,在winnt.h下如下定义typedef struct _IMAGE_SECTION_HEADER BYTE NameIMAGE_SIZEOF_

16、SHORT_NAME;/节表名称,如“.text” /IMAGE_SIZEOF_SHORT_NAME=8union DWORD PhysicalAddress;/物理地址DWORD VirtualSize;/真实长度,这两个值是一个联合结构,可以使用其中的任何一个,/一般是节的数据大小 Misc;/RVADWORD SizeOfRawData;/物理长度DWORD PointerToRawData;/节基于文件的偏移量DWORD PointerToRelocations;/重定位的偏移DWORD PointerToLinenumbers;/行号表的偏移WORD NumberOfRelocati

17、ons;/重定位项数目WORD NumberOfLinenumbers;/行号表的数目DWORD Characteristics;/节属性 如可读,可写,可执行等 IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;图8 Load PE 读取的 IMAGE_SECTION_HEADER 信息Name:节名称VOffset:相对于ImageBase的虚拟偏移VSize:实际大小ROffset:相对于文件起始处的偏移RSize所占的文件空间大小Flags:节属性 图9 Load PE 读取的.text节的属性重要的节属性定义:#define IMAGE_SCN

18、_CNT_CODE 00000020h / 节中包含代码#define IMAGE_SCN_CNT_INITIALIZED_DATA 00000040h / 节中包含已初始化数据#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 00000080h / 节中包含未初始化数据#define IMAGE_SCN_MEM_DISCARDABLE 02000000h / 是一个可丢弃的节,即节中的数据在进程开始后将被丢弃#define IMAGE_SCN_MEM_NOT_CACHED 04000000h / 节中数据不经过缓存#define IMAGE_SCN_MEM_N

19、OT_PAGED 08000000h / 节中数据不被交换出内存#define IMAGE_SCN_MEM_SHARED 10000000h / 节中数据可共享#define IMAGE_SCN_MEM_EXECUTE 20000000h / 可执行节#define IMAGE_SCN_MEM_READ 40000000h / 可读节#define IMAGE_SCN_MEM_WRITE 80000000h / 可写节注 RVA:虚拟偏移地址。RAV是指的某一处由Loader装入内存后,这一处应该在虚拟内存的什么地方,RAV也称为虚拟偏移地址。Alignment:对齐因子。与对齐因子相关的值有

20、2个地方,一处是文件对齐因子,另一处是内存对齐因子。对齐因子指示出某一类型的对齐方式,以文件对齐为例,如果Alignment 为200h,说明文件中的内容是以200h为单位的,如果数据大小正好是200h的整数倍,则不存在对齐问题,如果数据大小是非200h的整数倍,则要使用Alignment 对数据所占的空间进行修正,取其上限数值(如310h-400h),使其所占的空间是200h的整数倍。2.3 Improt Table 和IATIMAGE_DATA_DIRECTORY的第2项和第13项,指示导入表和导入函数地址表的位置。这部分对于一个PE文件相当重要,很多系统函数都是由此导入。Import T

21、able 的VirtualAddress指向了一个RVA,他是一个导入表结构数组,数组以全0作为结束标记,该结构定义如下:typedef struct _IMAGE_IMPORT_DESCRIPTOR DWORD OriginalFirstThunk;/ 指向一个 IMAGE_THUNK_DATA 结构数组的RVA/ 文件生成的时间DWORD ForwarderChain;/ 这个数据一般为0,可以不关心DWORD Name1;/ RVA,指向DLL名字的指针,ASCII字符串DWORD FirstThunk; /指向一个 IMAGE_THUNK_DATA 结构数组的RVA,这个数据与IAT所

22、指向的地址一致IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTORIMAGE_THUNK_DATA 这是一个DWORD类型的集合。通常我们将其解释为指向一个 IMAGE_IMPORT_BY_NAME 结构的指针,其定义如下:IMAGE_THUNK_DATAPBYTE ForwarderString;PDWORD Function;DWORD Ordinal;/判定当前结构数据是不是以序号为输出的,如果是的话该值为0x800000000,此时PIMAGE_IMPORT_BY_NAME不可做为名称使用PIMAGE_IMPORT_BY_NAME Addr

23、essOfData;u1; IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;typedef struct _IMAGE_IMPORT_BY_NAMEWORD Hint;/ 函数输出序号BYTE Name11;/输出函数名称 IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME3.IMP和IAT的关系静态分析时,OriginalFirstThunk与FirstThunk指向的数据是同一组IMAGE_IMPROT_BY_NAME。OriginalFirstThunkIMAGE_IMPORT_BY_NAMEFirstThunkIMAGE_TH

24、UNK_DATA . -Function 1 Function 2 Function 3 Function 4 Function n -IMAGE_THUNK_DATALoader 在装入一个可执行的代码时,会分析该文件的导入表(IMP),然后通过导入表的指引,修改IAT指向的数据,这们在装载完成后,数据会变成如下形式Address of Function 1 Address of Function 2 Address of Function 3 Address of Function 4 Address of Function n可以看出,OriginalFirstThunk与FirstTh

25、unk所指向的数据分离。FirstThunk指向的不再是IMAGE_IMPORT_BY_NAME,而是指向了函数的真实地址。代码段对于一个外部函数的引用始终使用的是FirstThunk处的RVA。当程序真正执行时,就可以跳到真正的函数入口了四、修改PE文件PE文件是由源代码经由编译器编译、链接后形成的可执行文件,由系统加载执行。通过对PE文件的分析,给理论上修改PE文件提供了可能。下面我们分几个步骤修改PE文件。这些步骤不是修改PE的必须步骤,但从中我们可以讨论如何修改PE文件。1.给PE文件增加一个新节PE文件节的信息保存在文件头的最后部分,如果预留磁盘空间足够大(大于或等于了个节的结构数据大小)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1