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

轉載請註明出處:http://blog.csdn.net/mengzhongfeixueyi/article/details/78033244html

 

一開始什麼都不會,不知道如何下手,看ppt上面有個kd>,都不知道kd怎麼出來的,本身打開windbg照着網上的選擇attach to ……,隨便找了個進程打開也不是kd開頭的。網上搜索了一圈,才以爲查看GDT、IDT、TSS這些應該是屬於內核調試的。收穫最大的是這篇博客(http://www.cnblogs.com/hustcat/articles/1714453.html),看了這篇文章以後進入內核調試,後面的問題就不大了。.net

大致講一下過程吧,主要仍是上面提到的這篇博客。3d

 

首先按照博客上面的地址下載安裝好,由於我看這篇以前已經下了windbg,因此後面只要再下第二個就好了。調試

(忘了說了,我是用vmware裝的winxp,這裏要在winxp裏查看因此要把windbg和package都放到虛擬機winxp裏。)htm

 

下面按照博客上面說的寫好安裝路徑就好了。blog

(話說以前舍友問我,她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(我當時多是由於看到了這篇博客纔想到去找內核調試的……)

相關文章
相關標籤/搜索