软件安全分析与应用第1章第2章绪论与基础知识读书笔记。

  • 基础知识
    • 处理器硬件架构基础
      • CPU结构介绍
      • 保护模式
      • 特权级
      • 中断处理与异常处理
      • 调试支持
      • 虚拟化支持
    • 反汇编及对抗技术
      • 汇编语言
      • 反汇编
      • 代码混淆
      • 反调试
    • Windows操作系统基础
      • PE文件结构
      • 进程管理
      • 线程管理
      • 内存管理
      • 对象与句柄管理
      • 文件系统

处理器硬件架构基础

保护模式

IA-32架构的 CPU 有两种工作模式:实模式和保护模式,工作模式受到 CR0 和 PE 标志位控制。

CPU 刚开始初始化后工作在实模式下,PE 标志位值为0,使用20位地址,寻址空间1MB;当操作系统启动时,将 CPU 的 PE 标志位置1,开启保护模式,使用32为地址,内存寻址空间拓展到4GB。

实模式不支持多线程,不能实现权限分级;保护模式下引入内存的分页和分段管理机制,实现了内存分页和权限分级,并支持多线程、多任务。

特权级

CPU 支持 Ring0, Ring1, Ring2, Ring3 共 4 个权限级别, windows 只使用了 Ring0 和 Ring3 两个。
为了进行代码段和数据段间的特权级校验,需要 3 种类型的特权级支持:当前特权级、描述符特权级和请求特权级。

调试支持

程序调试是软件开发过程中进行排错和查错的过程,需要 CPU 架构的支持。

IA-32 架构的 CPU 中,标志位寄存器 EFLAGS 中的 IF、TF 标志用于调试模式的开启,将 TF 置 1 使 CPU 处于单步执行状态,即调试状态,同时需要将 IF 置 1,开启 CPU 的中断响应。

反汇编及对抗技术

反汇编

反汇编是将机器语言转换成汇编代码的过程,将人类难以理解的机器语言转换成具有符号语义的指令语言。
基本的反汇编流程包括4个步骤:

  1. 确定反汇编代码区域,区分程序的代码和数据段。
  2. 确定了程序代码入口后,读取该位置的二进制机器指令,执行表查找,将机器码的值与它对应的汇编语言助记符提取出来,然后根据指令状态机提取操作数。
  3. 获取指令并解码出所有的操作数后,需要对它的汇编语言等价形式进行格式化,输出反汇编代码。
  4. 完成一条指令的反汇编之后,重复上述过程,直到反汇编完整个程序中的指令代码。

对于如何选择下一条指令,有两种方法:

  1. 线性扫描
  2. 递归下降

代码混淆

代码混淆是一种将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的变形。代码混淆可以分为程序源代码混淆和二进制代码混淆。

二进制代码混淆是应用最广泛的混淆手段,大致可以分为两大类:

  1. 反反汇编,代码加密或者使反汇编出错
  2. 指令控制流混淆,加大反汇编和理解分析难度

反反汇编又分为对抗静态和动态反汇编技术两种,针对对抗静态反汇编技术,主要方法是插入不完整指令或者数据,例如花指令。
另外,加密、加壳技术对代码进行保护也是常用的方法。

反调试

在程序逆向分析行业里,动态调试分析是最常用的分析方法之一,它能够弥补静态分析中难以处理代码加壳和花指令等混淆的不足。
常见的反调试技术:

  1. 基于调试特征检测的反调试,检测程序 PEB 结构中的标志位 beingDebug 是否被置为非 0,除此之外还有多个同样功能的标志位。
  2. 基于调试特征隐藏代码,使用异常中断指令 int3,并在异常处理中执行核心代码,以隐藏核心代码

Windows 操作系统

进程管理

进程是计算机中的程序关于特定数据集合上的一次运行活动,是系统进行资源调度和分配的基本单位。

EPROCESS结构包括内核进程块、进程标识、退出状态、创建时间、退出时间、工作集信息、虚拟内存信息、异常端口、调试器端口、访问令牌、句柄表、设备映射表、进程环境块、映像基地址、进程优先级、windows 子系统进程块、作业对象等属性。

KPROCESS内核进程块是EPROCESS块的一个组成部分,包含了进程对象的额外属性信息,也被成为进程控制块(PCB),包含了Windows内核在调度线程时所需的基本信息。

PEB进程环境块是 EPROCESS 块中指针指向的一个结构,其中包括了有关进程对象的额外信息,该结构处于进程的用户态内存中,部分信息需要用户代码维护。

线程管理

线程是程序执行流的最小单元,是进程中的一个实体,是被操作系统独立调度和分派的基本单位。线程本身独占系统资源,与同属一个进程的其他线程共享进程所拥有的全部资源。

ETHREAD是线程的基本结构,包含了内核线程块指针、创建时间和退出时间、所属进程的id标识、线程启动地址、定时器等属性。

KTHREAD是线程结构中关键的数据结构,位于系统内存内核空间,包含了windows内核为正在运行的线程执行线程调度和同步而需要访问的信息。

TEB线程环境块也位于进程的用户地址空间。

内存管理

windows中内存空间分为用户太内存地址和内核空间地址。
windows系统使用内存管理器进行内存管理,主要负责两个任务:

  1. 将进程虚拟地址空间转译到物理内存
  2. 内存不足时将数据换页到磁盘

对象与句柄管理

Windows 使用对象模型为执行体中实现的各种内部服务提供一致的、安全的访问途径,并设计了对象管理器负责创建、删除、保护和跟踪对象。

当一个进程根据名称来创建或者打开对象时,系统返回一个句柄,进程需要根据该句柄对该对象进行访问和管理。
对象句柄是一个索引,只想与对象相关的句柄表中的表项,通过句柄访问对象比直接使用名称访问对象高想,因为对象管理器可以跳过名称查找过程直接找到目标对象。