zoukankan      html  css  js  c++  java
  • 中断门与陷阱门

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 

    中断门与陷阱门

    问题索引:

    1.中断的初步认识

    2.查看idt表

    3.中断门描述符

    4.中断门的执行流程

    5.构造中断门函数并通过iref返回

    6.陷阱门描述符

    7.修改IF标志位(只有在零环才能使用)

    8.中断门与陷阱门的区别

    9. 中断与异常的区别

    10.陷阱门实验

     

    问题解答:

    1. 中断的初步认识

      中断表中存在中断门、任务门、陷阱门。

      这一节我们讲解中断门与陷阱门,下一节讲解任务门。

      执行中断表中的各种门通过 int 指令,比如软件中断是 int 0x3。(注意 int 指令后面默认十进制)

    2. 查看idt表
      可以使用 r idtr 查看其位置,然后dq来读取。
      可以使用 "!idt x" 指令,来查看其各个中断号的信息。

      

    3. 中断门描述符
      其与之前的任务门类似,但是注意其没有参数

     

    4. 中断门的执行流程
      门的本质一样的,就是去gdt表找,根据gdt表找到对应的段选择子然后加载

    5.构造中断门进入函数并通过retf的方式返回

     1     // interpret gate.cpp : Defines the entry point for the console application.
     2     #include "stdafx.h"
     3     _declspec(naked) void func(){
     4         //printf("Hello World!
    ");
     5         __asm{
     6             
     7             pop eax;
     8             pop ebx;
     9             pop ecx;
    10             push ebx;
    11             push eax;
    12             retf;
    13             
    14             //iretd;
    15         }
    16     }
    17     
    18     int main(int argc, char* argv[])
    19     {
    20         printf("%x",func);
    21         getchar();
    22         __asm{
    23             int 0x20;
    24         }
    25         return 0;
    26     }

        windbg修改:
        eq 8003f500 0040ee00`00081005 (401005为其函数地址)
      注意:retf远调用,与iretd前面已经讲过不同了。

     6. 陷阱门描述符

    7.  陷阱门有什么用
        查看idt表,并没有陷阱门的影子

     但陷阱门可以接收中断,这一点还是值得使用的。

    8. 修改IF标志位的指令(只有在内核层才能使用)

     cli 清零 (不可被屏蔽)
        sti 置位 (可被屏蔽)

    9.中断门与陷阱门的区别

     中断门进入会执行cli,此时可屏蔽中断将不被屏蔽。
        陷阱门却不会,此时还可以被可屏蔽中断屏蔽。

    10. 中断与异常的区别
      中断往往是硬件触发的;异常往往是软件触发的

    11. 陷阱门实验

      实验代码(与上次的中断门一样)

     1     实验代码(与上次的中断门一样)
     2     // interpret gate.cpp : Defines the entry point for the console application.
     3     //
     4     
     5     #include "stdafx.h"
     6     _declspec(naked) void func(){
     7         //printf("Hello World!
    ");
     8         __asm{
     9             
    10             pop eax;
    11             pop ebx;
    12             pop ecx;
    13             push ebx;
    14             push eax;
    15             retf;
    16             
    17             //iretd;
    18         }
    19     }
    20     
    21     int main(int argc, char* argv[])
    22     {
    23         printf("%x",func);
    24         getchar();
    25         __asm{
    26             int 0x20;
    27         }
    28         return 0;
    29     }

       windbg修改
      eq 8003f500 0040ef00`001b1005  

  • 相关阅读:
    ✨Synchronized底层实现---偏向锁
    🌞LCP 13. 寻宝
    ✨Synchronized底层实现---概述
    ⛅104. 二叉树的最大深度
    c++多线程之顺序调用类成员函数
    C++ STL实现总结
    C#小知识
    C#中HashTable和Dictionary的区别
    WPF的静态资源(StaticResource)和动态资源(DynamicResource)
    WPF之再谈MVVM
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12436327.html
Copyright © 2011-2022 走看看