深入解析 GDTCPU相信大家都知道是什么,但GDT对于一些不搞底层的人,知道的可能就不多了。
GDT是 global descriptor table的缩写,相应的还有个 1、留后门,就是进入 R0后设置(R3)进入 R0的后门(如调用门、中断门、任务门等)。
2、了解/编写操作系统。微软的 Windows经历了很多变化,如今都到了 Windows 10。但这对咱有意思吗?顶多认识了解和应用/利用。好像有不少的变化(PC端)都是基于硬件的,基于软件的算法不说。
3、虚拟化。如 intel-VT就要设置许多段(如 cs、ss、ds、es、fs、gs等)的 Base、Limit、access rights、Selectors等。
好了,废话不多说,进入正题。以 Windows系统为例进行分析。
kd vertarget
Windows XP Kernel Version 2600 (Service Pack 3) MP (1 procs) Free x86 compatible
Built by: 2600.xpsp_sp3_qfe.130704-0421
Machine Name:
Kernel base = 0x804d8000 PsLoadedModuleList = 0x8055e720
Debug session time: Thu Aug 6 14:25:16.468 2015 (UTC + 8:00)
System Uptime: 0 days 0:01:19.984
这是操作系统的环境信息,GDT是由 GDTR指向的。
kd r gdtr
gdtr=8003f000
其大小为:kdr gdtlgdtl=000003ff
其全部的内容为:
kd db 8003f000 L(000003ff + 1)
00 00 00 00 00 00 00 00-ff ff 00 00 00 9b cf 00
ff ff 00 00 00 93 cf 00-ff ff 00 00 00 fb cf 00
ff ff 00 00 00 f3 cf 00-ab 20 00 20 04 8b 00 80 ......... . ....
8003f000
8003f010
8003f020
8003f030
8003f040
8003f050
8003f060
8003f070
8003f080
8003f090
8003f0a0
8003f0b0
8003f0c0
8003f0d0
8003f0e0
8003f0f0
8003f100
8003f110
8003f120
8003f130
8003f140
8003f150
8003f160
8003f170
8003f180
8003f190
8003f1a0
8003f1b0
8003f1c0
8003f1d0
8003f1e0
8003f1f0
................
................
01 00 00 f0 df 93 c0 ff-ff 0f 00 00 00 f3 40 00
ff ff 00 04 00 f2 00 00-00 00 00 00 00 00 00 00
..............@.
................
68 00 00 27 55 89 00 80-68 00 68 27 55 89 00 80
h..'U...h.h'U...
ff ff 40 2f 02 93 00 00-ff 3f 00 80 0b 92 00 00
ff 03 00 70 ff 92 00 ff-ff ff 00 00 40 9a 00 80
ff ff 00 00 40 92 00 80-00 00 00 00 00 92 00 00
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
68 00 b8 16 38 89 00 82-00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..@/.....?......
...p........@...
....@...........
................
h...8...........
................
................
................
ff ff 00 f0 50 9f 00 f8-ff ff 00 00 00 92 00 00
b7 03 40 d0 4f 98 00 80-ff ff 00 00 00 92 00 00
ff ff 00 24 4d 93 40 ba-ff ff 00 24 4d 93 40 ba
....P...........
..@.O...........
...$M.@....$M.@.
ff ff 00 24 4d 93 40 ba-20 f1 03 80 00 00 00 00 ...$M.@. .......
28 f1 03 80 00 00 00 00-30 f1 03 80 00 00 00 00
38 f1 03 80 00 00 00 00-40 f1 03 80 00 00 00 00
48 f1 03 80 00 00 00 00-50 f1 03 80 00 00 00 00
58 f1 03 80 00 00 00 00-60 f1 03 80 00 00 00 00
68 f1 03 80 00 00 00 00-70 f1 03 80 00 00 00 00
78 f1 03 80 00 00 00 00-80 f1 03 80 00 00 00 00
88 f1 03 80 00 00 00 00-90 f1 03 80 00 00 00 00
98 f1 03 80 00 00 00 00-a0 f1 03 80 00 00 00 00
a8 f1 03 80 00 00 00 00-b0 f1 03 80 00 00 00 00
b8 f1 03 80 00 00 00 00-c0 f1 03 80 00 00 00 00
c8 f1 03 80 00 00 00 00-d0 f1 03 80 00 00 00 00
d8 f1 03 80 00 00 00 00-e0 f1 03 80 00 00 00 00
e8 f1 03 80 00 00 00 00-f0 f1 03 80 00 00 00 00
f8 f1 03 80 00 00 00 00-00 f2 03 80 00 00 00 00
(.......0.......
8.......@.......
H.......P.......
X.......`.......
h.......p.......
x...............
................
................
................
................
................
................
................
................
8003f200
8003f210
8003f220
8003f230
8003f240
8003f250
8003f260
8003f270
8003f280
8003f290
8003f2a0
8003f2b0
8003f2c0
8003f2d0
8003f2e0
8003f2f0
8003f300
8003f310
8003f320
8003f330
8003f340
8003f350
8003f360
8003f370
8003f380
8003f390
8003f3a0
8003f3b0
8003f3c0
8003f3d0
8003f3e0
8003f3f0
08 f2 03 80 00 00 00 00-10 f2 03 80 00 00 00 00 ................
18 f2 03 80 00 00 00 00-20 f2 03 80 00 00 00 00 ........ .......
28 f2 03 80 00 00 00 00-30 f2 03 80 00 00 00 00
38 f2 03 80 00 00 00 00-40 f2 03 80 00 00 00 00
48 f2 03 80 00 00 00 00-50 f2 03 80 00 00 00 00
58 f2 03 80 00 00 00 00-60 f2 03 80 00 00 00 00
68 f2 03 80 00 00 00 00-70 f2 03 80 00 00 00 00
78 f2 03 80 00 00 00 00-80 f2 03 80 00 00 00 00
88 f2 03 80 00 00 00 00-90 f2 03 80 00 00 00 00
98 f2 03 80 00 00 00 00-a0 f2 03 80 00 00 00 00
a8 f2 03 80 00 00 00 00-b0 f2 03 80 00 00 00 00
b8 f2 03 80 00 00 00 00-c0 f2 03 80 00 00 00 00
c8 f2 03 80 00 00 00 00-d0 f2 03 80 00 00 00 00
d8 f2 03 80 00 00 00 00-e0 f2 03 80 00 00 00 00
e8 f2 03 80 00 00 00 00-f0 f2 03 80 00 00 00 00
f8 f2 03 80 00 00 00 00-00 f3 03 80 00 00 00 00
08 f3 03 80 00 00 00 00-10 f3 03 80 00 00 00 00
(.......0.......
8.......@.......
H.......P.......
X.......`.......
h.......p.......
x...............
................
................
................
................
................
................
................
................
................
18 f3 03 80 00 00 00 00-20 f3 03 80 00 00 00 00 ........ .......
28 f3 03 80 00 00 00 00-30 f3 03 80 00 00 00 00
38 f3 03 80 00 00 00 00-40 f3 03 80 00 00 00 00
48 f3 03 80 00 00 00 00-50 f3 03 80 00 00 00 00
58 f3 03 80 00 00 00 00-60 f3 03 80 00 00 00 00
68 f3 03 80 00 00 00 00-70 f3 03 80 00 00 00 00
78 f3 03 80 00 00 00 00-80 f3 03 80 00 00 00 00
88 f3 03 80 00 00 00 00-90 f3 03 80 00 00 00 00
98 f3 03 80 00 00 00 00-a0 f3 03 80 00 00 00 00
a8 f3 03 80 00 00 00 00-b0 f3 03 80 00 00 00 00
b8 f3 03 80 00 00 00 00-c0 f3 03 80 00 00 00 00
c8 f3 03 80 00 00 00 00-d0 f3 03 80 00 00 00 00
d8 f3 03 80 00 00 00 00-e0 f3 03 80 00 00 00 00
e8 f3 03 80 00 00 00 00-f0 f3 03 80 00 00 00 00
f8 f3 03 80 00 00 00 00-00 00 00 00 00 00 00 00
(.......0.......
8.......@.......
H.......P.......
X.......`.......
h.......p.......
x...............
................
................
................
................
................
................
................
................
注意:是 8字节对齐,并不是 8的整数倍。不过这些数据不好看,要解析,这就是我们的任务。其实也可以这样看:
kd dg 0 3ff
P Si Gr Pr Lo
l ze an es ng Flags
Sel
Base
Limit
Type
---- -------- -------- ---------- - -- -- -- -- --------
0000 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
0008 00000000 ffffffff Code RE Ac 0 Bg Pg P Nl 00000c9b
0010 00000000 ffffffff Data RW Ac 0 Bg Pg P Nl 00000c93
0018 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb
0020 00000000 ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3
0028 80042000 000020ab TSS32 Busy 0 Nb By P Nl 0000008b
0030 ffdff000 00001fff Data RW Ac 0 Bg Pg P Nl 00000c93
0038 00000000 00000fff Data RW Ac 3 Bg By P Nl 000004f3
0040 00000400 0000ffff Data RW
3 Nb By P Nl 000000f2
0048 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
0050 80552700 00000068 TSS32 Avl 0 Nb By P Nl 00000089
0058 80552768 00000068 TSS32 Avl 0 Nb By P Nl 00000089
0060 00022f40 0000ffff Data RW Ac 0 Nb By P Nl 00000093
0068 000b8000 00003fff Data RW
0070 ffff7000 000003ff Data RW
0078 80400000 0000ffff Code RE
0080 80400000 0000ffff Data RW
0088 00000000 00000000 Data RW
0 Nb By P Nl 00000092
0 Nb By P Nl 00000092
0 Nb By P Nl 0000009a
0 Nb By P Nl 00000092
0 Nb By P Nl 00000092
0090 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
0098 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00A0 823816b8 00000068 TSS32 Avl 0 Nb By P Nl 00000089
00A8 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00B0 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00B8 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00C0 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00C8 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00D0 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00D8 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
00E0 f850f000 0000ffff Code RE Ac 0 Nb By P Nl 0000009f
00E8 00000000 0000ffff Data RW
00F0 804fd040 000003b7 Code EO
00F8 00000000 0000ffff Data RW
0 Nb By P Nl 00000092
0 Nb By P Nl 00000098
0 Nb By P Nl 00000092
0100 ba4d2400 0000ffff Data RW Ac 0 Bg By P Nl 00000493
0108 ba4d2400 0000ffff Data RW Ac 0 Bg By P Nl 00000493
0110 ba4d2400 0000ffff Data RW Ac 0 Bg By P Nl 00000493
0118 00008003 0000f120 Reserved 0 Nb By Np Nl 00000000
0120 00008003 0000f128 Reserved 0 Nb By Np Nl 00000000
0128 00008003 0000f130 Reserved 0 Nb By Np Nl 00000000
0130 00008003 0000f138 Reserved 0 Nb By Np Nl 00000000
0138 00008003 0000f140 Reserved 0 Nb By Np Nl 00000000
0140 00008003 0000f148 Reserved 0 Nb By Np Nl 00000000
0148 00008003 0000f150 Reserved 0 Nb By Np Nl 00000000
0150 00008003 0000f158 Reserved 0 Nb By Np Nl 00000000
0158 00008003 0000f160 Reserved 0 Nb By Np Nl 00000000
0160 00008003 0000f168 Reserved 0 Nb By Np Nl 00000000
0168 00008003 0000f170 Reserved 0 Nb By Np Nl 00000000
0170 00008003 0000f178 Reserved 0 Nb By Np Nl 00000000
0178 00008003 0000f180 Reserved 0 Nb By Np Nl 00000000
0180 00008003 0000f188 Reserved 0 Nb By Np Nl 00000000
0188 00008003 0000f190 Reserved 0 Nb By Np Nl 00000000
0190 00008003 0000f198 Reserved 0 Nb By Np Nl 00000000
0198 00008003 0000f1a0 Reserved 0 Nb By Np Nl 00000000
01A0 00008003 0000f1a8 Reserved 0 Nb By Np Nl 00000000
01A8 00008003 0000f1b0 Reserved 0 Nb By Np Nl 00000000
01B0 00008003 0000f1b8 Reserved 0 Nb By Np Nl 00000000
01B8 00008003 0000f1c0 Reserved 0 Nb By Np Nl 00000000
01C0 00008003 0000f1c8 Reserved 0 Nb By Np Nl 00000000
01C8 00008003 0000f1d0 Reserved 0 Nb By Np Nl 00000000
01D0 00008003 0000f1d8 Reserved 0 Nb By Np Nl 00000000
01D8 00008003 0000f1e0 Reserved 0 Nb By Np Nl 00000000
01E0 00008003 0000f1e8 Reserved 0 Nb By Np Nl 00000000
01E8 00008003 0000f1f0 Reserved 0 Nb By Np Nl 00000000
01F0 00008003 0000f1f8 Reserved 0 Nb By Np Nl 00000000
01F8 00008003 0000f200 Reserved 0 Nb By Np Nl 00000000
0200 00008003 0000f208 Reserved 0 Nb By Np Nl 00000000
0208 00008003 0000f210 Reserved 0 Nb By Np Nl 00000000
0210 00008003 0000f218 Reserved 0 Nb By Np Nl 00000000
0218 00008003 0000f220 Reserved 0 Nb By Np Nl 00000000
0220 00008003 0000f228 Reserved 0 Nb By Np Nl 00000000
0228 00008003 0000f230 Reserved 0 Nb By Np Nl 00000000
0230 00008003 0000f238 Reserved 0 Nb By Np Nl 00000000
0238 00008003 0000f240 Reserved 0 Nb By Np Nl 00000000
0240 00008003 0000f248 Reserved 0 Nb By Np Nl 00000000
0248 00008003 0000f250 Reserved 0 Nb By Np Nl 00000000
0250 00008003 0000f258 Reserved 0 Nb By Np Nl 00000000
0258 00008003 0000f260 Reserved 0 Nb By Np Nl 00000000
0260 00008003 0000f268 Reserved 0 Nb By Np Nl 00000000
0268 00008003 0000f270 Reserved 0 Nb By Np Nl 00000000
0270 00008003 0000f278 Reserved 0 Nb By Np Nl 00000000
0278 00008003 0000f280 Reserved 0 Nb By Np Nl 00000000
0280 00008003 0000f288 Reserved 0 Nb By Np Nl 00000000
0288 00008003 0000f290 Reserved 0 Nb By Np Nl 00000000
0290 00008003 0000f298 Reserved 0 Nb By Np Nl 00000000
0298 00008003 0000f2a0 Reserved 0 Nb By Np Nl 00000000
02A0 00008003 0000f2a8 Reserved 0 Nb By Np Nl 00000000
02A8 00008003 0000f2b0 Reserved 0 Nb By Np Nl 00000000
02B0 00008003 0000f2b8 Reserved 0 Nb By Np Nl 00000000
02B8 00008003 0000f2c0 Reserved 0 Nb By Np Nl 00000000
02C0 00008003 0000f2c8 Reserved 0 Nb By Np Nl 00000000
02C8 00008003 0000f2d0 Reserved 0 Nb By Np Nl 00000000
02D0 00008003 0000f2d8 Reserved 0 Nb By Np Nl 00000000
02D8 00008003 0000f2e0 Reserved 0 Nb By Np Nl 00000000
02E0 00008003 0000f2e8 Reserved 0 Nb By Np Nl 00000000
02E8 00008003 0000f2f0 Reserved 0 Nb By Np Nl 00000000
02F0 00008003 0000f2f8 Reserved 0 Nb By Np Nl 00000000
02F8 00008003 0000f300 Reserved 0 Nb By Np Nl 00000000
0300 00008003 0000f308 Reserved 0 Nb By Np Nl 00000000
0308 00008003 0000f310 Reserved 0 Nb By Np Nl 00000000
0310 00008003 0000f318 Reserved 0 Nb By Np Nl 00000000
0318 00008003 0000f320 Reserved 0 Nb By Np Nl 00000000
0320 00008003 0000f328 Reserved 0 Nb By Np Nl 00000000
0328 00008003 0000f330 Reserved 0 Nb By Np Nl 00000000
0330 00008003 0000f338 Reserved 0 Nb By Np Nl 00000000
0338 00008003 0000f340 Reserved 0 Nb By Np Nl 00000000
0340 00008003 0000f348 Reserved 0 Nb By Np Nl 00000000
0348 00008003 0000f350 Reserved 0 Nb By Np Nl 00000000
0350 00008003 0000f358 Reserved 0 Nb By Np Nl 00000000
0358 00008003 0000f360 Reserved 0 Nb By Np Nl 00000000
0360 00008003 0000f368 Reserved 0 Nb By Np Nl 00000000
0368 00008003 0000f370 Reserved 0 Nb By Np Nl 00000000
0370 00008003 0000f378 Reserved 0 Nb By Np Nl 00000000
0378 00008003 0000f380 Reserved 0 Nb By Np Nl 00000000
0380 00008003 0000f388 Reserved 0 Nb By Np Nl 00000000
0388 00008003 0000f390 Reserved 0 Nb By Np Nl 00000000
0390 00008003 0000f398 Reserved 0 Nb By Np Nl 00000000
0398 00008003 0000f3a0 Reserved 0 Nb By Np Nl 00000000
03A0 00008003 0000f3a8 Reserved 0 Nb By Np Nl 00000000
03A8 00008003 0000f3b0 Reserved 0 Nb By Np Nl 00000000
03B0 00008003 0000f3b8 Reserved 0 Nb By Np Nl 00000000
03B8 00008003 0000f3c0 Reserved 0 Nb By Np Nl 00000000
03C0 00008003 0000f3c8 Reserved 0 Nb By Np Nl 00000000
03C8 00008003 0000f3d0 Reserved 0 Nb By Np Nl 00000000
03D0 00008003 0000f3d8 Reserved 0 Nb By Np Nl 00000000
03D8 00008003 0000f3e0 Reserved 0 Nb By Np Nl 00000000
03E0 00008003 0000f3e8 Reserved 0 Nb By Np Nl 00000000
03E8 00008003 0000f3f0 Reserved 0 Nb By Np Nl 00000000
03F0 00008003 0000f3f8 Reserved 0 Nb By Np Nl 00000000
03F8 00000000 00000000 Reserved 0 Nb By Np Nl 00000000
我们的功能就是要解析出这样的格式。注意,另外一个话题是:也可以手动分析出这个格式,如:
kd r cs
cs=00000008
然后根据一定的算法得出的结论要如下(一种思路是根据_KGDTENTRY的定义):
kd dg cs
P Si Gr Pr Lo
Sel
Base
Limit
Type
l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0008 00000000 ffffffff Code RE Ac 0 Bg Pg P Nl 00000c9b
这个算法就不说了,相信你会的。GDT就是一个(数组格式的)表,里面的每一项是一个 Segment Descriptors。
关于这个的格式,可见 Intel 64 and IA-32 Architectures Software Developer’s Manual(OrderNumber: 325462-055US June 2015)的 Volume 3: System Programming Guide的 3.4.5 SegmentDescriptors小节及附图。
Segment Descriptors具体分两大类:一类是 application (code or data) descriptor,这就是常见的代码/数据段,如大多数的 CS、DS都指向这里;一类是 system descriptor,这里又分为 system-segment descriptors(LDT and TSS segments)。但是,这些结构在 Windows下的定义是什么样的呢?经查 WRK和 WINDBG,结果如下:
// Special Registers for i386
typedef struct _X86_DESCRIPTOR {
USHORT
USHORT
ULONG
Pad;
Limit;
Base;
} X86_DESCRIPTOR, *PX86_DESCRIPTOR;
// GDT Entry
typedef struct _KGDTENTRY {
USHORT
USHORT
union {
LimitLow;
BaseLow;
struct {
UCHAR
UCHAR
UCHAR
UCHAR
BaseMid;
Flags1;
// Declare as bytes to avoid alignment
// Problems.
Flags2;
BaseHi;
} Bytes;
struct {
ULONG
BaseMid : 8;
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
Type : 5;//把 S位包含进去了,也就是是否为系统段描述符的位。
Dpl : 2;
Pres : 1;
LimitHi : 4;
Sys : 1;//即 AVL,系统软件自定义的。
Reserved_0 : 1;//LongMode
Default_Big : 1;//即 INTEL的 D/B (default operation size/default stack
pointer size and/or upper bound) flag
ULONG
ULONG
Granularity : 1;
BaseHi : 8;
} Bits;
} HighWord;
} KGDTENTRY, *PKGDTENTRY;
为什么定义的名字是 KGDTENTRY呢?其实你想想结构的位置。这个其实就是SegmentDescriptors,但是定义和 Intel的不完全一样。
kd dt nt!_KGDTENTRY
+0x000 LimitLow
+0x002 BaseLow
+0x004 HighWord
kd dt nt!_KGDTENTRY -b
+0x000 LimitLow
+0x002 BaseLow
+0x004 HighWord
+0x000 Bytes
: Uint2B
: Uint2B
: __unnamed
: Uint2B
: Uint2B
: __unnamed
: __unnamed
: UChar
+0x000 BaseMid
+0x001 Flags1
: UChar
+0x002 Flags2
: UChar
+0x003 BaseHi
+0x000 Bits
: UChar
: __unnamed
+0x000 BaseMid
+0x000 Type
: Pos 0, 8 Bits
: Pos 8, 5 Bits
: Pos 13, 2 Bits
: Pos 15, 1 Bit
: Pos 16, 4 Bits
: Pos 20, 1 Bit
: Pos 21, 1 Bit
: Pos 22, 1 Bit
: Pos 23, 1 Bit
: Pos 24, 8 Bits
+0x000 Dpl
+0x000 Pres
+0x000 LimitHi
+0x000 Sys
+0x000 Reserved_0
+0x000 Default_Big
+0x000 Granularity
+0x000 BaseHi
上面分析的是 32位下的 Windows系统,再看看64位下Windows的GDT。
0: kd vertarget
Windows 7 Kernel Version 7601 (Service Pack 1) MP (2 procs) Free x64
Built by: 7601.18869.amd64fre.win7sp1_gdr.150525-0603
Machine Name:
Kernel base = 0xfffff800`01e64000 PsLoadedModuleList = 0xfffff800`020ab730
Debug session time: Thu Aug 6 14:37:33.359 2015 (UTC + 8:00)
System Uptime: 0 days 0:13:15.757
0: kd r gdtr
gdtr=fffff80001d51000
0: kd r gdtl
gdtl=007f
0: kd db fffff80001d51000 L(007f + 1)
fffff800`01d51000
fffff800`01d51010
fffff800`01d51020
fffff800`01d51030
fffff800`01d51040
fffff800`01d51050
fffff800`01d51060
fffff800`01d51070
0: kd dg 0 80
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 9b 20 00-ff ff 00 00 00 93 cf 00 ...... .........
ff ff 00 00 00 fb cf 00-ff ff 00 00 00 f3 cf 00
................
00 00 00 00 00 fb 20 00-00 00 00 00 00 00 00 00 ...... .........
67 00 80 20 d5 8b 00 01-00 f8 ff ff 00 00 00 00 g.. ............
00 3c 00 a0 f9 f3 40 ff-00 00 00 00 00 00 00 00 .....@.........
ff ff 00 00 00 9a cf 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
P Si Gr Pr Lo
l ze an es ng Flags
Sel
Base
Limit
Type
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0000 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0008 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0010 00000000`00000000 00000000`00000000 Code RE Ac 0 Nb By P Lo 0000029b
0018 00000000`00000000 00000000`ffffffff Data RW Ac 0 Bg Pg P Nl 00000c93
0020 00000000`00000000 00000000`ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb
0028 00000000`00000000 00000000`ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3
0030 00000000`00000000 00000000`00000000 Code RE Ac 3 Nb By P Lo 000002fb
0038 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0040 00000000`01d52080 00000000`00000067 TSS32 Busy 0 Nb By P Nl 0000008b
0048 00000000`0000ffff 00000000`0000f800 Reserved 0 Nb By Np Nl 00000000
0050 ffffffff`fff9a000 00000000`00003c00 Data RW Ac 3 Bg By P Nl 000004f3
0058 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0060 00000000`00000000 00000000`ffffffff Code RE
0 Bg Pg P Nl 00000c9a
0068 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0070 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0078 00000000`00000000 00000000`00000000 Reserved 0 Nb By Np Nl 00000000
0080 Unable to get descriptor
WRK及WINDBG的相关(验证)信息如下:
// Special Registers for AMD64.
typedef struct _AMD64_DESCRIPTOR {
USHORT
USHORT
Pad[3];
Limit;
ULONG64 Base;
} AMD64_DESCRIPTOR, *PAMD64_DESCRIPTOR;
typedef union _KGDTENTRY64 {
struct {
USHORT
LimitLow;
BaseLow;
USHORT
union {
struct {
UCHAR
UCHAR
UCHAR
UCHAR
BaseMiddle;
Flags1;
Flags2;
BaseHigh;
} Bytes;
struct {
ULONG
BaseMiddle : 8;
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
Type : 5;//把 S位包含进去了,也就是是否为系统段描述符的位。
Dpl : 2;
Present : 1;
LimitHigh : 4;
System : 1;//即 AVL,系统软件自定义的。
LongMode : 1;
DefaultBig : 1;//即 INTEL的 D/B (default operation size/default
stack pointer size and/or upper bound) flag。
ULONG
ULONG
Granularity : 1;
BaseHigh : 8;
} Bits;
};
//ULONG BaseUpper;
//ULONG MustBeZero;
};
//ULONG64 Alignment;
} KGDTENTRY64, *PKGDTENTRY64;
0: kd dt _KGDTENTRY64
hal!_KGDTENTRY64
+0x000 LimitLow
+0x002 BaseLow
+0x004 Bytes
: Uint2B
: Uint2B
: unnamed-tag
: unnamed-tag
: Uint4B
+0x004 Bits
+0x008 BaseUpper
+0x00c MustBeZero
+0x000 Alignment
0: kd dt _KGDTENTRY64 -b
hal!_KGDTENTRY64
+0x000 LimitLow
+0x002 BaseLow
+0x004 Bytes
: Uint4B
: Uint8B
: Uint2B
: Uint2B
: unnamed-tag
+0x000 BaseMiddle
+0x001 Flags1
: UChar
: UChar
+0x002 Flags2
: UChar
+0x003 BaseHigh
: UChar
+0x004 Bits
: unnamed-tag
: Pos 0, 8 Bits
: Pos 8, 5 Bits
: Pos 13, 2 Bits
: Pos 15, 1 Bit
: Pos 16, 4 Bits
: Pos 20, 1 Bit
: Pos 21, 1 Bit
: Pos 22, 1 Bit
: Pos 23, 1 Bit
: Pos 24, 8 Bits
: Uint4B
+0x000 BaseMiddle
+0x000 Type
+0x000 Dpl
+0x000 Present
+0x000 LimitHigh
+0x000 System
+0x000 LongMode
+0x000 DefaultBig
+0x000 Granularity
+0x000 BaseHigh
+0x008 BaseUpper
+0x00c MustBeZero
+0x000 Alignment
: Uint4B
: Uint8B
注意:
1、以上只分析一个 CPU的情况,如果计算机有多颗 CPU要分别处理。
2、为了和 WINDBG的 DG命令处理/显示的相似,特意根据 INTEL的 Table 3-1. Code- andData-Segment Types,制作一个字符串数组,但还有待改善。
3、GetGdtLimit的这个功能没有相应的 C代码,只有汇编代码(.asm文件),包括 X86
和 X64。最后只有代码了,具体如下:
/*
功能:显示每个 CPU的 GDT信息。
注释:以下结构摘自 WRK。
homepage:http://correy.webs.com注释:需翻墙,有的翻墙软件也打不开。
*/
#include ntifs.h
#include windef.h
#if defined(_AMD64_) || defined(_IA64_) //defined(_WIN64)
// Special Registers for AMD64.
typedef struct _AMD64_DESCRIPTOR {
USHORT
USHORT
Pad[3];
Limit;
ULONG64 Base;
} AMD64_DESCRIPTOR, *PAMD64_DESCRIPTOR;
typedef union _KGDTENTRY64 {
struct {
USHORT
USHORT
union {
LimitLow;
BaseLow;
struct {
UCHAR
UCHAR
UCHAR
UCHAR
BaseMiddle;
Flags1;
Flags2;
BaseHigh;
} Bytes;
struct {
ULONG
BaseMiddle : 8;
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
Type : 5;//把 S位包含进去了,也就是是否为系统段描述符的位、
Dpl : 2;
Present : 1;
LimitHigh : 4
System : 1;//即 AVL,系统软件自定义的。
LongMode : 1;
DefaultBig : 1;//即 INTEL的 D/B (default operation size/default
stack pointer size and/or upper bound) flag。
ULONG
ULONG
Granularity : 1;
BaseHigh : 8;
} Bits;
};
//ULONG BaseUpper;/*经观察,64下的结构的长度是 6字节,不是上面定义的 16
字节。*/
//ULONG MustBeZero;
};
//ULONG64 Alignment;
} KGDTENTRY64, *PKGDTENTRY64;
#else
// Special Registers for i386
typedef struct _X86_DESCRIPTOR {
USHORT
USHORT
ULONG
Pad;
Limit;
Base;
} X86_DESCRIPTOR, *PX86_DESCRIPTOR;
// GDT Entry
typedef struct _KGDTENTRY {
USHORT
USHORT
union {
LimitLow;
BaseLow;
struct {
UCHAR
BaseMid;
Flags1;
UCHAR
UCHAR
UCHAR
// Declare as bytes to avoid alignment
// Problems.
Flags2;
BaseHi;
} Bytes;
struct {
ULONG
BaseMid : 8;
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
ULONG
Type : 5;//把 S位包含进去了,也就是是否为系统段描述符的位。
Dpl : 2;
Pres : 1;
LimitHi : 4;
Sys : 1;//即 AVL,系统软件自定义的。
Reserved_0 : 1;//LongMode
Default_Big : 1;//即 INTEL的 D/B (default operation size/default stack
pointer size and/or upper bound) flag。
ULONG
ULONG
Granularity : 1;
BaseHi : 8;
} Bits;
} HighWord;
} KGDTENTRY, *PKGDTENTRY;
#endif
/*
根据:Table 3-1. Code- and Data-Segment Types,仿照 WINDBG的 dg命令定义。
*/
char SegmentTypes[][256] = {
"Reserved",//Data Read-Only缩写是:Data RO,也可认为是: Reserved。如果结构
(UINT64)全部为零,也可认为是 Reserved。
"Data RO AC",//Data Read-Only, accessed
"Data RW",//Data Read/Write
"Data RW AC",//Data Read/Write, accessed
"Data RO ED",//Data Read-Only, expand-down
"Data RO ED AC",//Data Read-Only, expand-down, accessed
"Data RW ED",//Data Read/Write, expand-down
"Data RW ED AC",//Data Read/Write, expand-down, accessed
"Code EO",//Code Execute-Only
"Code EO AC",//Code Execute-Only, accessed
"Code RE",//Code Execute/Read加空格以便显示的对齐。
"Code RE AC",//Code Execute/Read, accessed
"Code EO CO",//Code Execute-Only, conforming
"Code EO CO AC",//Code Execute-Only, conforming, accessed
"Code RE CO",//Code Execute/Read, conforming
"Code RE CO AC",//Code Execute/Read, conforming, accessed
"TSS32 Busy ",//这个也可显示只要识别了 TSS及内容。
"TSS32 Avl" //这个在 X86上出现了。
};
DRIVER_UNLOAD DriverUnload;
VOID DriverUnload(__in PDRIVER_OBJECT DriverObject)
{
#ifdef _X86_
__forceinline PKPCR KeGetPcr (VOID)
{
return (PKPCR)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr));
}
#endif
USHORT NTAPI GetGdtLimit ();//汇编函数。
#if defined(_WIN64)
void show_gdt(int i)
/*
i的取值可以是 0.
*/
{
//SIZE_T IDTR;
//X86_DESCRIPTOR gdtr = {0};//A pointer to the memory location where the IDTR is stored.
//KGDTENTRY * GDT = 0;
USHORT GdtLimit = 0;
SIZE_T r = 0;
PVOID p = 0;
int index = 0;
int maximun = 0;
PKGDTENTRY64 pkgdte;
SIZE_T ISR = 0;
KeSetSystemAffinityThread(i + 1);
pkgdte = KeGetPcr()-GdtBase;//没有__sgdt,也不用 sgdt汇编指令的办法。但是这个获取
的没有长度。
GdtLimit = GetGdtLimit ();//一般等于 0x7f.
KeRevertToUserAffinityThread();
//p = &gdtr.Limit;
//r = * (SIZE_T *)p;
//pkgdte = (PKGDTENTRY)r;
/*
其实直接 maximun = (idtr.Base + 1) / sizeof(KIDTENTRY);也可以。maximun一般等于 256。
*/
//if (gdtr.Pad % sizeof(KIDTENTRY) == 0) {
//
maximun = gdtr.Pad / sizeof(KIDTENTRY);
//} else {
//
maximun = gdtr.Pad / sizeof(KIDTENTRY);
//
maximun++;
//}
//if (GdtLimit % sizeof(KGDTENTRY64) == 0) {
maximun = GdtLimit / sizeof(KGDTENTRY64);
//} else {
//
//
maximun = GdtLimit / sizeof(KGDTENTRY64);
maximun++;//一般是 128.
//
//}
maximun = (GdtLimit + 1) / sizeof(KGDTENTRY64);
/*
显示格式:
CPU SN Sel
Base
Limit
Type
Pl Size Gran Pres Long
Flags
注释:CPU和 SN是自己添加的。SN即 Segment Name,如 CS、DS、FS等。
*/
KdPrint(("Sel
Base
Limit
Type
DPl Size Gran Pres
Long Flags\n"));//CPU SN
KdPrint(("---- ---------------- ---------------- ------------- --- ---- ---- ---- ---- --------\n"));//--- --
KdPrint(("\n"));
for ( ;index maximun ;index++ )
{
PKGDTENTRY64 pkgdte_t = &pkgdte[index];
SIZE_T Base = 0;
SIZE_T Limit = 0;
ULONG
Type = 0;
char * size = NULL;
char * Granularity = NULL;
char * Present = NULL;
char * LongMode = NULL;
int
Flags = 0;
Base = pkgdte_t-Bits.BaseHigh;
Base = (Base 24);
Base += (pkgdte_t-BaseLow + (pkgdte_t-Bits.BaseMiddle 16));
Limit = pkgdte_t-LimitLow + (pkgdte_t-Bits.LimitHigh 16);
if (pkgdte_t-Bits.DefaultBig && Base)
{
//扩充高位为 1.即 F.
Base += 0xffffffff00000000;
}
if (pkgdte_t-Bits.DefaultBig && pkgdte_t-Bits.Granularity)
{
//扩充高位为 1.即 F.
SIZE_T t = Limit;
Limit = (Limit 12);
Limit += PAGE_SIZE - 1;
}
Type = pkgdte_t-Bits.Type;
_bittestandreset(&Type, 4);//因为这个包含了 S位,所以要清除这个位标志。
if (pkgdte_t-Bits.DefaultBig)
{
size = "Bg ";//Big加空格是为了对齐显示。
}
else
{
size = "Nb ";//Not Big加空格是为了对齐显示。
}
if (pkgdte_t-Bits.Granularity)
{
Granularity = "Pg ";//Page加空格是为了对齐显示。
}
else
{
Granularity = "By ";//Byte加空格是为了对齐显示。
}
if (pkgdte_t-Bits.Present)
{
Present = "P ";//Present加空格是为了对齐显示。
}
else
{
Present = "NP ";//NO Present加空格是为了对齐显示。
}
if (pkgdte_t-Bits.LongMode)
{
LongMode = "Lo ";//Long加空格是为了对齐显示。
}
else
{
LongMode = "Nl ";//NO long加空格是为了对齐显示。
}
Flags = (pkgdte_t-Bytes.Flags2 4);//去掉 Segment limit的那几位。
Flags = Flags 8;
Flags = Flags + pkgdte_t-Bytes.Flags1;
KdPrint(("%04x %p %p %13s %03x %s %s %s %s 0x%04x\n",
index * 8, //sizeof (KGDTENTRY)
Base,
Limit,
SegmentTypes[Type],
pkgdte_t-Bits.Dpl,
size,
Granularity,
Present,
LongMode,
Flags
));
}
}
#else
void show_gdt(int i)
/*
i的取值可以是 0.
*/
{
//SIZE_T IDTR;
//X86_DESCRIPTOR gdtr = {0};//A pointer to the memory location where the IDTR is stored.
//KGDTENTRY * GDT = 0;
USHORT GdtLimit = 0;
SIZE_T r = 0;
PVOID p = 0;
int index = 0;
int maximun = 0;
PKGDTENTRY pkgdte;
SIZE_T ISR = 0;
KeSetSystemAffinityThread(i + 1);
pkgdte = KeGetPcr()-GDT;//没有__sgdt,也不用 sgdt汇编指令的办法。但是这个获取的没
有长度。
GdtLimit = GetGdtLimit ();//一般等于 0x3ff.
KeRevertToUserAffinityThread();
//p = &gdtr.Limit;
//r = * (SIZE_T *)p;
//pkgdte = (PKGDTENTRY)r;
/*
其实直接:
maximun = (idtr.Base + 1) / sizeof(KIDTENTRY);
也可以。
maximun一般等于 256.
*/
//if (gdtr.Pad % sizeof(KIDTENTRY) == 0) {
//
maximun = gdtr.Pad / sizeof(KIDTENTRY);
//} else {
//
maximun = gdtr.Pad / sizeof(KIDTENTRY);
//
maximun++;
//}
if (GdtLimit % sizeof(KGDTENTRY) == 0) {
maximun = GdtLimit / sizeof(KGDTENTRY);
} else {
maximun = GdtLimit / sizeof(KGDTENTRY);
maximun++;//一般是 128.
}
/*
显示格式:
CPU SN Sel
Base
Limit
Type
Pl Size Gran Pres Long
Flags
--- -- ---- ----------------- ----------------- ---------- -- ---- ---- ---- ---- --------
注释:CPU和 SN是自己添加的。SN即 Segment Name,如:CS,DS,FS等.
*/
KdPrint(("Sel
Base
Limit
Type DPl Size Gran Pres Long
Flags\n"));//CPU SN
KdPrint(("---- -------- ------------- ------------- --- ---- ---- ---- ---- --------\n"));//--- --
KdPrint(("\n"));
for ( ;index maximun ;index++ )
{
PKGDTENTRY pkgdte_t = &pkgdte[index];
SIZE_T Base = 0;
SIZE_T Limit = 0;
ULONG
Type = 0;
char * size = NULL;
char * Granularity = NULL;
char * Present = NULL;
char * LongMode = NULL;
int
Flags = 0;
//注意:0x38处的值不停的变化。
USHORT
ULONG
ULONG
BaseLow = pkgdte_t-BaseLow;
BaseMid = pkgdte_t-HighWord.Bits.BaseMid;
BaseHi = pkgdte_t-HighWord.Bits.BaseHi;
Base = (BaseHi 24) + (BaseMid 16) + BaseLow;//其实用位与更快 |。
if
(pkgdte_t-HighWord.Bits.Granularity
&&
BooleanFlagOn(pkgdte_t-HighWord.Bits.Type, 2 ) ) {//关于标志位及算法,见权威资料。
Limit = pkgdte_t-LimitLow + (pkgdte_t-HighWord.Bits.LimitHi 16);
Limit *= PAGE_SIZE;
Limit += PAGE_SIZE - 1;
} else {
Limit = pkgdte_t-LimitLow + (pkgdte_t-HighWord.Bits.LimitHi 16);
}
Type = pkgdte_t-HighWord.Bits.Type;
_bittestandreset(&Type, 4);//因为这个包含了 S位,所以要清除这个位标志。
if (pkgdte_t-HighWord.Bits.Default_Big)
{
size = "Bg ";//Big加空格是为了对齐显示。
}
else
{
size = "Nb ";//Not Big加空格是为了对齐显示。
}
if (pkgdte_t-HighWord.Bits.Granularity)
{
Granularity = "Pg ";//Page加空格是为了对齐显示。
}
else
{
Granularity = "By ";//Byte加空格是为了对齐显示。
}
if (pkgdte_t-HighWord.Bits.Pres)
{
Present = "P ";//Present加空格是为了对齐显示。
}
else
{
Present = "NP ";//NO Present加空格是为了对齐显示。
}
if (pkgdte_t-HighWord.Bits.Reserved_0)
{
LongMode = "Lo ";//Long加空格是为了对齐显示。
}
else
{
LongMode = "Nl ";//NO long加空格是为了对齐显示。
}
Flags = (pkgdte_t-HighWord.Bytes.Flags2 4);//去掉 Segment limit的那几位。
Flags = Flags 8;
Flags = Flags + pkgdte_t-HighWord.Bytes.Flags1;
KdPrint(("%04x %p %p %13s %03x %s %s %s %s 0x%04x\n",
index * 8, //sizeof (KGDTENTRY)
Base,
Limit,
SegmentTypes[Type],
pkgdte_t-HighWord.Bits.Dpl,
size,
Granularity,
Present,
LongMode,
Flags
));
}
}
#endif
#pragma INITCODE
DRIVER_INITIALIZE DriverEntry;
NTSTATUS DriverEntry(__in struct _DRIVER_OBJECT * DriverObject, __in PUNICODE_STRING
RegistryPath)
{
int i = 0;
KdBreakPoint();
DriverObject-DriverUnload = DriverUnload;
for
(
;i
KeNumberProcessors
;i++
)//KeQueryMaximumProcessorCount()
KeGetCurrentProcessorNumber
{
show_gdt(i);
}
return STATUS_SUCCESS;
}
结果及验证如下:
32位 Windows的结果:
kd g
Sel
Base
Limit
Type DPl Size Gran Pres Long Flags
---- -------- ------------- ------------- --- ---- ---- ---- ---- --------
0000 00000000 00000000
0008 00000000 FFFFFFFF
0010 00000000 FFFFFFFF
0018 00000000 FFFFFFFF
0020 00000000 FFFFFFFF
0028 80042000 000020AB
0030 FFDFF000 00001FFF
0038 00000000 00000FFF
0040 00000400 0000FFFF
0048 00000000 00000000
0050 80552700 00000068
Reserved 000 Nb
Code RE AC 000 Bg
Data RW AC 000 Bg
Code RE AC 003 Bg
Data RW AC 003 Bg
Code RE AC 000 Nb
Data RW AC 000 Bg
Data RW AC 003 Bg
Data RW 003 Nb
By
NP
Nl
0x0000
0x0c9b
0x0c93
0x0cfb
0x0cf3
0x008b
0x0c93
0x04f3
0x00f2
0x0000
0x0089
Pg
P
Nl
Pg
Pg
Pg
P
Nl
Nl
Nl
P
P
By
P
Nl
Pg
By
P
Nl
Nl
P
By
P
Nl
Reserved 000 Nb
Code EO AC 000 Nb
By
By
NP
P
Nl
Nl
0058 80552768 00000068
0060 00022F40 0000FFFF
0068 000B8000 00003FFF
0070 FFFF7000 000003FF
0078 80400000 0000FFFF
0080 80400000 0000FFFF
0088 00000000 00000000
0090 00000000 00000000
0098 00000000 00000000
00a0 823816B8 00000068
00a8 00000000 00000000
00b0 00000000 00000000
00b8 00000000 00000000
00c0 00000000 00000000
00c8 00000000 00000000
00d0 00000000 00000000
00d8 00000000 00000000
Code EO AC 000 Nb
Data RW AC 000 Nb
Data RW 000 Nb
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
P
P
Nl
Nl
0x0089
0x0093
0x0092
0x0092
0x009a
0x0092
0x0092
0x0000
0x0000
0x0089
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x009f
0x0092
0x0098
0x0092
0x0493
0x0493
0x0493
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
P
Nl
Data RW 000 Nb
P
P
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Code RE 000 Nb
Data RW 000 Nb
P
Data RW 000 Nb
P
Reserved 000 Nb
Reserved 000 Nb
Code EO AC 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
NP
NP
P
NP
NP
NP
NP
NP
NP
NP
00e0 F850F000 0000FFFF Code RE CO AC 000 Nb
By
P
Nl
00e8 00000000 0000FFFF
00f0 804FD040 000003B7
00f8 00000000 0000FFFF
0100 BA4D2400 0000FFFF
0108 BA4D2400 0000FFFF
0110 BA4D2400 0000FFFF
0118 00008003 0000F120
0120 00008003 0000F128
0128 00008003 0000F130
0130 00008003 0000F138
0138 00008003 0000F140
0140 00008003 0000F148
0148 00008003 0000F150
0150 00008003 0000F158
0158 00008003 0000F160
0160 00008003 0000F168
0168 00008003 0000F170
0170 00008003 0000F178
0178 00008003 0000F180
0180 00008003 0000F188
0188 00008003 0000F190
0190 00008003 0000F198
0198 00008003 0000F1A0
01a0 00008003 0000F1A8
01a8 00008003 0000F1B0
01b0 00008003 0000F1B8
Data RW 000 Nb
Code EO 000 Nb
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
P
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
P
Data RW 000 Nb
P
Data RW AC 000 Bg
Data RW AC 000 Bg
Data RW AC 000 Bg
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
P
P
P
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
01b8 00008003 0000F1C0
01c0 00008003 0000F1C8
01c8 00008003 0000F1D0
01d0 00008003 0000F1D8
01d8 00008003 0000F1E0
01e0 00008003 0000F1E8
01e8 00008003 0000F1F0
01f0 00008003 0000F1F8
01f8 00008003 0000F200
0200 00008003 0000F208
0208 00008003 0000F210
0210 00008003 0000F218
0218 00008003 0000F220
0220 00008003 0000F228
0228 00008003 0000F230
0230 00008003 0000F238
0238 00008003 0000F240
0240 00008003 0000F248
0248 00008003 0000F250
0250 00008003 0000F258
0258 00008003 0000F260
0260 00008003 0000F268
0268 00008003 0000F270
0270 00008003 0000F278
0278 00008003 0000F280
0280 00008003 0000F288
0288 00008003 0000F290
0290 00008003 0000F298
0298 00008003 0000F2A0
02a0 00008003 0000F2A8
02a8 00008003 0000F2B0
02b0 00008003 0000F2B8
02b8 00008003 0000F2C0
02c0 00008003 0000F2C8
02c8 00008003 0000F2D0
02d0 00008003 0000F2D8
02d8 00008003 0000F2E0
02e0 00008003 0000F2E8
02e8 00008003 0000F2F0
02f0 00008003 0000F2F8
02f8 00008003 0000F300
0300 00008003 0000F308
0308 00008003 0000F310
0310 00008003 0000F318
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0318 00008003 0000F320
0320 00008003 0000F328
0328 00008003 0000F330
0330 00008003 0000F338
0338 00008003 0000F340
0340 00008003 0000F348
0348 00008003 0000F350
0350 00008003 0000F358
0358 00008003 0000F360
0360 00008003 0000F368
0368 00008003 0000F370
0370 00008003 0000F378
0378 00008003 0000F380
0380 00008003 0000F388
0388 00008003 0000F390
0390 00008003 0000F398
0398 00008003 0000F3A0
03a0 00008003 0000F3A8
03a8 00008003 0000F3B0
03b0 00008003 0000F3B8
03b8 00008003 0000F3C0
03c0 00008003 0000F3C8
03c8 00008003 0000F3D0
03d0 00008003 0000F3D8
03d8 00008003 0000F3E0
03e0 00008003 0000F3E8
03e8 00008003 0000F3F0
03f0 00008003 0000F3F8
03f8 00000000 00000000
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
By
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
NP
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
0x0000
64位 Windows的结果:
0: kd g
Sel
Base
Limit
Type
DPl Size Gran Pres Long Flags
---- ---------------- ---------------- ------------- --- ---- ---- ---- ---- --------
0000 0000000000000000 0000000000000000
Reserved 000 Nb
By
By
By
Pg
NP
NP
P
Nl
Nl
Lo
Nl
0x0000
0008 0000000000000000 0000000000000000
Reserved 000 Nb
Code RE AC 000 Nb
Data RW AC 000 Bg
0x0000
0010 0000000000000000 0000000000000000
0x029b
0018 0000000000000000 00000000FFFFFFFF
0x0c93
P
0020 0000000000000000 00000000FFFFFFFF
Code RE AC 003 Bg
Pg
P
Nl
0x0cfb
Nl
0028 0000000000000000 00000000FFFFFFFF
Data RW AC 003 Bg
Code RE AC 003 Nb
Reserved 000 Nb
Code RE AC 000 Nb
Reserved 000 Nb
Data RW AC 003 Bg
Reserved 000 Nb
Code RE 000 Bg
Pg
By
By
By
By
By
By
Pg
By
By
By
P
0x0cf3
0030 0000000000000000 0000000000000000
P
Lo
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
Nl
0x02fb
0038 0000000000000000 0000000000000000
NP
P
0x0000
0040 0000000001D52080 0000000000000067
0x008b
0048 000000000000FFFF 000000000000F800
NP
P
0x0000
0050 FFFFFFFFFFFA0000 0000000000003C00
0x04f3
0058 0000000000000000 0000000000000000
NP
P
0x0000
0060 0000000000000000 00000000FFFFFFFF
0x0c9a
0068 0000000000000000 0000000000000000
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
NP
NP
NP
0x0000
0070 0000000000000000 0000000000000000
0x0000
0078 0000000000000000 0000000000000000
0x0000
Sel
Base
Limit
Type
DPl Size Gran Pres Long Flags
---- ---------------- ---------------- ------------- --- ---- ---- ---- ---- --------
0000 0000000000000000 0000000000000000
Reserved 000 Nb
By
By
By
Pg
NP
NP
P
Nl
Nl
Lo
Nl
0x0000
0008 0000000000000000 0000000000000000
Reserved 000 Nb
Code RE AC 000 Nb
Data RW AC 000 Bg
0x0000
0010 0000000000000000 0000000000000000
0x029b
0018 0000000000000000 00000000FFFFFFFF
0x0c93
P
0020 0000000000000000 00000000FFFFFFFF
0028 0000000000000000 00000000FFFFFFFF
0x0cf3
Code RE AC 003 Bg
Pg
P
Nl
0x0cfb
Nl
Data RW AC 003 Bg
Code RE AC 003 Nb
Reserved 000 Nb
Code RE AC 000 Nb
Reserved 000 Nb
Pg
By
By
By
By
P
0030 0000000000000000 0000000000000000
0x02fb
P
Lo
Nl
Nl
Nl
0038 0000000000000000 0000000000000000
0x0000
NP
P
0040 00000000009F7E40 0000000000000067
0x008b
0048 000000000000FFFF 000000000000F880
NP
0x0000
0050 FFFFFFFFFFFE0000 0000000000007C00
Data RW AC 003 Bg
Reserved 000 Nb
Code RE 000 Bg
By
By
Pg
By
By
By
P
Nl
Nl
Nl
Nl
Nl
Nl
0x04f3
0058 0000000000000000 0000000000000000
NP
P
0x0000
0060 0000000000000000 00000000FFFFFFFF
0x0c9a
0068 0000000000000000 0000000000000000
Reserved 000 Nb
Reserved 000 Nb
Reserved 000 Nb
NP
NP
NP
0x0000
0070 0000000000000000 0000000000000000
0x0000
0078 0000000000000000 0000000000000000
0x0000
这里显示 2个,是因为有两颗 CPU。细心的你应该(从对比中)还会发现一些不足和不一样的地方,期待你的改正,剩下的任务也就是你要改正的地方。如添加显示 CPU的个数,及段的名字(特别是系统段,各种门)等。不当之处,敬请指出。