软件安全分析与应用:绪论与基础知识
软件安全分析与应用第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个步骤:
- 确定反汇编代码区域,区分程序的代码和数据段。
- 确定了程序代码入口后,读取该位置的二进制机器指令,执行表查找,将机器码的值与它对应的汇编语言助记符提取出来,然后根据指令状态机提取操作数。
- 获取指令并解码出所有的操作数后,需要对它的汇编语言等价形式进行格式化,输出反汇编代码。
- 完成一条指令的反汇编之后,重复上述过程,直到反汇编完整个程序中的指令代码。
对于如何选择下一条指令,有两种方法:
- 线性扫描
- 递归下降
代码混淆
代码混淆是一种将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的变形。代码混淆可以分为程序源代码混淆和二进制代码混淆。
二进制代码混淆是应用最广泛的混淆手段,大致可以分为两大类:
- 反反汇编,代码加密或者使反汇编出错
- 指令控制流混淆,加大反汇编和理解分析难度
反反汇编又分为对抗静态和动态反汇编技术两种,针对对抗静态反汇编技术,主要方法是插入不完整指令或者数据,例如花指令。
另外,加密、加壳技术对代码进行保护也是常用的方法。
反调试
在程序逆向分析行业里,动态调试分析是最常用的分析方法之一,它能够弥补静态分析中难以处理代码加壳和花指令等混淆的不足。
常见的反调试技术:
- 基于调试特征检测的反调试,检测程序 PEB 结构中的标志位 beingDebug 是否被置为非 0,除此之外还有多个同样功能的标志位。
- 基于调试特征隐藏代码,使用异常中断指令 int3,并在异常处理中执行核心代码,以隐藏核心代码
Windows 操作系统
进程管理
进程是计算机中的程序关于特定数据集合上的一次运行活动,是系统进行资源调度和分配的基本单位。
EPROCESS结构包括内核进程块、进程标识、退出状态、创建时间、退出时间、工作集信息、虚拟内存信息、异常端口、调试器端口、访问令牌、句柄表、设备映射表、进程环境块、映像基地址、进程优先级、windows 子系统进程块、作业对象等属性。
KPROCESS内核进程块是EPROCESS块的一个组成部分,包含了进程对象的额外属性信息,也被成为进程控制块(PCB),包含了Windows内核在调度线程时所需的基本信息。
PEB进程环境块是 EPROCESS 块中指针指向的一个结构,其中包括了有关进程对象的额外信息,该结构处于进程的用户态内存中,部分信息需要用户代码维护。
线程管理
线程是程序执行流的最小单元,是进程中的一个实体,是被操作系统独立调度和分派的基本单位。线程本身独占系统资源,与同属一个进程的其他线程共享进程所拥有的全部资源。
ETHREAD是线程的基本结构,包含了内核线程块指针、创建时间和退出时间、所属进程的id标识、线程启动地址、定时器等属性。
KTHREAD是线程结构中关键的数据结构,位于系统内存内核空间,包含了windows内核为正在运行的线程执行线程调度和同步而需要访问的信息。
TEB线程环境块也位于进程的用户地址空间。
内存管理
windows中内存空间分为用户太内存地址和内核空间地址。
windows系统使用内存管理器进行内存管理,主要负责两个任务:
- 将进程虚拟地址空间转译到物理内存
- 内存不足时将数据换页到磁盘
对象与句柄管理
Windows 使用对象模型为执行体中实现的各种内部服务提供一致的、安全的访问途径,并设计了对象管理器负责创建、删除、保护和跟踪对象。
当一个进程根据名称来创建或者打开对象时,系统返回一个句柄,进程需要根据该句柄对该对象进行访问和管理。
对象句柄是一个索引,只想与对象相关的句柄表中的表项,通过句柄访问对象比直接使用名称访问对象高想,因为对象管理器可以跳过名称查找过程直接找到目标对象。