首页
社区
课程
招聘
[求助]SGDT指令的迷惑
2011-9-10 20:28 14133

[求助]SGDT指令的迷惑

2011-9-10 20:28
14133

    众所周知,SGDT指令用于获取GDT(全局描述表)的虚拟地址。
    最近,我在学习“无驱调用门”的知识,用VC++6.0编写了一个小程序进行测试,
其中的一段代码如下:
    asm { sgdt xxxx}
    问题出现了,此程序只有用olldbg单步到(过)sgdt指令,才能取得正确的地址,
在我的机器上是0x8003F000。其他任何运行方式(如离此指令较远的步过、直接运
行程序)都会使sgdt指令取GDT地址不正确,如:0xBxxxxxxx 等等。我确定我的
机器GDT地址是0x8003F000。
    此问题一直困惑着我,希望有遇到、解决类似问题的人能指点迷津。以便我把“无
驱调用门”的实践完美完成。
    先谢谢大家。


补充:虚拟机和本机都试过、windowxp sp2、裸机

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 577
活跃值: (168)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 1 2011-9-10 20:49
2
0
see see
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-9-10 20:50
3
0
理论上这是非特权指令,应该可以执行的。过完节了试试,
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
MengXP 2011-9-10 21:04
4
0
#include <stdio.h>

int main()
{
        char gdt[6];
        unsigned long gdtaddr;
        unsigned short gdtlimit;

        _asm sgdt gdt;
        gdtaddr = *(unsigned long *)(&gdt[2]);
        gdtlimit = *(unsigned short *)(&gdt[0]);
        printf("GDT Base: %08X\n",gdtaddr);
        printf("GDT Limit: %04X\n",gdtlimit);
}

GDT Base: 8003F000
GDT Limit: 03FF
Press any key to continue
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-9-11 22:52
5
0
[QUOTE=MengXP;999154]#include <stdio.h>

int main()
{
        char gdt[6];
        unsigned long gdtaddr;
        unsigned short gdtlimit;

        _asm sgdt gdt;
        gdtaddr = *(unsigned long ...[/QUOTE]

不用我试了,just this.
雪    币: 962
活跃值: (1536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loqich 2011-9-12 16:46
6
0
双核的问题。。。。2个地址都是正常的 你取得的是另一个cpu的
设置一下线程只绑定第1个cpu就行了
游客
登录 | 注册 方可回帖
返回