精华内容
下载资源
问答
  • 认识 IDT表

    千次阅读 2018-10-08 19:29:09
     B、认识IDT表  C、IDT表相关结构  D、读出IDT表-sidt指令  E、测试 一、反断点的一些原理  1、让他不能正常下断点 (0xCC断点int 3)  2、正常下断点后,让他不能断下(IDT HOOK) 二、IDT表 大小 00-0...

    A、反断点的一些原理

       B、认识IDT表

       C、IDT表相关结构

       D、读出IDT表-sidt指令

       E、测试

    一、反断点的一些原理

        1、让他不能正常下断点 (0xCC断点int 3)

        2、正常下断点后,让他不能断下(IDT HOOK)

    二、IDT表

    大小 00-0xFF ,0-255

    返回 iretd ;

    中断INT n

    举个简单的例子

    我们常会在驱动代码里写一行_asm int 3

    这样我们就手动设置了一个断点,当代码执行到这里 就会使CPU的执行暂停,并跳到中断处理函数中去执行。

     

    同样的和SSDT与SSDT Shadow一样 IDT也有一张IDT表(俗称中断描述符表)

    1、怎么样获取IDT表基址?

    2、怎么样读取IDT表 中的中断函数地址?

    __asm sidt idt_info

    #pragma pack(push)

    #pragma pack(1) //

    typedef struct _IDTR //IDT基址

    {

        USHORT limit; //范围 占8位

        ULONG base;  //基地址 占32位 PIDT_ENTRY类型指针

    }IDTR,*PIDTR;

    256*8

    typedef struct _IDT_ENTRY

    {

        USHORT offset_low; //中断处理函数地址低16位

        USHORT selector;

        UCHAR  reserved;

        UCHAR  type:4;

        UCHAR  always0:1;

        UCHAR  dpl:2;

        UCHAR  present:1;

        USHORT offset_high;//中断处理函数地址低16位

    }IDT_ENTRY,*PIDT_ENTRY;//+3.offset_high<<16+offset_low //int 3 中断处理函数地址

    #pragma pack(pop) //#pragma pack(pop)


    ULONG ReadIdt(ULONG CPUNUM)
    {
      IDTR idtr;//获取表基址
      PIDT_ENTRY Aidt;
           KdPrint(("IDT_ENTRY size=%d \n",sizeof(IDT_ENTRY)));
      __asm sidt idtr;//获取表基址信息
       KdPrint(("IDT BASE=%x \n",idtr.base));
      Aidt=PIDT_ENTRY(idtr.base);
      for (int i=0;i<0xff;i++)
      {
          ULONG cur_idt= Aidt->offset_high;
          cur_idt=cur_idt<<16;//得到高位地址
          cur_idt=cur_idt+ULONG(Aidt->offset_low);//合成 中断处理函数地址
         // if ( Aidt->offset_high==0) {__asm int 3};
         // if ( Aidt->offset_low==0) {__asm int 3};
         KdPrint(("high=%x,low=%x,IDT %d=%0000x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));
        //  if ( Aidt->offset_high==0)
        //  {  KdPrint(("high=%x,low=%x,IDT %d=%x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));}
        //  else{  KdPrint(("high=%x,low=%x,IDT %d=0000%x \n",Aidt->offset_high,Aidt->offset_low,i,cur_idt));}
            
          Aidt++;
        
      }  

      return idtr.base;

    }
     

     

     

    展开全文
  • 一 中断和IDT表概要 中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入int n指令可以产生n号中断和异常(n从0-ffh)。 每一种中断对应一个中断号。CPU执行中断指令时,会...

    IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的。

     

    一 中断和IDT表概要

     

        中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入int n指令可以产生n号中断和异常(n从0-ffh)。

        每一种中断对应一个中断号。CPU执行中断指令时,会去IDT表中查找对应的中断服务程序(interrupt service routine ,ISR)。ISR(为了表述方便用ISR n表示n号中断的处理程序),x86CPU最大可以支持256种中断。

        不管运行的是什么操作系统,只要是运行于x86架构,IDT结构必然存在。IDT表中的ISRs应该由操作系统提供。

        Intel指定或保留了前32个中断号的作用,操作系统可以指定其余的中断号的作用。

        中断处理过程是由CPU直接调用的,CPU有专门的寄存器IDTR来保存IDT在内存中的位置。程序可以使用LIDT和SIDT指令来读写IDTR。

        IDT是一个最大为256项的表,每个表项为8字节。也称为中断门。
        中断门和陷阱门描述中断/异常处理程序的人口点。

     

    二 Linux内核IDT表的初始化的基本情况

     

        linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为:

    struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };

    摘自arch/kernel/i386/traps.c;

     
       其中每一个表项均是一个desc_struct结构,该结构被定以为:

    struct desc_struct {
        unsigned long a,b;
    };
    摘自/inlcude/asm-i386/processor.h;

    可以看出IDT表共256个表项,每一个表项是8个字节,在idt_table数组被定义时静态初始化为0。

     

    操作系统启动时,在setup32_up()函数中,会调用setup_idt()函数初始化IDT,该函数使用AT&T汇编写成,在/arch/i386/kernel/head.S中;
    其主要代码如下:
        ......
        mov $256,%ecx
        rp_sidt:
        movl %eax,(%edi)
        movl %edx,4(%edi)
        addl $8,%edi
        dec %ecx
        ......


    AT&T汇编:
        movl:mov long,四个字节;
        引用寄存器要在寄存器号前加百分号%, 如"movl %eax, %ebx";
        使用立即数,要在数前面加符号$, 如"movl $0x04, %ebx";

     

    展开全文
  • 遍历IDT表和分析GDT表结构

    千次阅读 2016-12-26 13:44:48
    *IDTR寄存器共有48位,高32位是IDT表的基地址,低16位是IDT表的长度(Limit) *IDT表示一张位于物理内存中的线性表,共有256个表项。 */ typedef struct _IDT_INFO{ UINT16 uIdtLimit; UINT16 uLowIdtBa
    #include"basetsd.h"
    /*
    *IDT寄存器结构
    *IDTR寄存器共有48位,高32位是IDT表的基地址,低16位是IDT表的长度(Limit)
    *IDT表示一张位于物理内存中的线性表,共有256个表项。
    */
    typedef struct _IDT_INFO{
        UINT16 uIdtLimit;
        UINT16 uLowIdtBase;
        UINT16 uHighIdBase;
        }IDT_INFO,*PIDT_INFO;
    /* ----------------选择子-----------------------
    |   1   |     0    |  字节
    |7654321076543 2 10|  比特
    |-------------|-|--|  占位
    |    INDEX    |T|R |  含义
    |             |I|P |
    |             | |L |
    *Index : 在GDT数组或LDT数组的索引号
    *TI:Table Indicator ,这个值为0表示查找GDT,1表示查找LDT
    *RPL:请求特权级,以什么样的权限去访问段。
    */
    typedef struct _SELECTOR{
        int PRL:2;
        int TI:1;
        int Index:13;
        }SELECTOR,*PSELECTOR;
    /*----------------------段描述符结构--------------------
    |   7    |     6       |     5     |   4    |   3    |   2    |   1    |   0    |  字节
    |76543210|7 6 5 4 3210 |7 65 4 3210|76543210|76543210|76543210|76543210|76543210|  比特
    |--------|-|-|-|-|---- |-|--|-|----|--------|--------|--------|--------|--------|  占位
    |  BASE  |G|D|0|A|LIMIT|P|D |S|TYPE|<------- BASE 23-0 ------>|<-- LIMIT 15-0 ->|  含义
    |  31-24 | |/| |V|19-16| |P |
               |B| |L|     | |L |
    
    BASE: 段基址,由上图中的两部分(BASE 31-24 和 BSE23-0)组成
    G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB
    D/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段
    AVL: 该位是用户位,可以被用户自由使用
    LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字节)- 1。
    P: 段存在位,该位为 0 表示该段不存在,为 1 表示存在。
    DPL:段权限
    S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)
    TYPE: 根据 S 位的结果,再次对段类型进行细分。
    */
    typedef struct _GDT{
        INT64 Limit0_15 : 16;
        INT64 base0_23  : 24;
        INT64 TYPE      : 4;
        INT64 S         : 1;
        INT64 DPL       : 2;
        INT64 P         : 1;
        INT64 Limit16_19: 4;
        INT64 AVL       : 1;
        INT64 O         : 1;
        INT64 D_B       : 1;
        INT64 G         : 1;
        INT64 Base24_31 : 8;
        }GDT,*PGDT;//830089f700000068
    /*------------------IDT表----------
    |   7    |     6       |     5     |   4    |   3    |   2    |   1    |   0    |  字节
    |76543210|76543210|7 65 43210|76543210 |76543210|76543210|76543210     |76543210|  比特
    |-----------------|-|---|----|-------- |-----------------|----------------------|  占位
    |  uOffsetHigh    |P|DPL|type|reserve_1|    selector     | uOffsetLow       |  含义
    type 用来区分类型;中断恩的类型是0b00101(b代表的二进制数),中断门的类型是0b0D110,其中D为用来
    表示描述的是16位们(0)还是32位门(1),陷阱门的类型是0b0D111.
    *0x05 : 32 位的任务门
    *0x06 : 16位的中断门
    *0x07 : 16位的陷阱门
    *0x0E : 32位的中断门
    *0x0F : 32位的陷阱门
    */
    typedef struct  _IDT{
        UINT16 uOffsetLow ;  //处理程序低地址便宜
        UINT16 selector ;    //段选择子
        UINT8 reserve_1 ;    //保留
        UINT8 type       : 5; //中断类型
        UINT8 DPL        : 2;  //特权级
        UINT8 P          : 1;  //如未使用中断可置为0
        INT16 uOffsetHigh;     //处理程序高地址偏移
        }IDT,*PIDT;
    
    
    #include<ntddk.h>
    #include"IDT_GDT.h"
    VOID DriverUnload(PDRIVER_OBJECT objDriver)
        {
        //避免编译器报为引用参数的警告
        UNREFERENCED_PARAMETER(objDriver);
        DbgPrint("My Driver is unloading ...");
        }
    NTSTATUS DriverEntry(
        PDRIVER_OBJECT objDriver,
        PUNICODE_STRING strRegPath
        )
        {
        UNREFERENCED_PARAMETER(strRegPath);
        objDriver->DriverUnload = DriverUnload;
        DbgPrint("My first Driver ");
        KdBreakPoint();
        IDT_INFO stcIdtInfo = {0};
        PIDT pIdt =NULL;
        _asm sidt stcIdtInfo;
    #define MAKE_LONG(Low,High) ((UINT32) (((UINT16)(Low))|((UINT32)((UINT16)(High)))<<16) )
        pIdt = (PIDT)MAKE_LONG(
            stcIdtInfo.uLowIdtBase,stcIdtInfo.uHighIdBase);
        for(UINT32 uCount = 0;uCount<=256;uCount++)
            {
            //需要对16任务门进行特殊处理,具体参见软件调试275页
            //简单流程:TSS段选择子,GDT表,TSS段分析
            PIDT  pIndex = &pIdt[uCount];
            UINT32 uAddr = MAKE_LONG(pIndex->uOffsetLow,pIndex->uOffsetHigh);
            DbgPrint("Interrput %d: ISR 0x%08X\n",uCount,uAddr);
            }
        return STATUS_SUCCESS;
        }

    
    
    
    
    展开全文
  • 64位系统下的IDTR与IDT表

    千次阅读 2015-05-08 18:41:43
    已有许多资料介绍32位系统下的IDTR内容与IDT表项格式,本文专门对64位(IA-32e模式)下IDTR的内容和IDT表项格式进行介绍。

    已有许多资料介绍32位系统下的IDTR内容与IDT表项格式,本文专门对64位(IA-32e模式)下IDTR的内容和IDT表项格式进行介绍。

    作为对比,首先回顾32位下的IDTR与IDT表项:

    32位下,使用SIDT指令得到的IDTR内容为:

    Name Bit Description
    Limit 0..15 以字节为单位的IDT长度
    Base 16..47 IDT起始32位地址
    IDT的表项格式为:

    Name Bit Description
    LowOffset 0-15 服务函数地址低16位
    selector 16-31 段选择子
    zero 31-39 填充0x00
    attr 40-47 属性
    HighOffset 48-63 服务函数地址高16位

    64位下,使用SIDT指令得到的IDTR内容为:

    Name Bit Description
    Limit 2 以字节为单位的IDT长度
    Offset 8 IDT起始64位地址
    IDT的表项格式为:

    Name Bit Description
    LowOffset 0-15 服务函数地址低16位
    selector 16-31 段选择子
    zero 31-39 填充0x00
    attr 40-47 属性
    MiddleOffset 48-63 服务函数地址中16位
    HighOffset 64-95 服务函数地址高32位
    zero 96-127 填充0x00

    可以看出,64位下IDT的表项是基于32位进行的扩展,低64位没有变化,高64位的低32位用来扩展地址到64位,高64位的高32位填充0x00。

    IDT表项的属性部分的内容没有变化,许多讲32位IDT格式的资料已经介绍过,可以搜到很多。



    展开全文
  • IDT表连接

    2018-03-02 05:27:00
    一、table A为基础,左外连接table B,若要限制B的条件,需加(+),否则会对结果集以B的条件进行过滤。 DWD_REASON_CODE.CODE(+)=DWR_EDA_CL_TST_DFT.DEFECT_CODE and DWD_REASON_CODE.CODE_TYPE='DEFECTCODE'...
  • [fw]IDT表的初始化

    2013-10-14 17:11:00
    IDT表的初始化 linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, }; (摘自arch/kernel/...
  • 0号中断放在IDT表的第一项,也就是0字节处;1号中断放在IDT表的第二项,也就是8字节处;这时候我们来看一下,0×8=0,1×8=8,也就是说,向量号×8以后,我们在IDT表中找1号中断的处理程序时,就知道是在第8字节处找...
  • 获取多处理器系统的IDT表地址

    千次阅读 2011-10-20 23:19:52
    获取多处理器系统的IDT表地址,是通过设置操作所依赖的处理器核心来实现的. 在系统中处理器是从0开始进行编号的,如果只有一个处理器那它的编号就是0; 有两个就是0和1,依此类推. 获取系统处理器的总数是直接使用...
  • IDT表的初始化

    千次阅读 2013-09-27 11:50:55
    Cited from ...  linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0,
  • 遍历idt表_数组

    2017-05-11 06:05:20
    dizhi1 = (IDTENTRY*)MAKELONG(idt.IDT_LOWbase, idt.IDT_HIGbase); for (i = 0; i <=idt.IDT_limit / 8;i++) { KdPrint(("%d:%x 由高:%x 低:%x \n", i, MAKELONG(dizhi1[i].LowOffset, dizhi1[i].HiOffset),...
  • 关于IDT表

    2013-03-20 23:01:58
    我用bochs调试,查看idtr寄存器中的值的确是指向 IDT表的。idtr中的值没错。idrt中的地址是 IDT表的线性地址。 但是我填入处理函数是 虚拟地址。 请问我哪里错了。调试了一天了。。。 还有我怎么把选择子 0x10...
  • 驱动HOOK IDT表

    2010-04-22 12:21:32
     Idt1Address = MAKELONG(pstTempEntry->LowOffset, pstTempEntry->HiOffset);  pstTempEntry->LowOffset = (USHORT)IdtFun;  pstTempEntry->HiOffset = (USHORT)((ULONG)IdtFun >> 16); } 转载于:...
  • 一开始什么都不会,不知道如何下手,看ppt上面有个kd>,都不知道kd怎么出来的,自己打开windbg照着网上的选择attach to ……,随便找了个进程打开...网上搜索了一圈,才觉得查看GDT、IDT、TSS这些应该是属于内核调
  • 利用IDT表地址检测VM

    2008-12-15 19:30:00
    After spending many hours I figured out that the problematic instruction was actually SIDT, which was used by Suckit to get the address of the IDT table, and to hook its 0x80 entry through ...
  • IDT

    千次阅读 2012-05-29 15:43:04
    中断描述符表寄存器(Interrupt Descriptor ...IDT是一个有256个入口的线形表,每个IDT的入口是个8字节的描述符,所以整个IDT表的大小为256*8=2048 bytes. 每个中断向量关联了一个中断处理过程。所谓的中断向量就是把
  • IDT 中断描述符

    2012-02-14 13:11:00
    中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或...为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含...
  • 步骤: ...1、设置IDT表 可以参考《Inter微处理器 第8版》p545 2、加载IDT表(只有开中断,它才开始作用) 设置IDT和ISR,idt.c的源代码如下所示 #include "io.h" #include "video.h" #in
  • 整理下之前过驱动保护的学习,idt hook也是一个...//获取idt表地址 //修改int3中断函数 #include #include #ifdef __cplusplus extern "C" { #endif #include //这里包含需要用C方式编译的头文件 #ifdef __cplusplu
  • 遍历IDT和GDT

    2019-12-26 14:19:40
    文章目录结构体获取IDR遍历IDT 结构体 //idtr指向这个结构体 typedef struct _IDT_INFO{ UINT16 uIdtLimit; // IDT范围 UINT16 uLowIdtBase; // IDT低基址 UINT16 uHighIdtBase;...// IDT表中...
  • layout title subtitle date author header-img catalog tags ... Linux内核19-中断描述符表IDT的... 内核使用IDT表管理所有的中断和异常,那么它是如何初始化的呢? 2020-03-23 Tupelo Shen img/post-bg...
  • idt计量芯片上位机校软件,主要用到串口通讯
  • IDT 中断提权

    2019-11-07 00:04:52
    查看系统的IDT表 获取IDT表的地址 r idtr 然后使用dq 地址 l40 查看各异常的处理函数地址 l42 的最后一条就是0x20 的中断处理函数 与虚拟机中的进行比较 现在我们在中断表中加一个我们自己定义的中断,...
  • idt

    2011-03-15 15:47:00
    INTERRUPT DESCRIPTOR TABLE (IDT) The interrupt descriptor table (IDT) associates each exception or interrupt vector with a gate descriptor for the procedure or task used to service ...
  • 键盘idt hook 示键

    2009-03-28 20:58:20
    修改IDT表,使键盘中断IDT指向自己定义的中断处理函数,之后向跳向默认处理函数,实现HOOK
  • 三星公司选择IDT芯片用于单相电能.pdf
  • 获取中断描述符表IDT的信息

    千次阅读 2014-11-08 18:53:53
    //IDT表的最大项数为256 #define MAX_IDT_ENTRIES 0XFF #define MAKELONG(a, b)\ ((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) )) //SIDT返回的数据格式 typedef ...
  • x86 保护模式下,使用中断描述符 IDT. CPU中有 idtr 寄存器,保存 idt 的位置, lidt 指令用于加载 idt 到 idtr中。 idt 中的 项 是 8个字节, 一部分用户是段选择符,一部分是段内偏移量,还有中断DPL, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,279
精华内容 3,311
关键字:

idt表