可执行文件分析
- 格式:pdf
- 大小:948.33 KB
- 文档页数:9
exe原理
exe(可执行文件)是一种计算机程序文件的格式,用于在Windows操作系统上运行程序。
exe文件是一种二进制文件,
包含了计算机程序的所有指令和数据。
下面将解释exe文件的
工作原理。
首先,exe文件由编程语言(如C++、C#等)编写的源代码通
过编译器转换成机器语言指令。
编译器会将源代码转换为机器语言的目标文件。
接下来,链接器将目标文件与所需的库文件进行链接,生成最终的可执行文件。
在链接过程中,链接器会解析程序中的函数调用和跳转指令,将其与库文件中对应的函数进行关联。
生成的可执行文件包含了程序的所有指令和数据。
当用户双击exe文件或通过命令行运行时,操作系统会将其加载到内存中,并创建进程来执行该程序。
执行过程中,操作系统会按照程序指令的顺序逐条执行,从而实现程序的功能。
程序可以读取输入数据、进行计算、调用其他函数等。
通过分析exe文件中的指令和数据,操作系统可以知道如何加载、执行和卸载程序。
此外,操作系统还提供了一些系统调用供程序使用,用于访问硬件设备、文件系统、网络等资源。
总而言之,exe文件是一种包含了程序所有指令和数据的二进
制文件,通过编译、链接和加载等过程使程序能够在计算机上运行。
操作系统负责将exe文件加载到内存中,并按照指令的顺序执行,实现程序的功能。
⼀、C:\Windows下的可执⾏⽂件 accstat.exe windows 辅助状态指⽰器 arp.exe tcp/ip地址转换协议命令 calc.exe 计算器应⽤软件 cdplayer.exe cd播放器附件 cleanmgr.exe 磁盘清理程序 clipbrd.exe 剪贴板查看应⽤程序 ms-dos⽅式 control.exe 控制⾯板应⽤程序 cvt1.exe fat32转换器 defrag.exe 磁盘碎⽚整理应⽤程序 drvspace.exe 磁盘空间管理应⽤程序 dialer.exe 电话拨号程序 directcc.exe 直接电缆连接 explorer.exe 资源管理器 extrac32.exe windows cab ⽂件解压缩应⽤程序 fontview.exe 字体查看程序 filexfer.exe microsoft⽂件传输应⽤程序 finger.exe ⽤于获得来⾃于运⾏标准finger服务的任何系统的⽤户信息 freecell.exe 空当接龙游戏 grpconv.exe 程序组转换器 hostname.exe 返回tcp/ip配置窗⼝的dns标题头窗⼝中定义的计算机名字 ipconfig.exe 快速浏览系统tcp/ip配置应⽤程序 kodakprv.exe 映像预览应⽤程序 mplayer.exe 媒体播放机 mshearts.exe 红⼼⼤战游戏 nbtstat.exe 显⽰tcp/ip上的netbios(netbt)的状态 net.exe ⼀个⾮常全的络配置、显⽰络信息的命令,有详细帮助 netstat.exe ⽤于检查所有tcp、ip以及udp连接的统计情况 netdde.exe windows 络dde(动态数据交换) netwatch.exe 络监视器 notepad.exe 记事本应⽤程序 packager.exe 对象包装应⽤程序 pbrush.exe 画笔应⽤程序 ping.exe 检测络远端主机是否存在及判断络是否正常的检测⼯具 progman.exe windows3.x中的程序管理器 qfecheck.exe 更新信息⼯具 regedit.exe 注册表编辑器 route.exe ⽤于管理本地tcp/ip路由表的应⽤程序 rsrcmtk.exe 显⽰资源状况 rundll32.exe 将dll作为应⽤程序运⾏ scandskw.exe 磁盘扫描应⽤程序 smartdrv.exe smartdrive(dos磁盘缓冲器)应⽤程序 sigverif.exe microsoft 签字应⽤程序 sndrec32.exe 录⾳机附件 sndvol32.exe ⾳量控制 sol.exe 纸牌游戏 sysmon.exe 系统监视器 taskman.exe 任务执⾏栏应⽤程序 taskmon.exe 任务监视器应⽤程序 telnet.exe 虚拟终端程序 tftp.exe ⼩⽂件传送协议,允许将⽂件传送给tftp服务器 tracert.exe 决定⽤户的系统与⽬标系统之间的路径 tuneup.exe windows 调整向导 vcmui.exe 版本冲突管理器 wangimg.exe 映像应⽤程序 welcome.exe 欢迎光临widows实⽤程序 winfile.exe windows3.x中的⽂件管理器 winhelp.exe 16位的windows 帮助程序 winhlp32.exe 32位的windows 帮助程序 wininit.exe windows 安装初始化应⽤程序 winipcfg.exe tcp/ip 配置实⽤程序 winmine.exe 扫雷游戏 winpopup.exe windows 弹出式消息实⽤程序 winver.exe 显⽰windows 版本号 write.exe 写字板附件 winrep.exe windows 报告⼯具 winalign.exe 排列本地⽂件应⽤程序 wupdmgr.exe windows 更新⼯具。
Java Card CAP文件分析JAVA卡的可执行文件(CAP 文件)是编译多个应用程序(Applet)的生成结果,包含了一个包中定义的所有类和接口,与包之间是一一对应的关系。
实际发卡操作时,首先需要将该可执行文件下载至卡片中,并安装需要的应用实例;用户使用该安装的应用实例执行操作功能。
CAP文件包含12个组件:注意:一个完整的CAP文件,除COMPONET_Applet、COMPONET_Export 和COMPONET_Debug组件是可选外,其他均为必选。
每个组件封装成一个CAP包,包含在Jar包中。
最后在卡上只保留了5个组件:COMPONET_Method,COMPONET_Class,COMPONET_ConstantPool,COMPONET_StaticField和COMPONET_Export。
其余的组件只是安装时提取有用信息而不在卡中保存。
12个组件中,类class组件保存本应用声明的所有类和接口的信息;方法method 组件保存本应用声明的所有方法和接口,method中利用2字节索引index引用类、方法和域;常数池constant pool组件保存method组件引用的所有类、方法和域信息,分为类、实例域、虚方法、父方法、静态域和静态方法6类,每组信息为4个字节;相关地址reference location组件保存method组件中索引的偏移。
对于Java Card而言,应用程序的下载过程是即CAP文件写入到EEPROM的过程,即是对CAP文件的下载过程。
在CAP文件的下载过程中,需要将一部分组件进行解析,同时对reference location中指定的位置进行链接,能够链接到method 组件中的一个索引号,并根据索引号查找constant pool中保存的、与该索引号对应的类、方法或域在EEPROM中的实际地址,调用实际地址中存储的数据。
也就是说,方法的调用其实是需要两个步骤来实现的:1.根据reference location中指定的位置进行链接,获取method组件中的索引号;2.根据索引号查找constant pool中保存的、与该索引号对应的类、方法或域在EEPROM中的实际地址,调用实际地址中存储的数据。
文件执行情况报告一、引言文件执行情况报告是对文件执行过程中的情况进行总结和分析的一份文档,旨在评估文件的执行效果,发现问题并提出改进措施。
本报告将对文件执行过程中的关键步骤、问题和解决方案进行详细分析和总结。
二、文件执行过程1. 文件准备阶段在文件执行之前,需要对文件进行准备工作。
这包括确定文件的目标和目的,明确文件的范围和内容,收集必要的信息和数据,并进行相关的调研和分析。
2. 文件编制阶段文件编制是整个文件执行过程中的核心环节。
在文件编制阶段,需要根据文件的目标和目的,制定合理的文件结构和内容,确保文件的逻辑性和可读性。
3. 文件审核阶段文件审核是为了确保文件的质量和准确性。
在文件审核阶段,需要对文件的内容、格式、语法等进行仔细检查,发现并修正其中的错误和问题。
4. 文件发布阶段文件发布是将文件正式提供给目标读者的过程。
在文件发布阶段,需要选择合适的发布方式,确保文件能够被目标读者及时获取和使用。
三、文件执行情况分析1. 文件目标和目的在文件执行过程中,首先需要对文件的目标和目的进行明确和详细的说明。
只有清楚地了解文件的目标和目的,才能制定合适的执行策略和措施。
2. 文件内容和结构文件的内容和结构是影响文件执行效果的重要因素。
在文件编制阶段,应根据目标读者的需求和习惯,合理划分文件的章节和段落,确保文件的逻辑性和连贯性。
3. 文件质量和准确性文件的质量和准确性对于文件执行的效果至关重要。
在文件审核阶段,应仔细检查文件的格式、语法和逻辑,确保文件中的信息准确无误。
4. 文件发布方式和渠道文件的发布方式和渠道直接影响文件的传播和使用效果。
在文件发布阶段,应选择合适的发布方式,确保文件能够被目标读者及时获取和使用。
四、文件执行问题及解决方案1. 目标和目的不明确问题:文件执行过程中,目标和目的不明确导致文件内容和结构混乱,无法达到预期效果。
解决方案:在文件执行前,明确文件的目标和目的,并将其详细记录和传达给相关人员,确保文件编制和执行的一致性。
解析ELF可执⾏⽂件-C语⾔解析代码/* gcc elfparse.c -o elsparse */#include <stdio.h>#include <string.h>#include <errno.h>#include <elf.h>#include <unistd.h>#include <stdlib.h>#include <sys/mman.h>#include <stdint.h>#include <sys/stat.h>#include <fcntl.h>int main(int argc, char **argv) {int fd, i;uint8_t *mem;struct stat st;char *StringTable, *interp;Elf64_Ehdr *ehdr;Elf64_Shdr *shdr;Elf64_Phdr *phdr;if (argc < 2) {printf("Usage: %s <executable>\n", argv[0]);exit(0);}if ((fd = open(argv[1], O_RDONLY)) < 0) {perror("open");exit(-1);}if (fstat(fd, &st) < 0) {perror("fstat");exit(-1);}/*** 使⽤mmap函数将可执⾏⽂件映射到内存中** NULL: 由系统决定映射区的起始地址** st.st_size: 映射区的⼤⼩** PROT_READ: 映射区的保护标志** MAP_PRIVATE: 建⽴⼀个写时拷贝的私有映射** fd: ⽂件描述符** 0: 将从此偏移处的⽂件位置开始读取*/mem = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);if (mem == MAP_FAILED) {perror("mmap");exit(-1);}/* 若上述步骤成功执⾏,则此时mem就是可执⾏⽂件映射的起始位置 *//* 获取⽂件头 */ehdr = (Elf64_Ehdr *) mem;/* 获取段表 */phdr = (Elf64_Phdr *) (&mem[ehdr->e_phoff]);/* 获取节表 */shdr = (Elf64_Shdr *) (&mem[ehdr->e_shoff]);/* 检查该⽂件是否为ELF映像 */if (mem[0] != 0x7f || strncmp(&mem[1], "ELF", 3)) {fprintf(stderr, "%s is not an ELF file\n", argv[1]);exit(-1);}/* 确保为可执⾏⽂件 */if (ehdr->e_type != ET_EXEC) {fprintf(stderr, "%s is not an executable\n", argv[1]);exit(-1);}printf("ELF header:\n\n");printf("%-36s 0x%x\n", " Program Entry point:", ehdr->e_entry);printf("%-36s %d (bytes)\n", " Size of program header:", ehdr->e_phentsize);printf("%-36s %d\n", " Number of Program headers:", ehdr->e_phnum);printf("%-36s %d (bytes)\n", " Size of section header:", ehdr->e_shentsize);printf("%-36s %d\n", " Number of Section headers:", ehdr->e_shnum);printf("%-36s %d\n\n", " Section header string table index:", ehdr->e_shstrndx);/* 存储节名的字符串表 */StringTable = &mem[shdr[ehdr->e_shstrndx].sh_offset];printf("Section header list: \n\n");for (i = 1; i < ehdr->e_shnum; i++)printf("%-26s 0x%x\n", &StringTable[shdr[i].sh_name], shdr[i].sh_addr);printf("\n Program header list: \n\n");for (i = 0; i < ehdr->e_phnum; i++) {switch (phdr[i].p_type) {case PT_LOAD:/* ⼀般PT_LOAD类型的段有代码段和数据段,可执⾏的为代码段 */if (phdr[i].p_flags & PF_X)printf("Text segment: 0x%x\n", phdr[i].p_vaddr);elseprintf("Data segment: 0x%x\n", phdr[i].p_vaddr);break;case PT_INTERP:/* 程序解释器的位置,例如 ld-linux.so.2 */interp = strdup((char *)&mem[phdr[i].p_offset]);printf("Interpreter: %s\n", interp);break;case PT_NOTE:printf("Note segment: 0x%x\n", phdr[i].p_vaddr);break;case PT_DYNAMIC:printf("Dynamic segment: 0x%x\n", phdr[i].p_vaddr);break;case PT_PHDR:printf("Phdr segment: 0x%x\n", phdr[i].p_vaddr);break;}}free(interp);exit(0);}测试⽤例// gcc -no-pie example.c -o example#include <stdio.h>void foo() {printf("this is function foo\n");}void your_name(char *filename) {printf("your filename is %s\n", filename);}int main(int argc, char **argv) {foo();your_name(argv[0]);}注意使⽤如下命令来⽣成ELF可执⾏⽂件,若没有加-no-pie参数⽣成的是共享⽬标⽂件gcc -no-pie -example.c -o example结果./elfparse example参考资料《Linux⼆进制分析》 - Ryan O’Neill。
PowerPC上ELF可执行文件的符号解析(一)一.前言符号解析是Linux系统导入二进制可执行文件的重要过程,它完成的工作包括将一个符号定位到实际的内存位置,并且要保证可以正确引用这些符号。
按解析对象的不同它可以分为变量符号解析和函数符号解析;按解析方式的不同可以分为静态解析和动态解析。
对于静态解析的符号,它们的位置在文件生成时就由link editor(在Linux下通常是ld)已经确定下来了;对于动态解析的符号,他们的位置在程序运行时才由dynamic linker(动态链接器,32位Linux平台下通常是/lib/ld.so.1)确定下来。
我们可以这么认为,如果一个符号在共享库中定义,那么当其他可执行文件或共享库引用这个符号时,就需要对它作动态解析。
变量符号的动态解析过程比较简单,系统在载入程序过程中将变量symbol位置存入到GOT (Global Offset Table)中,引用变量symbol时首先计算出GOT表的实际位置,然后以它作为基址加上(变量symbol在GOT表中的偏移量)就可以从GOT表中取得该symbol的实际位置。
下面以SUSE Linux Enterprise Server 8.1 for IBM pSeries为例,主要讲述和演示32位PowerPC Linux下函数符号的动态解析过程。
二.概念在讲述解析过程之前,先介绍一下在解析过程中要用到的基本概念。
1.ELF(Executable and Linkable Format)文件ELF是Linux缺省采用的可执行文件(包括共享库,object文件)的格式,具体规范参见参考文献[1]、[2]。
这里需要提一下的是section这个概念:section是ELF文件中一段互相了解信息,它可以是一段数据,也可以是一段代码。
比如可执行代码信息就放在.text section 中,被用户初始化的变量会放在.data section中,没有被用户初始化的变量会放在.bss section(bss是below stack segment的缩写)中。
可执行文件的名词解释可执行文件是一种特殊类型的计算机文件,也被称为二进制文件或者程序文件。
它是由计算机程序编译生成的二进制代码,可以直接在计算机上运行。
在计算机科学领域,可执行文件是一种包含了机器指令集的文件,这些指令集可以被计算机直接执行。
本文将对可执行文件进行详细解释,并介绍它的结构和功能。
1. 可执行文件的结构可执行文件的结构可以分为两个主要部分:文件头和程序代码。
文件头通常包含了一些与文件相关的元数据,例如文件的版本号、入口点位置等等。
程序代码部分则包含了计算机所需的二进制指令集,这些指令可以被计算机硬件直接执行。
2. 可执行文件的生成与编译在软件开发的过程中,程序员通常会编写高级编程语言(如C、C++、Java)的源代码。
为了能够让计算机执行这些源代码,需要将其编译成可执行文件。
编译器是一种专门用于将高级语言代码转换成机器代码的工具。
编译过程将源代码转化为目标文件,并最终链接生成可执行文件。
3. 可执行文件的阅读与修改一般情况下,可执行文件是以二进制形式存储在计算机硬盘上的。
为了读取和修改可执行文件,需要使用一些特殊的工具和技术。
常见的工具包括反汇编器和调试器。
反汇编器可以将二进制指令转换为人类可读的汇编代码,从而帮助程序员理解和分析可执行文件的功能。
调试器则可以在运行时对可执行文件进行调试和修改,用于查找和修复程序中的错误。
4. 可执行文件的运行与操作系统可执行文件的运行需要依赖操作系统。
操作系统负责将可执行文件加载到内存中,并执行其中的二进制指令。
在加载过程中,操作系统会为可执行文件分配一块内存空间,并将代码和相关数据加载到其中。
一旦加载完成,操作系统会将控制权交给可执行文件,使其开始执行。
操作系统还提供了一些系统调用接口,使得可执行文件能够与硬件和其他软件进行交互。
5. 可执行文件的应用与安全性可执行文件的应用非常广泛,涉及到各行各业的计算机软件。
例如办公软件、娱乐应用、操作系统等都是以可执行文件的形式提供给用户。
ELF文件格式分析ELF(Executable and Linkable Format)是一种常见的可执行文件格式,用于在UNIX和类UNIX系统上存储和执行程序。
在本文中,我们将详细分析ELF文件格式的结构和各个部分的作用。
首先是标识部分,它占据ELF文件的最开始位置,有以下几个字段:1. Magic Number:ELF文件的前四个字节,用于识别文件类型。
对于32位系统,它的值是0x7F、'E'、'L'和'F';对于64位系统,它的值是0x7F、'E'、'L'和'F'以及0x022.类型:指定了ELF文件的类型,比如可执行文件、目标文件、共享库等等。
3.类型机器:指定了目标机器的体系结构,如x86、ARM等等。
4.版本:指定了ELF文件的版本号。
5.入口点:对于可执行文件,指定程序的入口点。
6.程序头表和节头表的偏移地址和大小。
接下来是文件头部分,它描述了ELF文件的整体结构和布局:1.类型:表示ELF文件的类型,如可重定位文件、可执行文件、共享目标文件等。
2.目标机器:标识目标机器的类型。
3.版本:指定了ELF文件的版本号。
4.入口点:指定程序的入口点。
5.程序头表偏移地址和节头表偏移地址。
6.程序头表项的大小、数量和节头表项的大小、数量。
7.字符串表索引,用于找到文件中的字符串。
最后是节头表部分,它包含了所有节(Section)的相关信息,比如代码段、数据段等等。
每个节头表项包含以下字段:1.节的名称:用于标识节的名称。
2.节的类型:描述节的属性,如代码段、数据段、符号表等。
3.节的标志:描述节的属性,如可写、可执行等。
4.节的虚拟地址:指定节在内存中的虚拟地址。
5.节的文件偏移地址:指定节在文件中的偏移地址。
6.节的大小:指定节的大小。
7.链接和信息:用于指定其他与节相关的信息。
通过分析ELF文件的结构,我们可以获得有关程序入口点、机器类型、节的信息等重要的元数据。
可执⾏⽂件格式总结⼀、HexHex⽂件,⼀般是指Intel标准的⼗六进制⽂件。
Intel Hex ⽂件常⽤来保存单⽚机或其他处理器的⽬标程序代码。
它保存物理程序存储区中的⽬标代码映象。
⼀般编程器均⽀持⽣成此种格式⽂件。
如,Keil下可通过配置相关选项来⽣成Hex⽬标⽂件。
Hex⽂件由记录(RECORD)组成。
在Hex⽂件⾥⾯,每⼀⾏代表⼀个记录。
形如 :BBAAAATTHHHH...HHHHCCBB : 字节个数。
AAAA: 数据记录的开始地址,⾼位在前,低位在后。
TT : Type00 数据记录,⽤来记录数据。
01 记录结束,放在⽂件末尾,⽤来标识⽂件结束。
02 ⽤来标识扩展段地址的记录04 扩展地址记录(表⽰32位地址的前缀)HHHH:⼀个字(Word)的数据记录,⾼字节在前,低字节在后。
TT之后共有BB/2 个字的数据。
CC : 占据⼀个Byte的CheckSum举例分析::020*********FA:10000400FF00A0E314209FE5001092E5011092E5A3:00000001FF第1条记录:长度为0x02,Load offset为0000,Type为04,说明该记录为扩展段地址记录。
数据为0000,校验和为FA。
第2条记录:长度为0x10(16),Load offset为0004,Type为00,说明该记录为数据记录。
数据为FF00A0E314209FE5001092E5011092E5,共16个字节,记录的校验和为A3。
第3条记录:长度为00,Load offset为0000,Type= 01,校验和为FF。
类型为01,说明这个是⼀个END OF FILE RECORD,标识⽂件的结尾。
Hex结束符⼀般以:00000001FF结尾。
从这个记录的长度和数据,我们可以计算出基地址为0x0000。
后⾯的数据记录都以此地址为基地址。
第2条记录此时的基地址为0x0000,加上OFFSET,这个记录⾥的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 其实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5。
可执行文件分析这里讨论的可执行文件分析不包括反汇编和逆向工程中涉及的内容,仅仅是一般管理员和调查人员分析的一般手法。
静态分析:所谓的静态分析就是在不运行可执行文件的前提下对文件进行分析,收集信息的方法的统称。
一般情况下用文本打开一个只执行文件,会出下一堆的乱码,但是可执行文件也有自己的格式,符合一定得规律,完全可以从windows可执行文件找到信息。
记录文件信息:分析文件之前首先给文件建档,记录文件相关信息,即就是记录文件所在系统、文件的全路径及谁什么时候发现的等内容。
然后记录可疑文件是如何找到的。
越详细越好,如通过什么确证分析工具在系统中找到的信息。
此外还要记录下系统的版本、补丁版本以及其他的信息如分区的类型。
除了以上的内容还要记录文件的MAC时间、文件系统中对他的引用及注册表中涉及他的键。
最后给文档进行完整性的检验的加密操作,使用MD-5,SHA-1等算法。
分析可执行文件;先使用杀毒软件查看可以的文件,然后使用strings.exe工具提取可疑文件中包含特定长度的字符串。
通过查看这些字符串,对可疑文件作判断。
另外一个提取字符串的工具是BinText。
他可以定位于二进制文件中ASCII,unicode及资源段中的字符串,并且连偏移位置显示在图形用户界面。
Pedump.exePEview.exe上述两个软件可以查看可执行文件更多的信息。
可以参考《Win32 PE可执行文件深入分析》两个文件包含了关于PE文件的详细的格式。
PE文件可以分为几个部分。
第一个,可能也是最重要的部分是IMAGE_DOS_HEADER.这部分的前两个字节是PE文件的文件签名MZ(十六进制的0x%A4D)。
这昂个字母是微软公司设设计可执行行文件格式的系统架构师的名字的缩写,不过文件能够执行并不是靠这两个字和.exe的扩展名来决定的。
整个IMAGE_DOS_HEADER结构共有64B组成。
除了刚才讲的PE文件签名之外,这个结构的最后一个DWORD(4B)也很重要,这个DWORD是e_lfanew,在ntimage.h中头文件中定义是指向真正的PE头部起始位置的指针——e_lfanew中的值就是IMAGE_DOS_HEADERS结构在PE文件中的偏移量。
Windows只有读取了IMAGE_DOS_HEADERS中的信息,才能解析可执行程序其余部分的含义,进而把文件加载到内存中并执行。
MZe_lfanewIMAGE_NT_HEADERS结构在文件中的偏移量应该是0xB8(也就是十进制的184)。
它包括一个签名和IMAGE_FILE _HEADER及IMAGE_OPTIONAL_HEADER两个结构.PE签名很简单就是字母PE再加上两个0(是个DWORD,共4B,可以表示为PE\00\00)。
签名接下来IMAGE_FILE_HEADER结构,紧接在PE签名之后,包含20B。
这个结构中有几个值对调查取证时很有用处的。
使用PEview查看PE_file_header结构查看。
图PEview查看IMAGE_FILE _HEADER结构图使用PEexporer查看pe格式信息对Time Date Stamp显得特别有用,他编译时连接器创建可执行文件的时间。
它通常指程序员编译生成该可执行文件时的系统时间,IMAGE_FILE _HEADER中段的数量应该和PE文件中段的数目相吻合。
同时IMAGE_FILE _HEADER结构中也提供了该文件一些特征。
Flag Value DescriptionIMAGE_FILE_RELOCS_STRIPPED0x0001Image only, Windows CE, andMicrosoft Windows NT® and later.This indicates that the file does notcontain base relocations and musttherefore be loaded at its preferredbase address. If the base address isnot available, the loader reports anerror. The default behavior of thelinker is to strip base relocations fromexecutable (EXE) files.IMAGE_FILE_EXECUTABLE_IMAGE0x0002Image only. This indicates that theimage file is valid and can be run. Ifthis flag is not set, it indicates a linkererror.IMAGE_FILE_LINE_NUMS_STRIPPED0x0004COFF line numbers have beenremoved. This flag is deprecated andshould be zero.IMAGE_FILE_LOCAL_SYMS_STRIPPED0x0008COFF symbol table entries for localsymbols have been removed. Thisflag is deprecated and should bezero.IMAGE_FILE_AGGRESSIVE_WS_TRIM0x0010Obsolete. Aggressively trim workingset. This flag is deprecated forWindows 2000 and later and must bezero.IMAGE_FILE_LARGE_ADDRESS_ AWARE 0x0020Application can handle > 2‑GB addresses.0x0040This flag is reserved for future use.IMAGE_FILE_BYTES_REVERSED_LO0x0080Little endian: the least significant bit(LSB) precedes the most significantbit (MSB) in memory. This flag isdeprecated and should be zero. IMAGE_FILE_32BIT_MACHINE0x0100Machine is based on a 32-bit-wordarchitecture.IMAGE_FILE_DEBUG_STRIPPED0x0200Debugging information is removedfrom the image file.IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP 0x0400If the image is on removable media, fully load it and copy it to the swapfile.IMAGE_FILE_NET_RUN_FROM_SWAP0x0800If the image is on network media,fully load it and copy it to the swapfile.IMAGE_FILE_SYSTEM0x1000The image file is a system file, not auser program.IMAGE_FILE_DLL0x2000The image file is a dynamic-linklibrary (DLL). Such files areconsidered executable files foralmost all purposes, although theycannot be directly run.IMAGE_FILE_UP_SYSTEM_ONLY0x4000The file should be run only on auniprocessor machine.IMAGE_FILE_BYTES_REVERSED_HI0x8000Big endian: the MSB precedes theLSB in memory. This flag isdeprecated and should be zero. IMAGE_FILE_HEADER中说明IMAGE_OPTIONAL_HEADER的结构大小也是很关键的,因为这个值给出了32b还是64b的应用程序的定义。
通常通过过头“2B”的直来确定,通常称其为幻数(magic)。
不过IMAGE_OPTIONAL_HEADER结构中的subSystem值需要关注。
这个值的作用是告诉操作系统运行该可执行文件需要那个子系统。
参考微软知识库。
同样也要关注Address of Entry Point值。
它是指向程序入口点(entry point,也就是主线程的应该运行的第一条指令的地址)指针。
这个指针加上可执行文件镜像加载的基地址,就可得到可执行文件被加载到内存中之后程序入口点的地址。
紧跟着后面的是多个IMAGE_DATA_DIRECTORYS结构,这些结构定义了PE 文件的信息结构目录,共有16个可能的目录,其中导入表(列出改程序需要导入和使用的dll)、导出表(对于dll来说,需要到处供其他程序使用的函数位置)、调试目录的起始地址和大小及资源目录等。
PEview查看IMAGE_DATA_DIRECTORYS的部分输出结果每个数据目录结构由一个相对虚地址(RVA)和有关数据长度两项数据构成,并且遵循严格的顺序排列。
上图中PEview给出了每个结构在PE文件中的偏移地址(如0x100)、有关数据加载的相对虚地址(如0x2FC0),以及每个结构体所代表的含义。
提示:在可执行文件被加载到内存中时,一般不能使用硬件编码的地址,而要使用其中定义的相对虚地址(RVA)这是因为可执行文件不可能在每个系统中加载到同样的内存地址。
RVA用来指定独立于文件的内存加载地址,也就是内存中文件加载地址的相对偏移地址。
计算RVA的公式如下:要得到真实的内存地址,将RVA加上可执行镜像加载的地址即可。
PE格式中最后一个要关注的内容是IMAGE_SELECT_HEADER结构。
在IMAGE_FILE_HEADER中定义了PE段数据量,也就是PE文件中包含几个IMAGE_SELECT_HEADER结构。
IMAGE_SELECT_HEADER其结构大小为40B,它包括段名(8B)、硬盘和内存段的长度及段的特性(是否可读、可写和可执行)。