-
-
[原创]Windows内核逆向-----<中断处理 从硬件机制到用户驱动接管(上)>
-
发表于:
2021-11-20 17:20
23150
-
[原创]Windows内核逆向-----<中断处理 从硬件机制到用户驱动接管(上)>
本文主要描述 win10_x64 + IA32-E 的中断处理流程 从I/O APIC开始 至调用用户注册的 ISR 函数被调用结束 ,分为上下两篇
本章为上篇 主要描述 硬件机制
下篇 主要逆向 win10_x64 对中断的处理过程
会用到的东西:Win10_x64 + Windbg + IDA + Xp源代码 + Intel手册
二本 大三 水平有限 还请各位前辈多多指点
用于在多核心环境下处理中断而引入。
由两个组件构成 : APIC = I/O APIC + Local APIC
I/O APIC : 收集设备发来的中断,在此处建立中断请求于向量号的对应关系,分发中断请求至 Local APIC。
Local APIC : 每个核心存在一个,接收 I/O APIC 发来中断(此时已确定了中断向量号)并在合适的时机(优先级机制)将其提交给CPU,提供IPI(Inter-Processor Interrupt)核心间中断功能。
架构图如下
根据intel手册描述 存在两种方案: (win10_x64 采用第二种方案)
1) 通过 写IA32_APIC_BASE MSR寄存器,将其寄存器空间映射至内存,访问内存,进行配置。
2)通过读写MSR寄存器的方式对APIC提供的功能进行配置(所有配置均通过写MSR寄存器完成配置)。
local APIC 中 的 TPR(Task-Priority Register)寄存器 用于描述此local APIC 所属核心的当前的中断优先级,windows 内核中的 IRQL 机制的主要 功能 在 x86架构下依赖读写此寄存器实现,为了加快访问速度,在IA32-E模式下,TPR[7:4]被映射为Cr8寄存器,软件通过设置当前中断优先级(通过读写Cr8)来阻塞中断。
PPR(Processor-Priority Register)为只读寄存器 PPR[7:4] 等价于TPR[7:4] ,在local APIC中将中断发送给处理器前会通过读此寄存器的值决定是否打断处理器的执行流(投递中断),这也是系统在高IRQL不会被第IRQL中断的原因。
在 local APIC 向处理器 提交一个中断请求后,处理器会以其中断向量号为下标在中断向量表(IDT)中索引对应的中断处理例程,在栈中压入部分当前线程上下文后,跳转至系统的中断例程进行处理。下文描述相关设施。
(为了叙述简单忽略由IST 位引起的自动栈切换)
指出中断向量表的位置 (PG使用重新加载IDT表的方式使内核调试器无法处理调试相关的中断)
用于设置 IDTR寄存器的值
用于给出一个中断处理例程的地址,和其栈地址(间接指出),
每个可用的中断号对应一个,由操作系统构造并写入IDT表中说明了,一个由local APIC 投递的中断,被CPU收到时,应该跳转到的中断处理程序的位置,以及栈的位置。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-11-20 17:36
被小白养的菜鸡编辑
,原因: