Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate)
Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate)
中断门和调用门类似,也是一种系统段。同样的它也可以用来提权。
中断门:
虽然中断门的段描述符如下:

但是中断门其实也就是段描述的一种。只不过有稍微区别,并且和调用门的段描述符类型非常相似。
中断门和调用门的区别:
这里将调用们的段描述符拿来对比下:

可以看到大致的结构是相同的,只不过 高32位的0-4位作为了一种保留位,采用0填充。
而Type位和段描述符中的s位采用了固定的值。其实这个就拿标准段描述符拿来对比就好了。
首先肯定是一个系统段,那么S字段就采用的是0,Type字段用来标记是系统段的哪一个段,根据下图就采用D,12的32-Bit Interrupt Gade段。

除了段描述符的区别,还有段选择子的区别:
中断门的段描述符存放在 idt表里面,前面解析的时候有提过idt和gdt表,两者用起来是一模一样的。
手动实现中断门:
构建中断门
跟前面一样根据段描述符来构建:
高32位:
0-7:
00
8-11:
E
12-15:
E
16-31:
0040
低32:
0-15:
1080
16-31:
0008
得到的段描述符为: 0040EE0000081080
注:这里的配段描述符的过程可以参考前一博客:Windows内核中的CPU架构-5-调用门(32-Bit Call Gate) - Sna1lGo - 博客园 (cnblogs.com)
中的流程。
存放中断门
中断门和调用门类似,我们需要把它的段描述符保存到表里,中断门的表是idt表,所以这里我们首先查看idt表里面的内容:

可以看到这个80b93500这里是空缺的,我们就把内容放到这里把: 
使用中断门:
就首先得明白什么是中断:(百度百科)中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
其实就是停止当前的操作跳转到自己定义的中断操作里面。有点类似与异常处理了,但是它针对的是CPU的,就CPU才是真正执行代码的硬件,就CPU直接停止当前操作去进行中断操作了。大概这样理解就可以了。
然后执行中断操作采用的是int 指令,然后后面会加一个编号,来标识该中断的段描述符在idt表中的位置。 比如说int 3这个中断指令,我们通过WinDbg来查看下它的段描述符信息:

它的段描述符为 83e7ee00 000086180,然后函数地址是83e76180,函数名称是 KiTrap03
所以我们调用的时候,直接在自己的内联汇编里面采用 int x指令就行。
由于前面我们把自己的中断描述符放到了80b93500的位置,所以通过计算(80b93500-80b93400)/8=20。我们直接采用int 0x20就行了。
还需要注意的是编写中断的函数和普通的函数不一样,不能采用ret和retn,得采用iretd作为返回指令。
使用中断门完整代码:
#include<iostream>
#include<Windows.h>
using namespace std;
void _declspec(naked) test()
{
_asm
{
push eax
mov eax, 0x80b93040
mov eax, [eax]
pop eax
iretd
}
}
int main()
{
printf("%x\n", test);
__asm
{
int 0x20
}
system("pause");
return 0;
}

这样我们的程序就可以美美地在x86系统上运行了。
小结
中断门和调用门比较类似,也是一种用来提权的东西。其核心理念在于Windows对intel CPU的一种利用。中断也是一个常用的计算机术语,其内容也包含了很多,这里就不深入了。任重而道远,大家加油。
Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate)的更多相关文章
- Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)
Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate) 陷阱门和中断门几乎是一模一样的: (注:图里高32位中的第11位的值为D,其实是1) 除了高32位中的type字段的内 ...
- Windows内核中的CPU架构-8-任务段TSS(task state segment)
Windows内核中的CPU架构-8-任务段TSS(task state segment) 任务段tss(task state segment)是针对于CPU的一个概念. 举一个简单的例子,你一个电脑 ...
- 02全志r58平台Android4.4.4下关闭内核中的CPU的开启关闭提示
02全志r58平台Android4.4.4下关闭内核中的CPU的开启关闭提示 2017/8/18 13:53 版本:V1.0 开发板:SC5806(全志R58平台) SDK:android4.4.4 ...
- Windows内核中的内存管理
内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- Windows内核开发-6-内核机制 Kernel Mechanisms
Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...
- 【windwos 操作系统】关键的Windows内核数据结构一览(上)
文章作者:r00tk1t 发布时间:2018年01月08日 - 21时56分 最后更新:2020年10月20日 - 21时01分 原始链接:https://r00tk1ts.github.io/201 ...
- Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(3)
纤程 纤程(fiber): 相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另一合作纤程,以实现合作纤程之间的协同.线程是在Wi ...
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...
随机推荐
- CentOS Linux 简单安装 clickhouse
本文只是仅仅的介绍安装 至于更多介绍请自信百度 1.本人 linux版本 [root@localhost /]# cat /etc/redhat-releaseCentOS Linux release ...
- ecshop调用指定广告的方法
在include/lib_goods.php文件下面新增:function getads($cat,$num){ $time = gmtime();$sql = "SELECT * FROM ...
- Dubbo 学习(二)服务注册与发现
在上一篇中我们提到,dubbo官网上推荐使用ZooKeeper作为注册中心.那么今天我们就通过代码来实践一番,看看一个dubbo的服务消费者如果找到通过ZooKeeper暴露自己的dubbo服务提供者 ...
- centos虚拟机中挂新硬盘
配置一台centos7,主硬盘20G装系统:副硬盘20G作为数据盘(格式:XFS)挂载到根目录:/vdir/ ,XFS是高性能文件系统. 外层vm硬盘添加好后,执行下面 1.fdisk -l //查看 ...
- P5056-[模板]插头dp
正题 题目链接:https://www.luogu.com.cn/problem/P5056 题目大意 \(n*m\)的网格,求有多少条回路可以铺满整个棋盘. 解题思路 插头\(dp\)的,写法是按照 ...
- P4126-[AHOI2009]最小割【网络流,tarjan】
正题 题目链接:https://www.luogu.com.cn/problem/P4126 题目大意 给出\(n\)个点\(m\)条边的一张有向图和起点终点.对于每条边求其是否是最小割的可行割/必须 ...
- Python3模块调用你真的会吗?不懂就来看一看?
前言 学习Python自动化框架的时候,各种文件会相互之间的调用.刚学的时候是不是很头疼!有木有!!一步步告诉你如何调用文件里的类和方法. 经常会调用同目录下的文件还有跨文件的调用 调用同目录下文件A ...
- Vite插件开发纪实:vite-plugin-monitor(下)
前言 上一篇介绍了Vite启动,HMR等时间的获取. 但各阶段详细的耗时信息,只能通过debug的日志获取 本文就实现一下debug日志的拦截 插件效果预览 --debug做了什么 项目启动指令 vi ...
- Java并发编程实战——读后感
未完待续. 阅读帮助 本文运用<如何阅读一本书>的学习方法进行学习. P15 表示对于书的第15页. Java并发编程实战简称为并发书或者该书之类的. 熟能生巧,不断地去理解,就像欣赏一部 ...
- 5-基本的sql查询以及函数的使用
基本SQL查询语句以及函数的使用 格式元素 描述 YYYY 四位的年份 MONTH 月份的英文全称 MON 月份的英文简写 MM 月份的数字表示 DD 日起的1-31数字表示 D 星期几的数字表示1- ...