软件安全与漏洞--Windows底层原理与软件逆向工程基础

理论知识

📂 单元一:磁盘底层与分区管理

核心考点: 物理寻址、MBR结构、分区表、GPT对比

知识点 关键内容 避坑指南
CHS与LBA C(柱面)、H(磁头)、S(扇区);LBA是线性逻辑地址。 LBA转CHS时,扇区号S要 -1(因为S从1开始,LBA从0开始)。
MBR结构 位于0扇区,共512字节。 446 字节引导代码 + 64 字节分区表(4×16) + 2 字节结束标志55 AA
分区表(DPT) 第1字节80H=激活,00H=非激活;第5字节=分区类型;最后4字节=总扇区数(小端模式)。 扩展分区表中最多2项(1个逻辑分区 + 1个指向下一扩展分区的指针)。
GPT分区 突破2TB限制,支持128个分区,有备份头。 MBR才受2TB限制,GPT单分区可远超2TB。

💡 延伸补充:

  • EBR结构:扩展分区的链表指针逻辑。
  • DBR结构:逻辑分区(如FAT32/NTFS)的引导扇区结构,包含BPB参数。
  • 磁盘对齐:4K对齐对性能的影响。

📂 单元二:文件系统原理 (FAT32 & NTFS)

核心考点: 空间划分、目录项、簇链、NTFS属性

知识点 关键内容 避坑指南
FAT32结构 保留区(含DBR) + FAT表(通常2份) + 数据区。 FAT32保留区不止1个扇区(通常32+),FAT16才是1个。
簇链管理 FAT表项值:00000000=空闲,0FFFFFFF=结束,其他=下一簇号。 不是 00000000表示结束!那是空闲。
目录项 FAT32起始簇号拆分:高16位在14H,低16位在1AH 删除文件只改首字节为E5并清空FAT链,数据区内容不变
NTFS核心 一切皆属性 ;MFT前16项为系统元数据;BPB在$Boot中。 BPB不在 MFT里;文件数据是$DATA属性值。

💡 延伸补充:

  • 长文件名(LFN):FAT32中LFN目录项的排列顺序(倒序)及校验和。
  • NTFS属性类型$FILE_NAME, $SECURITY_DESCRIPTOR, $INDEX_ROOT等。
  • 数据恢复原理:基于FAT链清空但数据未覆盖的原理。

📂 单元三:PE文件结构 (Portable Executable)

核心考点: 头部定位、节表、内存对齐、导入表

知识点 关键内容 避坑指南
文件定位 前2字节MZ(4D5A);偏移3CH指向PE\0\0(50450000)。 3CH处是指针,不是签名本身;签名在指针指向的位置。
NT Headers PE签名 + 映像文件头 (20字节) + 可选映像头(E0/F0字节)。 ImageBase 在可选头,不在映像文件头;节表不属于NT头。
节表 每项40字节;记录RVA、FOA、大小、属性。 节表项是40字节,不是16字节(16字节是MBR分区项)。
地址转换 VA = RVA + ImageBaseFOA ↔ RVA 需查节表计算。 内存对齐(4KB) ≠ 文件对齐(512B),所以内存大小 ≠ 文件大小
导入表 OriginalFirstThunk(INT) vs FirstThunk(IAT)。 加载前:都指向名称/序号;加载后:IAT被覆写为函数真实地址

💡 延伸补充:

  • 重定位表(.reloc):基地址冲突时的修正原理。
  • 资源节(.rsrc):目录树结构,编译时确定。
  • TLS表:线程本地存储,在入口点之前执行。
  • 常见节属性.text=60000020h.data=C0000040h

📂 单元四:软件逆向工程基础

核心考点: 逆向流程、分析方法、编译原理

知识点 关键内容 避坑指南
逆向流程 目标确定 → 环境搭建 → 静态分析 → 动态调试 → 逻辑还原 → 文档。 静态分析是基础,动态分析是验证,动静结合是王道。
分析技术 静态:反汇编/反编译;动态:调试器/沙箱;类型恢复:指令语义/数据流。 类型恢复不仅靠语义,数据流分析是编译器级还原的关键。
编译过程 预处理 → 编译/汇编 → 链接/目标代码生成。 填空题常考中间步骤是"编译"或"汇编"。
病毒机制 寄生宿主 → 获取控制权(Entry Point) → 执行病毒代码 → 归还控制权。 病毒不改变PE结构合法性,只是修改入口点或插入新节。

💡 延伸补充:

  • 反调试技术IsDebuggerPresent, NtQueryInformationProcess, 时间差检测。
  • 加壳/脱壳:UPX, VMP, Themida 的基本原理(压缩/虚拟化)。
  • 常用工具:IDA Pro, x64dbg, PE Explorer, CFF Explorer。

📝 复习建议

  1. 死记硬背区 :MBR结构(446+64+2)、FAT32结束标记(0FFFFFFF)、PE节表项大小(40字节)、VA/RVA公式。这些是客观题重灾区。
  2. 理解逻辑区:导入表加载过程(INT不变,IAT变)、扩展分区链表(指针逻辑)、FOA与RVA转换(必须通过节表)。
  3. 简答题套路
    • 过程类:分步骤,用动词开头(检查、分配、映射、修正、跳转)。
    • 结构类:分模块,说位置+作用(DOS头、NT头、节表、节)。

习题

选择题知识点汇总

涉及的知识点可以系统地划分为四大核心模块:硬盘底层物理结构与寻址、主引导记录与磁盘分区、FAT32文件系统原理,以及Windows PE文件格式与病毒机制。以下是详细的知识点梳理:

一、 硬盘底层物理结构与寻址

  1. CHS物理寻址机制:CHS是传统的硬盘三维物理寻址方式,C(Cylinder)代表柱面,H(Head)代表磁头,S(Sector)代表扇区。
  2. LBA逻辑寻址机制:LBA(Logical Block Address)是一维线性地址抽象,操作系统通过LBA访问磁盘,无需关心底层物理结构。
  3. CHS与LBA的相互转换
    • CHS转LBA公式:LBA = C × (磁头数 × 每磁道扇区数) + H × 每磁道扇区数 + S - 1(注:扇区号S从1开始,LBA从0开始,因此需减1)。
    • LBA转CHS公式:通过整除和取余运算,依次得出柱面号、磁头号和扇区号。

二、 主引导记录(MBR)与磁盘分区

  1. 主引导扇区(MBR)结构 :位于硬盘的第0个扇区(即第一个扇区),共占用512字节。严格由三部分组成:前446字节的引导代码(MBR)、64字节的磁盘分区表(DPT),以及最后2字节的结束标志(55 AA)。
  2. 分区表(DPT)结构 :DPT共64字节,包含4个分区项,每项16字节。其中:
    • 第1个字节为状态标志:80H 表示激活(可引导),00H 表示非激活。
    • 第5个字节为分区类型标志(如 07H 为NTFS,0BH/0CH 为FAT32)。
    • 最后4个字节(偏移12-15)表示该分区占用的总扇区数(采用小端模式存储)。
  3. 扩展分区与逻辑分区:MBR最多支持4个主分区。若要创建更多分区,需将其中一个设为扩展分区。逻辑分区通过链表结构管理,前一个扩展分区的表中会记录"下一个"扩展分区的位置信息,且各逻辑分区的空间互不重叠。

三、 FAT32文件系统原理

  1. FAT32逻辑空间划分:主要分为引导扇区(保留区)、文件分配表区(FAT区)和数据区。其中,FAT32的保留扇区通常包含多个扇区(如32或34个),包含DBR及其备份,这与FAT16仅有1个保留扇区不同。
  2. 目录项结构 :FAT32的目录项中,文件起始簇号被拆分为高位和低位。偏移 14H-15H 存放起始簇号的高16位,偏移 1AH-1BH 存放低16位。
  3. 文件删除机制:在FAT32中永久删除文件时,系统仅修改目录项首字节(标记为已删除)并清空FAT表中的簇链表,但存储在数据区中的文件实际内容不会被立即擦除,这为数据恢复提供了可能。

四、 Windows PE文件格式与病毒机制

  1. PE文件物理结构顺序 :标准的PE文件自上而下依次为:DOS头(MZ文件头) -> DOS存根程序(DOS Stub) -> PE签名(PE\0\0) -> 映像文件头(IMAGE_FILE_HEADER) -> 可选映像头(IMAGE_OPTIONAL_HEADER) -> 节表(Section Table) -> 各个节(Sections)。
  2. PE文件校验与定位
    • 判断PE文件:首先检查文件头两个字节是否为 4D 5A(MZ),然后读取DOS头偏移 3CH 处的4字节指针(e_lfanew),检查该指针指向的位置是否为 50 45 00 00(PE\0\0)。
    • 定位NT映像头:由MZ头中偏移 3CH 处的4字节指针确定。
    • 定位程序入口点:程序执行的第一条指令的虚拟地址(VA)计算公式为 ImageBase + AddressOfEntryPoint
  3. 内存地址转换 :VA(虚拟地址)是可执行文件在虚拟内存中的实际地址;RVA(相对虚拟地址)是相对于基地址的偏移量。两者的关系为 VA = RVA + ImageBase
  4. PE文件核心组件
    • NT映像头包含:PE签名、映像文件头、可选映像头(不包含节表)。
    • 节表(Section Table):包含PE文件的逻辑分布信息,记录了每个节的虚拟大小、虚拟地址、文件偏移等映射关系。
    • 引入函数节:通常为 .idata(或 .rdata),专门用于存放从外部DLL导入的函数信息(IAT和INT)。
  5. Win32病毒运行机制 :病毒依附于宿主程序(HOST)。运行流程为:用户点击宿主程序 -> 系统将其装载到内存 -> 加载器根据 ImageBase + AddressOfEntryPoint 定位到入口点 -> 从该位置开始执行(此时通常先执行病毒代码) -> 病毒主体执行完毕后归还控制权 -> 宿主程序继续正常执行。

选择题

第一部分(前12个)

  1. 对硬盘的三个基本参数CHS描述正确的是( )。

    A. C表示柱面数,H表示扇区数,S表示磁头数

    B. C表示柱面数,H表示磁头数,S表示扇区数

    C. C表示扇区数,H表示柱面数,S表示磁头数

    D. C表示磁头数,H表示扇区数,S表示柱面数

    【正确答案】B

    【简短解析】CHS是传统的硬盘物理寻址方式,其中C代表Cylinder(柱面),H代表Head(磁头),S代表Sector(扇区)。

  2. 如果CHS的值为0/0/63,则LBA是( )。

    A. 60

    B. 61

    C. 62

    D. 63

    【正确答案】C

    【简短解析】LBA与CHS的转换公式为:LBA = C × (磁头数 × 每磁道扇区数) + H × 每磁道扇区数 + S - 1。代入CHS(0/0/63),计算得 0 + 0 + 63 - 1 = 62。

  3. 若LBA=3544145,则CHS是( )。

    A. 220/156/18

    B. 221/156/18

    C. 220/157/18

    D. 220/156/19

    【正确答案】A

    【简短解析】根据LBA转CHS的公式(假设标准参数:每磁道63扇区,255磁头),计算可得:柱面号C = 220,磁头号H = 156,扇区号S = 18。

  4. 下面对主引导扇区描述正确的是( )。

    A. 主引导扇区就是硬盘的第一个扇区,由MBR、DPT两部分组成

    B. 主引导扇区就是硬盘的第0个扇区,由MBR、DPT两部分组成

    C. 主引导扇区就是硬盘的第一个扇区,由MBR、DPT、引导扇区标记三部分组成

    D. 主引导扇区就是硬盘的第0个扇区,由MBR、DPT、引导扇区标记三部分组成

    【正确答案】D

    【简短解析】主引导扇区位于硬盘的第0个扇区(即第一个扇区),其512字节结构包含三部分:前446字节的MBR(引导代码)、64字节的DPT(分区表)以及最后2字节的结束标志"55AA"。

  5. 下面对分区表描述正确的是( )。

    A. 占用64字节,其中第一个字节为0表示激活,第5字节表示分区类型,最后4个字节是分区占用的总扇区数

    B. 占用64字节,其中第一个字节为80表示激活,第5字节表示分区类型,最后4个字节是分区占用的总扇区数

    C. 占用64字节,其中第一个字节为0表示激活,分为四个分区项,每项16字节

    D. 占用64字节,其中第一个字节为80表示激活,分为四个分区项,每项16字节

    【正确答案】D

    【简短解析】MBR中的分区表(DPT)共占用64字节,包含4个16字节的分区项。在每个分区项中,第1个字节为状态标志(80H表示激活/可引导,00H表示非激活),第5个字节表示分区类型。

  6. 若一个硬盘中引导扇区的一个分区项是80 20 21 00 07 FE FF FF 00 08 00 00 00 80 A9 03,则该分区占用的总扇区数是( )。

    A. 0x80202100

    B. 0x07FEFFFF

    C. 0x00080000

    D. 0x03A98000

    【正确答案】D

    【简短解析】分区项的最后4个字节(偏移12-15)表示该分区占用的总扇区数。根据小端模式(低位字节在前),提取最后4字节 00 80 A9 03,反转后即为 0x03A98000

  7. 关于扩展分区的描述,不正确的是( )。

    A. 主分区表中要有一个基本扩展分区项,所有扩展分区都隶属于它

    B. 所有扩展分区的空间都必须包括在基本扩展分区中

    C. 前一个扩展分区的数据项记录在后一个扩展分区的分区表中,但两个扩展分区的空间并不重叠

    D. 每个扩展分区中只能存在一个其他分区

    【正确答案】C

    【简短解析】逻辑分区(扩展分区)是通过链表结构管理的。前一个扩展分区的分区表中会记录"下一个"扩展分区的位置信息,而不是记录在后一个扩展分区的表中。

  8. 以下对FAT32文件系统描述不正确的是( )。

    A. 将逻辑盘的空间划分为三部分,依此是引导扇区、文件分配表、数据区

    B. 引导扇区只占用一个扇区,没有保留扇区

    C. FAT区由若干个FAT表构成

    D. 簇是空间分配和回收的基本单位

    【正确答案】B

    【简短解析】FAT12/FAT16的保留区通常只有1个扇区,但FAT32的保留区通常包含多个扇区(如32、34或38个),其中包含DBR及其备份扇区。

  9. 正常文件的目录项中,说明文件的起始簇号高位字节位置的是( )。

    A. 14H-15H

    B. 16H-17H

    C. 18H-19H

    D. 1AH-1BH

    【正确答案】A

    【简短解析】在FAT32的目录项结构中,偏移 14H-15H 存放的是文件起始簇号的高16位,而偏移 1AH-1BH 存放的是起始簇号的低16位。

  10. FAT32文件系统中,一个文件被永久删除,不会改变的是( )。

    A. 文件名

    B. 首簇高位

    C. FAT表中簇链表

    D. 文件内容

    【正确答案】D

    【简短解析】文件被删除时,系统仅修改目录项首字节(标记为已删除)并清空FAT表中的簇链表,但存储在数据区中的文件实际内容并不会被立刻擦除。

  11. 下面对PE文件描述不正确的是( )。

    A. 是任何Win32平台的PE装载器都能识别和使用PE文件格式

    B. 移植到不同的CPU上PE文件也不会改变

    C. 研究PE文件格式,有助于了解病毒的传染原理

    D. 研究PE文件格式,有助于了解Windows结构

    【正确答案】B

    【简短解析】PE文件包含特定CPU架构的机器码(如x86或x64)。如果将其移植到不同架构的CPU上,由于指令集不同,PE文件是无法直接运行的,必须重新编译。

  12. 一般来说,Win32病毒运行的过程正确的是( )。

    (1)装载HOST程序到内存;(2)用户点击HOST程序;(3)从第一条语句开始执行;(4)通过PE文件中的AddressOfEntryPoint和ImageBase之和来定位第一条语句的位置;(5)病毒主体代码执行完毕,将控制权还给HOST程序;(6)HOST程序继续执行。

    A. (1)-(2)-(3)-(4)-(5)-(6)

    B. (2)-(1)-(3)-(4)-(5)-(6)

    C. (2)-(1)-(4)-(3)-(5)-(6)

    D. (2)-(1)-(4)-(3)-(6)-(5)

    【正确答案】C

    【简短解析】正确的执行逻辑是:用户点击程序(2),系统将其装载到内存(1),加载器根据 ImageBase + AddressOfEntryPoint 定位到入口点(4),从该位置开始执行(此时通常先执行病毒代码)(3),病毒执行完毕后归还控制权(5),宿主程序继续执行(6)。

第二部分(后12个)

  1. 以下对VA和RVA的描述不正确的是( )。

    A. RVA=VA+ImageBase

    B. RVA,是一个相对于可执行文件映射到内存的基地址的偏移量

    C. VA,是可执行文件在虚拟内存中的实际内存地址

    D. VA=RVA+ImageBase

    【正确答案】A

    【简短解析】VA(虚拟地址)等于 RVA(相对虚拟地址)加上 ImageBase(映像基地址),即 VA = RVA + ImageBase。选项A的公式正好写反了。

  2. 以下对PE文件结构的顺序描述正确的是( )。

    (1)MZ文件头;(2)字串"PE\0\0";(3)DOS插桩程序;(4)节表;(5)节;(6)映像文件头;(7)可选映像头

    A. (1)-(2)-(3)-(4)-(5)-(6)-(7)

    B. (1)-(3)-(2)-(6)-(7)-(4)-(5)

    C. (2)-(1)-(4)-(3)-(5)-(6)-(7)

    D. (2)-(1)-(4)-(3)-(6)-(5)-(7)

    【正确答案】B

    【简短解析】PE文件的标准物理结构顺序为:DOS头(MZ) -> DOS存根程序(DOS Stub) -> PE签名(PE\0\0) -> 映像文件头(IMAGE_FILE_HEADER) -> 可选映像头(IMAGE_OPTIONAL_HEADER) -> 节表(Section Table) -> 各个节(Sections)。

  3. 以下哪一项不是用来判断一个文件是PE文件的依据。( )。

    A. 该文件的前两个字节是不是4D5A

    B. DOS程序头中的偏移3CH处的四个字节是否是50\45\00\00

    C. DOS程序头中的偏移3CH处的四个字节是否是PE\0\0

    D. 该文件的前两个字符是不是PE

    【正确答案】D

    【简短解析】判断PE文件的标准流程是:首先检查文件头两个字节是否为 MZ(即十六进制 4D 5A),然后读取偏移 3CH 处的值作为指针,检查该指针指向的位置是否为 PE\0\0 签名(即十六进制 50 45 00 00)。文件开头直接是 PE 是不符合规范的。

  4. 确定程序执行的第一条指令的位置需要的参数是( )。

    A. BaseOfCode+AddressOfEntryPoint

    B. BaseOfData+AddressOfEntryPoint

    C. ImageBase+AddressOfEntryPoint

    D. ImageBase+BaseOfCode

    【正确答案】C

    【简短解析】程序入口点(Entry Point)在内存中的绝对虚拟地址(VA)计算公式为:ImageBase + AddressOfEntryPoint

  5. 在PE文件中确定NT映像头(包含PE签名、映像文件头和可选映像头)的位置是( )。

    A. 通过DOS小程序部分自动定位

    B. 固定为文件开始位置的偏移BOH处

    C. 由映像文件头里面确定

    D. 由MZ头中3CH位置开始的4个字节确定

    【正确答案】D

    【简短解析】DOS头(MZ头)的偏移 3CH 处存放着一个4字节的指针(e_lfanew),该指针明确指示了NT映像头(PE签名及后续结构)在文件中的实际文件偏移量。

  6. 如果需要根据可执行文件获得其中每一个节在内存中的具体信息,下面步骤正确的是( )。

    (1)读取IMAGE_FILE_HEADER的NumberOfSections域,获得文件的节数目;(2)SizeOfHeaders域值作为节表的文件偏移量,并以此定位节表;(3)将VirtualAddress域值加上ImageBase域值,获得节起始的虚拟地址;(4)遍历整个数组,直至所有节都已处理完毕;(5)遍历整个结构数组检查各成员值。对于每个结构,读取PointerToRawData域值并定位到该文件偏移量,然后读取SizeOfRawData域值得到该节映射到内存的总字节数。

    A. (1)-(2)-(3)-(4)-(5)

    B. (1)-(2)-(5)-(3)-(4)

    C. (1)-(2)-(4)-(5)-(3)

    D. (1)-(2)-(5)-(4)-(3)

    【正确答案】B

    【简短解析】正确的解析逻辑是:先获取节数量(1),再定位节表起始位置(2),接着遍历结构数组检查成员并读取原始数据指针和大小(5),然后计算虚拟地址(3),最后完成所有节的遍历处理(4)。

  7. PE文件中不包括在NT映像头中的是( )。

    A. 字串"PE\0\0"

    B. 映像文件头

    C. 可选映像头

    D. 节表

    【正确答案】D

    【简短解析】NT映像头(NT Headers)严格包含三部分:PE签名(PE\0\0)、映像文件头(IMAGE_FILE_HEADER)和可选映像头(IMAGE_OPTIONAL_HEADER)。节表(Section Table)紧跟在NT映像头之后,但不属于NT映像头内部。

  8. PE文件中引入函数节的名字一般是( )。

    A. .idata(.rdata)

    B. .edata

    C. .text(.code)

    D. .data(.bss)

    【正确答案】A

    【简短解析】.idata(Import Data)节专门用于存放从外部DLL导入的函数信息。在某些编译器或加壳程序中,导入表也可能被合并到 .rdata(只读数据节)中。

  9. 在PE文件的节中包含有从其它DLL中引入的函数的节是( )。

    A. 代码节

    B. 引入函数节

    C. 引出函数节

    D. 资源节

    【正确答案】B

    【简短解析】引入函数节(Import Section,通常为 .idata)包含了导入地址表(IAT)和导入名称表(INT),用于记录从其他DLL中引入的函数信息。

  10. 包含了PE文件的逻辑分布信息的是( )。

    A. MZ文件头

    B. 映像文件头

    C. 节表

    D. 可选映像头

    【正确答案】C

    【简短解析】节表(Section Table)由多个节表项组成,详细记录了每个节在内存中的虚拟大小、虚拟地址,以及在文件中的原始大小和文件偏移,是PE文件逻辑与物理映射的核心。

  11. Windows系统中不使用PE文件格式的是( )。

    A. 后缀为.SCR的文件

    B. 后缀为.EXE的文件

    C. 后缀为.DLL的文件

    D. 后缀为.DOC的文件

    【正确答案】D

    【简短解析】.EXE.DLL.SCR(屏幕保护程序)、.OCX.SYS 等在Windows下均为PE格式文件。.DOC 是微软Office的文档格式,属于复合文档或XML格式,不是PE文件。

  12. 下面有关PE文件说法错误的是?( )。

    A. 所有windows 下的32位,64位可执行文件都是PE文件格式。

    B. 判断是否是PE文件:先读取DoS头,判断e_magic是否等于"MZ",然后再读取PE文件头的头字节,判断是不是 "PE00"。这样就能确定是不是一个有效的PE文件。

    C. Windows下DLL并不属于PE文件

    D. PE文件的真正内容划分成块,称之为Sections(节)

    【正确答案】C

    【简短解析】Windows下的DLL(动态链接库)文件完全属于PE文件格式,它们与EXE文件在底层结构上几乎一致,仅在可选映像头中的某些标志位(如Characteristics)有所不同。

填空题知识点汇总

一、 PE文件识别与结构

  1. PE文件魔数(Magic Number)校验:所有合法的Windows PE文件均以MS-DOS兼容头起始,其最开头的两个字节(ASCII字符)必须是"MZ"(十六进制为4D 5A)。这是病毒或分析工具进行合法性校验的第一道门槛。
  2. 引入函数节(Import Section) :PE文件中专门用于存放从外部DLL导入的函数信息的节通常命名为 .idata(或 .rdata),其中包含了导入地址表(IAT)和导入名称表(INT)。

二、 磁盘分区与MBR底层结构

  1. MBR分区表(DPT)规格:MBR中的磁盘分区表(DPT)共占用64个字节,被严格划分为4个分区项,每个分区项占用16个字节。这也是传统MBR分区方案最多只能支持4个主分区的根本原因。
  2. MBR结束标志:主引导扇区(MBR)的最后2个字节(即第511和512字节)是固定的十六进制结束标志"55"和"AA"。BIOS通过校验这两个字节来判断该磁盘是否为合法的可引导设备。

三、 软件编译与构建流程

  1. 编译过程的核心阶段:高级语言(如C/C++)转化为可执行文件的标准过程主要包含预处理、编译(或汇编)、目标代码生成(链接)等关键步骤,其中"编译/汇编"是进行语法语义分析并生成机器码的核心转换环节。

四、 软件逆向工程与分析技术

  1. 逆向分析的三大主流方法:软件逆向分析通常分为静态分析(不运行程序,直接对二进制代码进行反汇编/反编译)、动态分析(在调试器或沙箱中运行程序以观察运行时行为)以及动静结合的逆向分析。
  2. 类型恢复与分析技术:在高级逆向工程(如编译器级别的类型恢复)中,类型分析通常依赖于两种核心技术:基于指令语义的启发式分析,以及基于数据流(Data Flow)的追踪分析。

填空题

  1. (填空题, 2分)

    PE文件格式的开头两个字符是( )。

    【正确答案】MZ

    【简短解析】所有合法的Windows PE文件都以MS-DOS兼容头起始,其最开头的两个字节(ASCII字符)必须是"MZ"(十六进制为4D 5A)。

  2. (填空题, 2分)

    计算机病毒判断一个文件是否是真正的PE文件,第一步是判断该文件的前两个字节是否是( )。

    【正确答案】MZ(或 4D5A)

    【简短解析】这是PE文件合法性校验的第一道门槛,只有前两个字节为"MZ",病毒或分析工具才会继续读取偏移3CH处的指针去验证"PE\0\0"签名。

  3. (填空题, 2分)

    在PE文件的节中包含有从其它DLL中引入的函数的节是( )。

    【正确答案】引入函数节(或 .idata)

    【简短解析】引入函数节(Import Section,通常命名为.idata)包含了导入地址表(IAT)和导入名称表(INT),专门用于记录从外部DLL中引入的函数信息。

  4. (填空题, 6分)

    MRB分区表的长度只有( )个字节,里面又分成( )项,每项( )个字节。

    【正确答案】64;4;16

    【简短解析】MBR中的磁盘分区表(DPT)共占用64字节,被严格划分为4个分区项,每个分区项占用16个字节,这也是MBR最多只能支持4个主分区的原因。

  5. (填空题, 4分)

    MBR中511,512字节的内容是( )、( )。

    【正确答案】55;AA(或 55AA)

    【简短解析】主引导扇区(MBR)的最后2个字节(即第511和512字节)是固定的结束标志"55 AA",BIOS通过校验这两个字节来判断该磁盘是否为可引导磁盘。

  6. (填空题, 2分)

    编译过程主要包含3个步骤:预处理、( )、目标代码生成。

    【正确答案】编译(或 汇编)

    【简短解析】C/C++等高级语言的标准编译过程通常分为四个阶段:预处理、编译、汇编、链接。在简化为三大步骤的考题中,通常将"编译"或"汇编"作为中间的核心转换步骤。

  7. (填空题, 2分)

    .rdata节起始位置的RVA=2000H,该节的起始FOA=600H,则节偏移=( )。

    【正确答案】1A00H

    【简短解析】节偏移(即RVA与FOA之间的差值)计算公式为:节偏移 = RVA - FOA。代入数值:2000H - 600H = 1A00H。

  8. (填空题, 2分)

    针对软件的逆向分析方法通常分为3类:动态分析、( )和动静结合的逆向分析。

    【正确答案】静态分析

    【简短解析】软件逆向分析的三大主流方法为:静态分析(不运行程序,直接反汇编/反编译代码)、动态分析(在调试器中运行程序观察行为)以及动静结合分析。

  9. (填空题, 2分)

    软件逆向分析的过程中类型分析主要有两种方式:基于指令语义的方式和基于( )分析的方式。

    【正确答案】数据流(或 控制流)

    【简短解析】在高级逆向工程(如编译器级别的类型恢复)中,类型分析通常依赖于两种核心技术:基于指令语义的启发式分析,以及基于数据流(Data Flow)的追踪分析。

判断题知识点汇总

一、 磁盘分区与文件系统底层原理

  1. 扩展分区的链表管理机制:扩展分区采用链表结构管理,其分区表中必须包含一项指向"下一个扩展分区"的指针,因此最多只能再包含一个逻辑分区的数据项,总计最多两个分区数据项。
  2. 文件系统的定义:文件系统是操作系统用于管理硬盘数据、组织文件目录结构以及控制数据读写检索的核心逻辑方法和规则。
  3. FAT32系统区划分 :在FAT32中,引导区(BOOT区)和文件分配表区(FAT区)合称为"系统区"。FAT表中,00000000H 表示簇是空闲/未分配的,而文件占用的最后一个簇,其对应的FAT表项应填入结束标记 0FFFFFFFH
  4. GPT分区的容量突破:2TB是传统MBR分区表的限制。GPT(GUID Partition Table)正是为了突破这一限制而设计的,支持远超2TB的单分区和磁盘容量。
  5. NTFS的BPB参数位置 :BPB(BIOS Parameter Block)参数位于NTFS的引导扇区($Boot)中,而不是MFT中。
  6. NTFS元数据保留区 :NTFS的MFT前16项(编号0-15)固定保留给系统元数据文件(如$MFT, $LogFile, $Bitmap等),顺序和位置都是固定的。
  7. NTFS"一切皆属性"设计 :NTFS将文件作为属性/属性值的集合来处理,文件的实际内容(数据)属于 $DATA 属性,文件名属于 $FILE_NAME 属性等。
  8. MFT与FAT结束标记的区别0FFFFFFFH 是 FAT32 文件分配表(FAT表)中簇链的结束标记。而MFT文件记录使用的是属性列表结束标记(通常是 FF FF FF FF)。

二、 PE文件基础结构与节属性

  1. 资源节的特性 :资源节(.rsrc)存放的是图标、字符串、对话框模板等静态资源,这些数据在编译链接阶段就已经确定并打包进PE文件。
  2. 重定位机制 :当实际加载基地址(ImageBase)与编译时的首选基地址不一致时,Windows加载器必须利用重定位表(.reloc)修正代码和数据中的绝对地址引用。
  3. 引入函数节(.idata):引入函数节包含导入地址表(IAT)和导入名称表(INT),专门用于记录从外部DLL导入的函数信息。
  4. 节表项大小 :PE文件节表中的每一项(IMAGE_SECTION_HEADER)大小固定为40字节,而不是16字节。
  5. 优先装载地址位置 :优先装载地址(ImageBase)位于可选映像头(IMAGE_OPTIONAL_HEADER)中,而不是映像文件头(IMAGE_FILE_HEADER)中。
  6. 内存对齐与文件对齐:PE文件在磁盘上按文件对齐(通常512字节),在内存中按内存对齐(通常4KB)。由于对齐方式不同,内存映像大小通常大于或等于文件大小。
  7. 代码节属性标志.text 代码节的典型属性标志为 60000020h,其中 20h 表示包含代码(CODE),20000000h 表示可执行(EXECUTE),40000000h 表示可读(READ)。

三、 PE导入表(Import Table)深度解析

  1. 导入描述符数组的长度 :导入描述符(IMAGE_IMPORT_DESCRIPTOR)数组的长度是不固定的,取决于程序导入了多少个DLL。数组以全0的NULL结构作为结束标志,加载器通过扫描直到遇到NULL来判断数组结束。
  2. INT与IAT的区别OriginalFirstThunk 指向 INT(导入名称表),存放函数名/序号,内容不变;FirstThunk 指向 IAT(导入地址表),加载器会将解析到的真实函数地址填入此处。它们指向不同的RVA,加载后IAT内容会被覆写为真实地址。

判断题

  1. 每一个扩展分区的分区表中最多只能有两个分区数据项。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】扩展分区采用链表结构管理,其分区表中必须包含一项指向"下一个扩展分区"的指针,因此最多只能再包含一个逻辑分区的数据项,总计最多两个分区数据项。

  2. (判断题, 1分)

    文件系统是一个操作系统的重要组成部分,是操作系统在计算机硬盘存储和检索数据的逻辑方法。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】文件系统确实是操作系统用于管理硬盘数据、组织文件目录结构以及控制数据读写检索的核心逻辑方法和规则。

  3. (判断题, 1分)

    FAT32文件系统中文件分配表又称为系统区。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】在FAT32中,引导区(BOOT区) 和**文件分配表区(FAT区)**合称为"系统区",单指文件分配表是不准确的。

  4. (判断题, 1分)

    FAT表中一个文件占用的最后一个簇,填入的值为00000000H。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】00000000H 表示该簇是空闲/未分配 的。文件占用的最后一个簇,其对应的FAT表项应填入结束标记,FAT32中通常为 0FFFFFFFH

  5. (判断题, 1分)

    使用GPT分区,单分区容量不得大于2TB。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】2TB是传统MBR分区表的限制。GPT(GUID Partition Table)正是为了突破这一限制而设计的,支持远超2TB的单分区和磁盘容量。

  6. (判断题, 1分)

    NTFS文件系统中BPB参数位于MFT中。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】BPB(BIOS Parameter Block)参数位于NTFS的**引导扇区( $ Boot)**中,而不是MFT中。MFT是主文件表,用于记录文件属性。

  7. (判断题, 1分)

    NTFS文件系统中MFT开始的16个元数据文件是保留的,占有固定的位置。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】NTFS的MFT前16项(编号0-15)固定保留给系统元数据文件(如 MFT,MFT, LogFile, $ Bitmap等),顺序和位置都是固定的。

  8. (判断题, 1分)

    NTFS将文件作为属性/属性值的集合来处理,文件数据不属于属性值。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】NTFS的核心设计就是"一切皆属性"。文件的实际内容(数据)属于** DATA属性** ,文件名属于** FILE_NAME属性** ,安全信息属于**$ SECURITY_DESCRIPTOR属性**等。

  9. (判断题, 1分)

    MFT中每个文件记录的结束标记为0FFFFFFFH。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】0FFFFFFFHFAT32文件分配表(FAT表) 中簇链的结束标记。MFT文件记录使用的是属性列表结束标记 (通常是 FF FF FF FF),而不是FAT的结束标记。

  10. (判断题, 1分)

    PE文件的资源节存放的在编译时刻已经确定的数据。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】资源节(.rsrc)存放的是图标、字符串、对话框模板等静态资源,这些数据在编译链接阶段就已经确定并打包进PE文件。

  11. (判断题, 1分)

    若装载器不是把程序装到程序编译时默认的基地址时,就需要重定位节来做一些调整。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】当实际加载基地址(ImageBase)与编译时的首选基地址不一致时,Windows加载器必须利用**重定位表(.reloc)**修正代码和数据中的绝对地址引用。

  12. (判断题, 1分)

    PE文件的引入函数节包含有从其它DLL中引入的函数。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】引入函数节(.idata)包含导入地址表(IAT)和导入名称表(INT),专门用于记录从外部DLL导入的函数信息。

  13. (判断题, 1分)

    节表中每一项的大小是16字节。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】PE文件节表中的每一项(IMAGE_SECTION_HEADER)大小固定为 40字节,而不是16字节。

  14. (判断题, 1分)

    映像文件头中包含有PE文件的优先装载地址。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】优先装载地址(ImageBase)位于**可选映像头(IMAGE_OPTIONAL_HEADER)**中,而不是映像文件头(IMAGE_FILE_HEADER)中。

  15. (判断题, 1分)

    PE文件在内存中所占空间与文件大小一致。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】PE文件在磁盘上按文件对齐 (通常512字节),在内存中按内存对齐 (通常4KB)。由于对齐方式不同,内存映像大小通常大于或等于文件大小。

  16. (判断题, 1分)

    PE文件代码节的属性一般是60000020h,也就是可执行、可读和"节中包含代码"。( )

    A. 对

    B. 错

    【正确答案】A

    【简短解析】.text 代码节的典型属性标志为 60000020h,其中 20h 表示包含代码(CODE),20000000h 表示可执行(EXECUTE),40000000h 表示可读(READ),组合起来即 60000020h

  17. (判断题, 1分)

    PE文件引入函数节开始是一个成员为IMAGE_IMPORT_DESCRIPTOR结构的数组,这个数组的长度是固定的。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】导入描述符数组的长度是不固定 的,取决于程序导入了多少个DLL。数组以全0的NULL结构作为结束标志,加载器通过扫描直到遇到NULL来判断数组结束。

  18. (判断题, 1分)

    IMAGE_IMPORT_DESCRIPTOR结构的OriginalFirstThunk与FirstThunk字段所指向的位置永远是一样的。( )

    A. 对

    B. 错

    【正确答案】B

    【简短解析】这两个字段指向不同的表OriginalFirstThunk 指向 INT(导入名称表) ,存放函数名/序号,内容不变;FirstThunk 指向 IAT(导入地址表),加载器会将解析到的真实函数地址填入此处。它们仅在文件未加载时指向不同的RVA,加载后IAT内容会被覆写为地址。

简答题

52. (简答题, 7分)

软件逆向分析的一般过程是什么?

参考答案:

软件逆向分析的一般过程包括以下步骤:

  1. 确定分析目标:明确需要分析的软件功能或行为(1分)
  2. 环境准备:搭建安全的分析环境,如虚拟机、沙箱等(1分)
  3. 静态分析:不运行程序,通过反汇编、反编译等手段分析代码结构(1分)
  4. 动态分析:在受控环境下运行程序,观察其行为特征(1分)
  5. 代码理解:分析程序逻辑,理解算法和数据结构(1分)
  6. 功能验证:通过测试验证对程序功能的理解(1分)
  7. 文档编写:记录分析过程和结果(1分)

53. (简答题, 8分)

PE文件的4个主要部分是什么?

参考答案:

PE文件的4个主要部分是:

  1. DOS头(MZ头):包含DOS兼容信息和PE头偏移量(2分)
  2. PE头(NT头):包含PE签名、文件头和可选头(2分)
  3. 节表(Section Table):描述各个节的属性和位置信息(2分)
  4. 节区(Sections):包含实际的代码、数据等内容(2分)

54. (简答题, 9分)

简述PE文件执行基本过程。

参考答案:

PE文件执行的基本过程如下:

  1. 加载文件:操作系统加载器读取PE文件到内存(1分)
  2. 验证格式:检查DOS头和PE头的有效性(1分)
  3. 分配内存:根据可选头中的信息分配内存空间(1分)
  4. 映射节区:将各个节映射到内存指定位置(1分)
  5. 重定位处理:如果加载地址与期望地址不同,进行重定位(1分)
  6. 导入处理:解析导入表,加载所需的DLL(1分)
  7. 地址修正:修正导入函数的地址(1分)
  8. 执行入口:跳转到AddressOfEntryPoint指定的位置开始执行(1分)
  9. 程序运行:程序开始正常执行(1分)

55. (简答题, 6分)

1)虚拟地址(VA)与相对虚拟地址(RVA)的转化计算式是什么?

2)文件偏移地址(FOA)与虚拟地址(RVA)的转化计算式是什么?

参考答案:

1)VA与RVA的转换计算式:(3分)

  • VA = ImageBase + RVA
  • RVA = VA - ImageBase

2)FOA与RVA的转换计算式:(3分)

  • 需要通过节表进行转换:
  • RVA = FOA - PointerToRawData + VirtualAddress
  • FOA = RVA - VirtualAddress + PointerToRawData
    (其中PointerToRawData是节在文件中的偏移,VirtualAddress是节的虚拟地址)

56. (简答题, 4分)

什么是软件逆向工程?

参考答案:

软件逆向工程是指通过对软件的二进制代码进行分析,理解其内部结构、算法和工作原理的技术过程。(2分)

其主要目的是在没有源代码的情况下,了解软件的功能、设计和实现方法。(2分)

相关推荐
薛定猫AI1 小时前
【深度解析】OpenRouter Fusion API 技术拆解:多模型融合架构的能力边界与工程实践
网络·架构
云栖梦泽1 小时前
Linux内核与驱动:pinctl子系统和GPIO子系统
linux·单片机·嵌入式硬件
сокол1 小时前
【网安-研判-WireShark流量分析】端口扫描流量分析(高频短连接、SYN 扫描、ICMP 存活探测、扫描 IP / 时段 / 工具指纹)
网络·tcp/ip·wireshark
bIo7lyA8v1 小时前
算法稳定性与数据分布的内在联系研究的技术8
算法
AI科技星2 小时前
数术宇宙:零一无穷创世史诗
开发语言·网络·量子计算·拓扑学
tzy2332 小时前
IEC101的升级版——IEC104简介
网络·iec104·iec101·四遥·总招·变化上送
minji...2 小时前
MySQL数据库 (八) MySQL表的基本查询(下),truncate、group by、聚合函数、分组聚合统计
数据库·mysql·聚合函数·update·分组聚合统计
无足鸟ICT2 小时前
【RHCA+】查找与替换
linux
乐世东方客2 小时前
备份脚本记录(binlog文件+mysql+mongo)
android·数据库·mysql