首页
社区
课程
招聘
[求助]问一个IDT表不能读的问题。
发表于: 2009-12-12 14:23 3970

[求助]问一个IDT表不能读的问题。

2009-12-12 14:23
3970
typedef struct _idtr
{
  //定义中断描述符表的限制,长度两字节;
  short     IDTLimit;
  //定义中断描述服表的基址,长度四字节;
  unsigned int   IDTBase;
}IDTR,*PIDTR;

typedef struct _IDTENTRY
{
  unsigned short LowOffset;
  unsigned short selector;
  unsigned char unused_lo;
  unsigned char segment_type:4;   //0x0E is an interrupt gate
  unsigned char system_segment_flag:1;
  unsigned char DPL:2;   // descriptor privilege level
  unsigned char P:1; /* present */
  unsigned short HiOffset;
} IDTENTRY,*PIDTENTRY;

DWORD GetDBEntry()
{
  PIDTENTRY IdtEntry;
  DWORD Entry,Entry2;
  __asm sidt g_IDTR;
  IdtEntry = (PIDTENTRY)g_IDTR.IDTBase;
  Entry = IdtEntry->HiOffset<<16;//就是这里赋值出问题。显示该地址不能读。
  Entry |= IdtEntry->LowOffset;
  return Entry;
}

问问各位,是什么原因啊???是不是我的权限不够,难道非要到Ring 0才能做吗?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
sidt 可以在r3上执行
2009-12-12 14:30
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
那怎样才能不出问题呢?在线等。
2009-12-12 14:55
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
Ring0地址 你要能在Ring3直接访问那就牛X了
2009-12-12 15:10
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那要怎样才能访问那个值呢?
2009-12-12 15:27
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
进Ring0
2009-12-12 15:38
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
谢谢了!!我再找找怎样转换自已的特权级。
2009-12-12 15:55
0
雪    币: 91
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
从网上看到的代码,还是不形,会出错。
//////////////////////////////////////////////////////////////
#ifndef   GOTORING0_H_   
#define   GOTORING0_H_   
void   initRing0Func(void   (*));//the   function   used   as   parameter   
  //must   have   the   declare   of   "__declspec(naked)"   
  //or   it   will   make   the   system   stop     
void   executeFunc();
#endif

DWORDLONG   MYIDTR,SavedGate;   
WORD     OurGate[4]={0,0x28,0xee00,0};   
WORD     vmmver;   
void   (*Ring0Proc)=NULL;   
void   initRing0Func(void   (*function))   
{
        Ring0Proc=function;
}   
   
void   executeFunc()//主程序   
{
        _asm
        {
                mov eax,Ring0Proc   
        mov [OurGate], ax//将中断函数的地址   
        shr eax,16//填入新造的中断门   
        mov [OurGate+6],ax//描述符   
        sidt   word  ptr  MYIDTR   
        //将中断描述符表寄存器(IDTR)的内容取出   
        mov ebx,dword   ptr[MYIDTR+2]   
        //取出中断描述符表IDT基地址   
        add ebx,72   
        //计算Int9的描述符应放置的地址选用int9   
        //是因为它在Win32保护模式下未占用   
        mov edi,offset SavedGate   
        mov esi,ebx   
        movsd //保存原来的Int9描述符到   
        movsd //SavedGate以便恢复   
        mov edi,ebx   
        mov esi,offset OurGate   
        movsd //替换原来的中断门描述符   
        movsd //以安装中断服务例程   
        mov eax,0x6200//用以测试放在EAX中的数据   
        //能否正确传到Ring0中断   
        mov ecx,0   
        //用以测试放在ECX中的数据能否正确传到Ring0中断   
        mov ecx,0   
        //用以测试放在ECX中的数据能否正确传到Ring0中断   
                  //因为很多VxD服务都用此二寄存器传递参数   
        int 9h//人为触发中断,平时会出现保护错误蓝屏或非法操   
                            //作对话框,现在安装了中断服务例程后,就会通过   
                            //VMM在Ring0调用中断服务例程Ring0Proc   
        mov edi,ebx   
        mov esi,offset SavedGate   
        movsd   //恢复原来的中断门描述符   
        movsd
        }
}
2009-12-12 16:55
0
游客
登录 | 注册 方可回帖
返回
//