首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在winxp环境下,用windbg查看GDT表、IDT表、TSS描述符

在winxp环境下,用windbg查看GDT表、IDT表、TSS描述符

作者头像
战神伽罗
发布2019-07-24 08:38:26
1.4K0
发布2019-07-24 08:38:26
举报

一开始什么都不会,不知道如何下手,看ppt上面有个kd>,都不知道kd怎么出来的,自己打开windbg照着网上的选择attach to ……,随便找了个进程打开也不是kd开头的。网上搜索了一圈,才觉得查看GDT、IDT、TSS这些应该是属于内核调试的。收获最大的是这篇博客(http://www.cnblogs.com/hustcat/articles/1714453.html),看了这篇文章之后进入内核调试,后面的问题就不大了。

大体讲一下过程吧,主要还是上面提到的这篇博客。

首先按照博客上面的地址下载安装好,因为我看这篇之前已经下了windbg,所以后面只要再下第二个就行了。

(忘了说了,我是用vmware装的winxp,这里要在winxp里查看所以要把windbg和package都放到虚拟机winxp里。)

下面按照博客上面说的写好安装路径就行了。

(话说之前舍友问我,她winxp虚拟机里面只有c盘没有d怎么办。

……

说得好像我不是只有c一样,这个路径只是给个参考啊,方便告诉你下面哪里要用到这个啊,你可以自己存在c盘或者随便什么地方,下面碰到要写路径的时候,人家博客里面放人家地址的地方,你放上你的地址不就行了……)

对了,下载的package(也就是博客里面第二个下载链接下载的那个)要记得双击安装啊,我一开始都没安装,下载出来什么样就什么样放在那儿……现在想想真是够傻……

如果输入!process出现博客上所说的错误,就按照博客上面的改就是了,注意写你自己的路径啊。

然后按照博客说的File->Kernel Debug->Local->选择本地内核调试,就会看到出来的command窗口前面是kd>了。

如果没有显示command窗口,点击View->Command,就会出现了。

(昨天舍友就半信半疑试这个法子,然后跟我说用了这个法子连命令框都不见了……(感觉到了怀疑的眼神……然后默默告诉她用View->command打开命令框))

出现kd>之后,后面查看起来就相对容易了些……不过我那时候还是搞了半天……

主要参考这篇博客(http://blog.csdn.net/cosmoslife/article/details/48785683)(话说这个博客的头像有点眼熟啊,会不会我上次那个安装bochs就是参考这位大牛的……)

一开始看这个博客没怎么看懂,不知道显示指定范围和查看GDT表之间的关系……我用的是他下面提到的另一种查看方式:即先使用!pcr:

lkd> !pcr

KPCR for Processor 0 at ffdff000:

Major 1 Minor 1

NtTib.ExceptionList:b2792c7c

NtTib.StackBase: b2792df0

NtTib.StackLimit: b2790000

NtTib.SubSystemTib: 00000000

NtTib.Version: 00000000

NtTib.UserPointer: 00000000

NtTib.SelfTib: 7ffde000

SelfPcr: ffdff000

Prcb: ffdff120

Irql: 00000000

IRR: 00000000

IDR: ffffffff

InterruptMode: 00000000

IDT: 8003f400

GDT: 8003f000

TSS: 80042000

CurrentThread: 820a97f0

NextThread: 00000000

IdleThread: 80553840

DpcQueue:

仔细看一下,会发现里面有显示IDT、GDT、TSS,那时候我以为这个就算查看到了吧,但是感觉又有点不相信,接着往下看,第一次看的时候没看懂下面的dd是干什么,后来好像有点懂了,这里dd后面加的是8003f000,这不就是GDT后面的值嘛,应该是它的地址了,那既然查看GDT是这样,那查看IDT、TSS不是也可以dd后面加它们对应的后面的数字就可以了嘛。

于是:查看GDT

lkd>dd 8003f000

8003f000 00000000 00000000 0000ffff 00cf9b00

8003f010 0000ffff 00cf9300 0000ffff 00cffb00

8003f020 0000ffff 00cff300 200020ab 80008b04

8003f030 f0000001 ffc093df e0000fff 7f40f3fd

8003f040 0400ffff 0000f200 00000000 00000000

8003f050 b0000068 80008954 b0680068 80008954

8003f060 2f40ffff 00009302 80003fff 0000920b

8003f070 700003ffff0092ff 0000ffff 80009a40

查看IDT表:

lkd>dd 8003f400

8003f400 0008f23c 80538e00 0008f3b4 80538e00

//可以看到IDT的基地址是在803f400

8003f410 0058113e 00008500 0008f784 8053ee00

8003f420 0008f904 8053ee00 0008fa60 80538e00

8003f430 0008fbd4 80538e00 0008023c 80548e00

8003f440 00501198 00008500 00080660 80548e00

8003f450 00080780 80548e00 000808c0 80548e00

8003f460 00080b1c 80548e00 00080e00 80548e00

8003f470 0008150880548e00 00081838 80548e00

查看TSS描述符:

lkd>dd 80042000

80042000 0c458b24 b2806de0 8b080010 758b0855

80042010 eac14008 ffe68110 030000ff 093802e0

80042020 e1750855 08458b5e 0310e8c1 c25d0845

80042030 ff8b000c 8bec8b55 c9330845 f7104d39

80042040 8b1f76d0 b60f0c55 d0331114 00ffe281

80042050 e8c10000 95043308 00433990 104d3b41

80042060 d0f70000 20ac0000 18000004 00000018

80042070 0000000000000000 00000000 00000000

也搜了一下一些命令的意思,但不知道对不对:使用命令lkd>!pcr扩展显示指定处理器上的处理器控制域的当前状态;用dd按字节查看内存。

网上还有很多博客的方法说可以用r idtr来查看idtr寄存器中保存的idt表地址,但是我使用时都出现Bad register error in 'r idtr'。在网上搜解决方法时,看雪论坛里面有一个回复说windbg不光这个不能直接看,调试寄存器也没法直接看,里面给出的解决方法还是使用!pcr。

也有查看IDT的其他方法:http://blog.csdn.net/hgy413/article/details/20310091(我当时可能是因为看到了这篇博客才想到去找内核调试的……)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档