Ox00 前言

Ox01 保护模式

  • 分段模式

    • 保护模式下段寄存器变成段选择子(高速缓冲区),由 13位索引 1位TI 2位RPL 构成
      • RPL 表示当前访问段的请求权限

        • MAX(CPL,RPL)<= DPL

        • jmp fword 0x4B:00000000;

          • cpl 是执行这条指令的线程 cs 低两位

          • rpl 是 4b 的低两位 11,使用 3 的权限访问 4b对应的段描述符

          • dpl: 通过 4b找到的段描述符的 dpl 位

      • TI描述了当前使用GDT还是LDT,通常为0

        • rgdt是一个48位寄存器,gdtr 是基址 gdtl是范围
      • 索引即位于GDT或LDT中的下标

  • 分页机制

    • 没有开启PAE[10-10-12]:CR3(页目录表地址) -> 页目录项 -> 页表项 -> 物理地址

    • 开启了PAE[2-9-9-12]:CR3(页目录表指针) -> 页目录表地址->页目录表 -> 页表项 -> 物理页地址

    • 保护模式具体内容参考群文件内的保护模式笔记.


Ox02 内核编程

  • 相关术语

    • DriverEntry:驱动程序的入口函数,参数一是驱动对象,参数二是所在路径

      • 注意 DriverEntry 没有名称粉碎,C++编写需要加上 extern "C"
    • 驱动对象:DRIVER_OBJECT,类似于三环中应用程序的身份,不能进行直接通信

      • 使用其中的 DriverSection 可以遍历系统中的所有驱动对象
    • 设备对象:DEVICE_OBJECT,类似于三环中的窗口,是程序的一部分,可用作接收消息

      • 需要为设备指定符号链接名供三环访问,格式:\DosDevices\Name \??\Name.
    • IRP:I/O请求数据包,类似于窗口程序中的消息

    • IRQL:中断请求级别,从低到高为PASSIVE_LEVELAPC_LEVELDISPATCH_LEVEL(DPC)

      • 如果到来的中断有更高优先级,那么当前中断被挂起,CPU处理高优先级的中断
    • SSDT:系统服务描述表,保存了一系列的内核层函数

      • 通常使用 SYSENTER 进入内核,调用号保存在 eax寄存器,除此之外msr寄存器中的0x174号负责保存CS段寄存器,0x175号负责保存SS段寄存器,0x176号负责保存eip,通常是 KiFastCall,eax保存的是调用号
    • 分页内存和非分页内存

      • 分页内存:保存在页交换文件中的数据,使用会产生缺页异常

      • 非分页内存:直接保存在物理内存中的数据

  • R0/R3通信的通信方式

    • 直接方式(DO_DIRECT_IO):通过irp->MdlAddress获取

    • 缓冲区方式(DO_BUFFERD_IO):通过irp->AssociatedIrp.SystemBuffer获取

    • 其他方式(NULL): 通过irp->UserBuffer获取

  • DeviceIoControl

    • 使用 CTL_CODE 定义需要发送的控制码。

    • 四种数据的传输方式

      • METHOD_BUFFERED:缓冲区

      • METHOD_IN_DIRECT \ METHOD_OUT_DIRECT:直接方式

      • METHOD_NEITHER:两者都不的方式

  • 内核Hook

    • SSDT Hook -> 替换函数

    • SYSENTER Hook -> KiFastCallEntry

    • Object Hook -> OBJECT_TYPE -> _OBJECT_TYPE_INITIALIZER(保存了用于操作对象的函数)

  • 内核重载

    • 开辟一块新内存空间,模拟PE加载器将内核模块重新加载到这段内存,用于修复被Hook的SSDT表

Ox10 硬件基础

  • 分段基址
    • 段描述符
      • P-段描述符有效位
      • S-段类型
        • 0 - 系统段
        • 1 - 代码段或数据段
      • Type描述符类型
        • 系统段或数据段
        • 代码段或数据段时
          • 最高位是1表示代码段
          • 最高位是0表示数据段
      • G-粒度位
      • DPL-描述符特权等级
      • LIMIT段限长
      • BASE段基地址
    • 权限检查
  • 分页基址
    • CR3保存页目录基址
    • 虚拟地址转译物理地址
      • 未开启PAT:使用10-10-12
      • 开启PAE:使用2-9-9-12格式
      • 转译步骤
        • 1.通过CR3找到页目录基址(物理内存地址)
        • 2.按照特定格式拆分虚拟地址
          1. 将拆分出来的虚拟地址分别作为: [页目录指针表索引] , 页目录索引, 页表索引, 页内偏移
          • 得到的页目录地址和页表地址的低12位都是分页属性.不能直接使用.

Ox20 编程基础

  • 0环和3环通讯
    • 设备对象与符号链接绑定
    • 缓冲区的使用
      • 非驱动控制调用
        • DO_BUFFERED_IO
          • irp->AssociatedIrp.SystemBuffer
        • DO_DIRECT_IO
          • MmGetSystemAddressForMdlSafe(  irp->MdlAddress , 0);
      • DeviceIoControl
        • CTL_CPOE
          • METHOD_IN_DIRECT
          • METHOD_OUT_DIRECT
          • METHOD_NEITHER
    • IO栈
      • 获取当前IO栈位置: IoGetCurrentIrpStackLocation
    • IRP与派遣函数的对应关系
    • DeviceIoControl的CTL_CODE
  • 进程遍历
  • 线程遍历
  • 驱动模块遍历

Ox30 安全基础

  • 3环切换到0环
    • eax保存调用号
    • edx保存用户层栈顶地址
    • MSR[0x176]保存进入到0环地址(KiFastCallEntry )
  • HOOK KiFastCallEntry
  • HOOK SSDT

Ox40 Linux

  • 常用命令
    • 软件的安装 : apt-get 工具
      • update : 更新软件列表
      • install - 安装新的软件包
      • remove - 卸载指定名称的软件包
      • source - 下载指定名称的软件包的源代码
    • 目录相关命令
      • ls - 列出本目录的所有文件和文件夹
      • cd - 切换目录
      • mkdir - 创建目录
      • rmdir - 删除一个空目录
      • pwd - 查看当前目录的路径
      • 特殊的目录名:
        • . - 表示当前目录
        • .. 表示上层目录
        • / 表示根目录
        • ~ 表示用户的主目录
    • 文件相关
      • touch - 创建文件
      • 查看文件内容
        • cat - 查看文件的全部内容
        • more - 以百分比查看文件内容
        • less - 以百分比查看文件内容,查看后不会在终端留下查看的内容
        • hexdump - 以十六进制方式查看文件内容
      • 删除文件
        • rm - 删除文件,-r 可以递归删除目录
      • cp复制文件/文件夹
      • cp源文件名 目标文件名
      • mv - 剪切文件/目标文件名
      • mv 原文件名 目标文件名
      • ln 创建文件链接(快捷方式)-s 创建软链接
    • 用户和用户组
      • useradd - 添加一个用户
      • groupadd 添加一个用户组
      • usermod 修改用户信息(修改用户主目录,修改用户密码, 修改用户组)
      • passwd - 修改用户密码
    • 修改文件的权限
      • chown - 修改拥有者
      • chgrp - 修改用户组
      • chmod - 添加/删除3部分权限
      • 可以使用三位8进制数来表示权限
        • 第一位表示拥有者的权限
        • 第二位表示用户组权限
        • 第三位表示其它人的权限
        • 1 - 执行
        • 2 - 写
        • 4 - 读
    • 进程相关:
      • ps - 查看当前系统运行的进程,常用的参数 aux
      • top - 查看当前系统运行的进程(实时刷新)
      • kill - 结束一个进程. kill pid
    • 查找相关:
      • grep - 查找文件内容
      • whereis 在环境变量中查找指定命令或文件的位置
      • which 查看当前命令所在文件夹
      • find - 遍历磁盘查找文件 可以根据不同的条件来查找(文件创建日期,文件大小,文件修改日期)
      • man - 查看命令的帮助信息,同时也可以查看系统函数,C语言库函数的帮助.
    • 解压缩命令: tar
      • tar -xvf 压缩包名 - 解压到当前目录
      • tar -avf 压缩包名.gz或者压缩包名.bzip 被压缩的文件夹名 压缩一个文件夹(包括里面的文件)

Ox50 安卓安全