Loading... ## 内核对象 * #### 什么是内核对象 * 操作系统中的三种对象:GDI对象(GDI32) USER对象(User32) 内核对象(kernel32) * 其中,GDI对象和USER对象在所有应用程序中的值都是固定的。(句柄时全局的) * 内核对象本**质上是一个结构体**,但是这个结构体**处于内核层**,在用户层,只能通过操作系统提供的接口进行间接的访问。 * 常见的内核对象有:**进程,线程,文件,邮槽,IOCP,事件** 等 * #### 内核对象的特点: * **全局性**:内核对象是跨进程的,可以在不同进程中访问同一个对象,通常使用字符串或ID标识一个对象。 * **引用计数**:每一个内核对象都有一个引用计数,当创建或者打开一个内核对象的时候,引用计数会+1,当关闭一个内核对象的时候,引用计数会-1,当引用计数为0时,内核对象会被销毁。 * **安全性**:除IOCP对象,所有的内核对象都需要传入**安全描述符**用于控制访问权限。 * **句柄表**:每一个进程都有一个句柄表,相同的内核对象在不同的进程中,可能句柄值是不一样的。 # 调试与异常 ### 异常分类 错误: 通常情况下都是可以被纠正的,产生了错误异常会保留当前线程环境。之后从IDT中找到该处理该错误。会线程环境。 陷阱: 陷阱异常产生时,错误指令已经被执行完毕。故而线程环境中保存的是产生异常指令的下一条指令。 陷阱类也可以恢复。常见陷阱有int3异常经常被用来做软中断。 终止: 极其严重的错误。程序无法执行。 ### 保护模式 保护模式,是一种80286系列和之后的x86兼容[CPU](https://baike.baidu.com/item/CPU)操作模式。保护模式有一些新的特色,设计用来增强[多工](https://baike.baidu.com/item/%E5%A4%9A%E5%B7%A5/9957464)和系统稳定度,像是 内存保护,[分页](https://baike.baidu.com/item/%E5%88%86%E9%A1%B5/2888444) 系统,以及硬件支援的 虚拟内存。大部分的现今 x86 [操作系统](https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/192) 都在保护模式下运行,包含 Linux、FreeBSD、以及 [微软](https://baike.baidu.com/item/%E5%BE%AE%E8%BD%AF/124767) Windows 2.0 和之后版本。 寻址采用32位段和偏移量,最大[寻址空间](https://baike.baidu.com/item/%E5%AF%BB%E5%9D%80%E7%A9%BA%E9%97%B4)4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。 <span style="color:Crimson ">保护模式操控的是线性地址是虚拟的。保护模式重要的三种表:LDT、IDT、GDT</span> ### 实模式 CPU[复位](https://baike.baidu.com/item/%E5%A4%8D%E4%BD%8D/6156307)(reset)或加电(power on)的时候以实模式启动,处理器以实模式工作。在实模式下,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位[偏移地址](https://baike.baidu.com/item/%E5%81%8F%E7%A7%BB%E5%9C%B0%E5%9D%80/3108819)形成20位的物理地址,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。在实模式下,所有的段都是可以读、写和可执行的 <span style="color:Crimson ">实模式直接操控的是物理地址</span> ### IDT [门描述符](http://www.irohane.top/index.php/archives/485/) 中断描述符表,在保护模式下,当有中断或者异常产生时,CPU通过IDT来寻找处理函数,可以说IDT表是CPU和操作系统交接中断和异常的关口。 IDT:是一张位于物理内存中的线性表,共256项,64位下元素长度为16歌字节,总长度为4096(4KB),在32位模式下,每个IDT表的元素长度位(8字节),IDT表总长度为2048字节(2字节)。 `_asm sidt SIDT; // 获取IDT 表` [代码遍历IDT表](http://www.irohane.top/index.php/archives/633/ "点击查看") ### GDT 全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。  | | | | | - | - | - | | P | 存在(Present)位 | P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。 | | DPL | 描述符特权级 | 表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。 | | S | 说明描述符的类型 | 对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。 | | TYPE | | 说明存储段描述符所描述的存储段的具体属性。 | [详细点击](https://www.cnblogs.com/starlitnext/archive/2013/03/07/2948929.html "点击进入") # 驱动 GDT:全局描述符表 LDT:局部描述符表 ### 页属性 \#Pragma alloc_text (类型,函数名) #pragma code_seg("PAGE") INIT,调用完即可释放 PAGE,位于分页内存 NONE_Page 位于非分页内存。 ### 段选择子 http://www.irohane.top/index.php/archives/484/ 段权限检查: CPL:当前代码的执行权限,CS段的B0和B1 DPL:存在于段描述符中,访问本段的内存所需要的权限。 RPL:存在于段寄存器加载时的段选择子中,描述访问者使用了什么样的权限对目标进行访问 IDT:中断描述符表: - 中断门描述符 - 陷阱们描述符 - 任务门描述符 TSS任务段: TSS是一块104字节的内存,存储很多寄存器。 https://blog.csdn.net/qq_41490873/article/details/89763741 分页机制: 页目录-页表(Page Table)-页表项(Page Table Entry,PTE) 页目录表(PDT) 页目录项(Page Directory Entry,PDE) 页表(PTT) 页面帧编号(Page Frame Number,PFN) ### PAE:(物理地址扩展) ### 控制寄存器: Cr0 Cr1 Cr2 Cr3 Cr4 https://blog.csdn.net/qq_37414405/article/details/84487591 CR0中含有控制处理器操作模式和状态的系统控制标志; CR1保留不用; CR2含有导致页错误的线性地址; CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base addressRegister)。 MSR 寄存器 -特殊模块寄存器。 温控-降频-升频 ### I/O I/O(Inout/Output)即输入输bai出设备! 输入设du备如zhi键盘,输出设备如显示器、打印dao机等! 输入输出设备是冯zhuan·诺伊曼体系中的重shu要组成部分,即五部分:运算器、控制器、存储器、输入和输出设备! ### IRP IRP :I/O Request Packet (IRP) I/O 请求 数据包 https://blog.csdn.net/AppleLost/article/details/5747004 数据的传输成为I/O,在驱动中I/O都是通过传递IRP实现的,而接受IRP的只能是设备对象。故而驱动程序通讯最常用的方式为IRP。一个驱动可有有多个设备对象。 ### IRQL IRQL:中断级别(Interrupt ReQuest Level -IRQL) Dispatch: 所有运行在Dispatch级的代码都会被进行原子操作,不能访问分页内容。一段时间内只能运行一段Dispatch级代码,全部执行完才会发生线程切换。 APC:比Dispatch第一个级别可以访问分页内存 Passive:最气的优先级。大多数代码这个优先级。 ### MDL 内存描述符表: MDL(Memory Descriptor List - KDL) 未公开结构。 ### SSDT 系统服务调度表(System Services Descriptor Table , SSDT) ### KPP KPP:内核补丁保护,详见[http://en.wikipedia.org/wiki/Kernel_Patch_Protection](http://en.wikipedia.org/wiki/Kernel_Patch_Protection) ### PG PG:基本可以认为和KPP是一个意思。 过PG:让PG无法工作,或工作无效。方法基本分为两类,动态(无需重启,重启后失效)和静态(需要重启,重启后一直生效)。 ### DSE DSE:数字签名强制。全名driver signature enforcement,可以简单理解为“驱动文件必须包含正确的交叉签名”。 过DSE:让DSE机制无法工作,或工作无效。方法基本分为两类,动态(无需重启,重启后失效)和静态(需要重启,重启后一直生效)。 免签加载驱动:就是加载一个无签名,或签名无效的驱动。 内核越狱:可以简单理解为{过PG+过DSE}。 ### HOOK 关于HOOK:MESSAGE HOOK是RING3的HOOK,所有RING3的HOOK(包括RING3 IAT/EAT/INLINE HOOK)都不被PG限制。RING0里对关键模块(包括但不限于NTOSKRNL.EXE、HAL.DLL、NDIS.SYS等)以及一些关键的表(包括但不限于SSDT、IDT、PsActiveProcessLinks等)的任何修改,都不被PG所允许。 最后修改:2021 年 03 月 16 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏
1 条评论
ヾ(≧∇≦*)ゝ