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中的下标
-
- 保护模式下段寄存器变成段选择子(高速缓冲区),由 13位索引 1位TI 2位RPL 构成
-
分页机制
-
没有开启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_LEVEL 、APC_LEVEL 、DISPATCH_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.按照特定格式拆分虚拟地址
-
- 将拆分出来的虚拟地址分别作为: [页目录指针表索引] , 页目录索引, 页表索引, 页内偏移
- 得到的页目录地址和页表地址的低12位都是分页属性.不能直接使用.
Ox20 编程基础
- 0环和3环通讯
- 设备对象与符号链接绑定
- 缓冲区的使用
- 非驱动控制调用
- DO_BUFFERED_IO
- irp->AssociatedIrp.SystemBuffer
- DO_DIRECT_IO
- MmGetSystemAddressForMdlSafe( irp->MdlAddress , 0);
- DO_BUFFERED_IO
- DeviceIoControl
- CTL_CPOE
- METHOD_IN_DIRECT
- METHOD_OUT_DIRECT
- METHOD_NEITHER
- CTL_CPOE
- 非驱动控制调用
- 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 被压缩的文件夹名 压缩一个文件夹(包括里面的文件)
- 软件的安装 : apt-get 工具