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)的更多相关文章

  1. Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate)

    Windows内核中的CPU架构-7-陷阱门(32-Bit Trap Gate) 陷阱门和中断门几乎是一模一样的: (注:图里高32位中的第11位的值为D,其实是1) 除了高32位中的type字段的内 ...

  2. Windows内核中的CPU架构-8-任务段TSS(task state segment)

    Windows内核中的CPU架构-8-任务段TSS(task state segment) 任务段tss(task state segment)是针对于CPU的一个概念. 举一个简单的例子,你一个电脑 ...

  3. 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 ...

  4. Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...

  5. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  6. Windows内核开发-6-内核机制 Kernel Mechanisms

    Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...

  7. 【windwos 操作系统】关键的Windows内核数据结构一览(上)

    文章作者:r00tk1t 发布时间:2018年01月08日 - 21时56分 最后更新:2020年10月20日 - 21时01分 原始链接:https://r00tk1ts.github.io/201 ...

  8. Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(3)

    纤程 纤程(fiber): 相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另一合作纤程,以实现合作纤程之间的协同.线程是在Wi ...

  9. windows内核代码之进程操作

    [toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...

随机推荐

  1. 微信小程序函数间传递url的参数丢失问题

    可以使用encodeURIComponent():函数可把字符串作为 URI 组件进行编码. 可以使用decodeURIComponent():函数可把字符串作为 URI 组件进行解码.  

  2. 超详细unittest单元测试框架总结

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  3. 自动化测试报告----allure2(一)

    以前都是使用TestNG自带的报告.jenkins中的报告等但没有个性化装饰报告,然而接触过allure2后发现原来报告还可以这么酷,接下来就带大家一起看一下allure2 报告炫在哪里? 我们先看如 ...

  4. requestAnimationFrame 切换页面问题

    requestAnimationFrame 切换页面时, 之前定时的内容还会继续执行. 所以 要注意处理动画函数内容,否则会出现死循环. 遇到的问题: 我在两个页面都有使用 requestAnimat ...

  5. genymotion从本地拖拽apk到模拟器失败,报错“An error occured while deploying the file……”-解决方案

    前两篇已经讲过genymotion的安装了,但genymotion构建的安卓模拟器的界面比较简洁,什么软件都没.那么我们进行测试之前,先将需要测试的apk安装到模拟器中,一般来说,直接将apk文件从本 ...

  6. python日志loguru

    文档:https://loguru.readthedocs.io/en/stable/overview.html#installation pip install loguru 使用 基本使用 ##终 ...

  7. UOJ#454-[UER #8]打雪仗【通信题】

    正题 题目链接:https://uoj.ac/problem/454 题目大意 \(Alice\)有一个长度为\(2n\)的\(01\)串,\(Bob\)有\(n\)个在\([1,2n]\)位置的下标 ...

  8. 踩坑系列《五》 Incorrect datetime value: 时间添加失败原因

    在进行单元测试中通过 new Date() 方式添加时间时,报了 Data truncation: Incorrect datetime value:这样的错误(我数据库表的时间类型是 datetim ...

  9. 11.4.5 LVS负载均衡常见工作模式总结以及ipvsadm

      NAT TUN DR RS any Tunneling Non-arp device RS network private LAN/WAN LAN RS number low(10-20) Hig ...

  10. 统计学习:线性支持向量机(SVM)

    学习策略 软间隔最大化 上一章我们所定义的"线性可分支持向量机"要求训练数据是线性可分的.然而在实际中,训练数据往往包括异常值(outlier),故而常是线性不可分的.这就要求我们 ...