首页
社区
课程
招聘
未解决 [求助]Win10 PTE Base 无效,该如何处理?
2020-3-30 20:09 6328

未解决 [求助]Win10 PTE Base 无效,该如何处理?

2020-3-30 20:09
6328
按照tandast的方法找到了PTE_BASE,但是这个base里面的地址是无效的



使用!pte找到了对应的几级页,发现PXE PPE PDE都是有效的,而PTE是无效的



最后我通过Cr3去手动遍历了一下,发现确实不存在


我想问,这个PTE_BASE是只针对某些页目录有效吗?或者说,win10对这个PTE做了什么特殊的处理?

感谢!!


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

收藏
免费 0
打赏
分享
最新回复 (11)
雪    币: 1484
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
冰雄 2020-3-30 21:59
2
0
去看b站保护模式的课程你就懂了
雪    币: 6813
活跃值: (2711)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
不对 2020-3-31 10:14
3
0
冰雄 去看b站保护模式的课程你就懂了
这个和保护模式有很大的关系么?
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-2 10:52
4
0

1.通过实际调试动手观察: 系统启动阶段发现PTE_BASE有效, PTE,PDE,PPE,PXE也有效:



2.系统启动后, 再次break断下,发现了楼主所说的情况: PTE_BASE无效,PTE无效, 而PDE,PPE,PXE有效:


3. 顺便分析了下MmGetVirtualForPhysical的实现中: 物理地址到虚拟地址的换算:

PVOID NTAPI MmGetVirtualForPhysical(

    IN PHYSICAL_ADDRESS PhysicalAddress

)

{

    PVOID *UnknownBase=0xFFFF958000000008, /*PTEBase=0xFFFFF40000000000,*/ VirtualAddress;


    VirtualAddress= (PVOID)(((LONGLONG)(((ULONG_PTR)UnknownBase[((ULONGLONG)PhysicalAddress.QuadPart>>0xc)*6]<<0x19)-((ULONG_PTR)PTE_BASE<<0x19)))>>0x10)+(PhysicalAddress.QuadPart&0x0fff)); //改一处,WIN10上发现PTE_BASE随每次系统的启动是随机化的,这个随机化的常量计为PTE_BASE

    return  VirtualAddress;

}


以后有空学习研究了这一块的相关知识再回过头来理解是怎么回事。


最后于 2021-2-3 15:19 被低调putchar编辑 ,原因: PTE_BASE随机化
雪    币: 660
活跃值: (1445)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl 2021-2-2 11:35
5
0
缺页了,就是访问不了的
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-3 11:05
6
0

nt!MmGetVirtualForPhysical:
fffff803`6094d520 488bc1          mov     rax,rcx
fffff803`6094d523 48c1e80c        shr     rax,0Ch
fffff803`6094d527 488d1440        lea     rdx,[rax+rax*2]
fffff803`6094d52b 4803d2          add     rdx,rdx
fffff803`6094d52e 48b80800000000faffff mov rax,0FFFFFA0000000008h
fffff803`6094d538 488b04d0        mov     rax,qword ptr [rax+rdx*8]
fffff803`6094d53c 48c1e019        shl     rax,19h
fffff803`6094d540 48ba0000000000f9ffff mov rdx,0FFFFF90000000000h ;PTE_BASE
fffff803`6094d54a 48c1e219        shl     rdx,19h
fffff803`6094d54e 81e1ff0f0000    and     ecx,0FFFh
fffff803`6094d554 482bc2          sub     rax,rdx
fffff803`6094d557 48c1f810        sar     rax,10h
fffff803`6094d55b 4803c1          add     rax,rcx
fffff803`6094d55e c3              ret
0: kd> !pte FFFFF90000000000
                                           VA 0000000000000000
PXE at FFFFF97CBE5F2000    PPE at FFFFF97CBE400000    PDE at FFFFF97C80000000    PTE at FFFFF90000000000
contains 0A0000001F5E2867  contains 0000000000000000
pfn 1f5e2     ---DA--UWEV  contains 0000000000000000
not valid
0: kd> db FFFFF90000000000
fffff900`00000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

大致了解下,.64位(页表级: 9-9-9-9-12):

PTE=(((VA&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

如果VA=0,
则:PTE=(((VA&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE=PTE_BASE
和调试观察情况相吻合:

即: 系统启动后,对于首地址VA==NULL的这1页:PTE==PTE_BASE

对应的PTE是无效的,NULL地址处的1页大小内存很显然不是有效的。


最后于 2021-2-5 12:49 被低调putchar编辑 ,原因:
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-3 14:46
7
0

(1)如果VA=0,
则:PTE=(((VA&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=(((0&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=PTE_BASE

即: 系统启动后,对于首地址VA==NULL的这1页:PTE==PTE_BASE
该PTE为PTE_BASE中的第1个PTE,是无效的,NULL地址处的1页大小内存很显然不是有效的
如果VA所在页是有效的,则对应的PTE也应该是有效的。
0: kd> !pte FFFFF90000000000  ;!pte PTE 
                                           VA 0000000000000000
PXE at FFFFF97CBE5F2000    PPE at FFFFF97CBE400000    PDE at FFFFF97C80000000    PTE at FFFFF90000000000
contains 0A0000001F5E2867  contains 0000000000000000
pfn 1f5e2     ---DA--UWEV  contains 0000000000000000
not valid
0: kd> db FFFFF90000000000
fffff900`00000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff900`00000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

(2)对于VA为: PTE_BASE=0xFFFFF90000000000,则该页内存对应的PTE(查阅了解到是: PDE_BASE)为:
PTE=PDE_BASE=(((PTE_BASE&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE=FFFFF97C80000000
看下PTE_BASE的PTE(PDE_BASE)的信息:
0: kd> !pte FFFFF97C80000000  ;!pte PTE 
                                           VA fffff90000000000
PXE at FFFFF97CBE5F2F90    PPE at FFFFF97CBE5F2000    PDE at FFFFF97CBE400000    PTE at FFFFF97C80000000
contains 0A00000029A00863  contains 0A0000001F5E2867  contains 0000000000000000
pfn 29a00     ---DA--KWEV  pfn 1f5e2     ---DA--UWEV  contains 0000000000000000
not valid
0: kd> db FFFFF97C80000000
fffff97c`80000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
fffff97c`80000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
VA为NULL处的页无效,所以计算得出的PTE=PTE_BASE也是无效的,
由于PTE_BASE(第1项PTE)是无效的,所以计算得出的指向PTE_BASE的PTE也是无效的。
OK!这就全部对上了!

最后于 2021-2-3 23:01 被低调putchar编辑 ,原因:
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-3 17:31
8
0

我再练习另外一个1709的WIN10系统.加深印象:

1: kd> uf nt!MmGetVirtualForPhysical

nt!MmGetVirtualForPhysical:

fffff803`be81be60 488bc1          mov     rax,rcx

fffff803`be81be63 48c1e80c        shr     rax,0Ch

fffff803`be81be67 488d1440        lea     rdx,[rax+rax*2]

fffff803`be81be6b 4803d2          add     rdx,rdx

fffff803`be81be6e 48b8080000008097ffff mov rax,0FFFF978000000008h

fffff803`be81be78 488b04d0        mov     rax,qword ptr [rax+rdx*8]

fffff803`be81be7c 48c1e019        shl     rax,19h

fffff803`be81be80 48ba0000000000edffff mov rdx,0FFFFED0000000000h ;PTE_BASE

fffff803`be81be8a 48c1e219        shl     rdx,19h

fffff803`be81be8e 81e1ff0f0000    and     ecx,0FFFh

fffff803`be81be94 482bc2          sub     rax,rdx

fffff803`be81be97 48c1f810        sar     rax,10h

fffff803`be81be9b 4803c1          add     rax,rcx

fffff803`be81be9e c3              ret


PTE_BASE所在的VA处无效:

1: kd> db FFFFED0000000000

ffffed00`00000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


观察PTE_BASE(第1个PTE)信息:

描述的是NULL地址处的PTE,PDE,PPE, PXE信息

1: kd> !pte FFFFED0000000000

                                           VA 0000000000000000

PXE at FFFFED76BB5DA000    PPE at FFFFED76BB400000    PDE at FFFFED7680000000    PTE at FFFFED0000000000

contains 0A0000000E974867  contains 0000000000000000

pfn e974      ---DA--UWEV  contains 0000000000000000

not valid


PTE=(((VA&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

当VA=0时:

PTE=(((0&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=PTE_BASE

所以VA为NULL处的1页的PTE(就是PTE_BASE的第1项,也就是PTE_BASE)是无效的。

1: kd> db FFFFED0000000000

ffffed00`00000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed00`00000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


(1)描述PTE_BASE的PTE(PDE_BASE)

PTE_BASE为FFFFED0000000000

PDE_BASE=(((PTE_BASE&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=(((FFFFED0000000000&0x0000FFFFFFFFFFFF)>>12)<<3)+0xFFFFED0000000000

=0xFFFFED7680000000

PDE_BASE是无效的:


1: kd> db FFFFED7680000000

ffffed76`80000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


(2)描述PDE_BASE的PTE(PPE_BASE)

PPE_BASE=(((PDE_BASE&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=(((FFFFED7680000000&0x0000FFFFFFFFFFFF)>>12)<<3)+0xFFFFED0000000000

=0xFFFFED76BB400000

观察PPE_BASE:

1: kd> db FFFFED76BB400000

ffffed76`bb400000  00 00 00 00 00 00 00 00-67 58 27 65 00 00 00 0a  ........gX'e....

ffffed76`bb400010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


描述PDE_BASE的PTE(PPE_BASE)所在的内存是可读取的,其内容为:

*PPE_BASE=0x0000000000000000

通过用PPE_BASE及PDE_BASE计算得到到的PDE_BASE物理地址:
PHY_ADDR=((*PPE_BASE)&0x0000FFFFFFFFF000)+(PDE_BASE&0x0000000000000FFF)

=(0x0000000000000000&0x0000FFFFFFFFF000)+(FFFFED7680000000&0000000000000FFF)

=0

观察通过PPE_BASE及PDE_BASE计算到的PDE_BASE物理地址内容(验证PPE_BASE描述有效性):


1: kd> !db 0

#       0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      10 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      20 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      30 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      40 07 00 00 c0 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      50 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      60 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

#      70 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................


PDE_BASE本身所在VA处

1: kd> db FFFFED7680000000 ;PDE_BASE VA

ffffed76`80000000  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000010  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000020  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000030  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000040  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000050  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000060  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

ffffed76`80000070  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????


并不吻合,说明: PPE_BASE(描述PDE_BASE的PTE)所描述的PTE信息实际上是不正确的,只是PPE_BASE所在内存本身可读而已, 从前面也可以看出: PDE_BASE本身所在的页是无效的。


(3)描述PPE_BASE的PTE(PXE_BASE)

PXE_BASE=(((PPE_BASE&0x0000FFFFFFFFFFFF)>>12)<<3)+PTE_BASE

=(((FFFFED76BB400000&0x0000FFFFFFFFFFFF)>>12)<<3)+0xFFFFED0000000000

=0xFFFFED76BB5DA000


观察PXE_BASE


1: kd> db FFFFED76BB5DA000

ffffed76`bb5da000  67 48 97 0e 00 00 00 0a-00 00 00 00 00 00 00 00  gH..............

ffffed76`bb5da010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb5da070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


PXE_BASE所在的内存是可读的,其内容为:

*PXE_BASE=0x0a0000000e974867

采用PXE_BASE及PPE_BASE计算到的PPE_BASE的物理地址为:

PHY_ADDR=((*PXE_BASE)&0x0000FFFFFFFFF000)+(PPE_BASE&0x0000000000000FFF)

=(0x0a0000000e974867&0x0000FFFFFFFFF000)+(0xFFFFED76BB400000&0x0000000000000FFF)

=0x00000e974000


观察通过PXE_BASE及PPE_BASE计算到的PPE_BASE物理地址内容(验证PXE_BASE描述有效性):

1: kd> !db 00000e974000

# e974000 00 00 00 00 00 00 00 00-67 58 27 65 00 00 00 0a ........gX'e....

# e974010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

# e974070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

1: kd> db FFFFED76BB400000 ;PPE_BASE VA

ffffed76`bb400000  00 00 00 00 00 00 00 00-67 58 27 65 00 00 00 0a  ........gX'e....

ffffed76`bb400010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ffffed76`bb400070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

相吻合

PXE_BASE(描述PPE_BASE的PTE)所描述的PTE信息是有效的,描述的就是PPE_BASE,从前面也可以看出: PPE_BASE本身所在的内存页也是可读的。


(4)综上所述:  系统启动后, 对于VA为NULL的1页对应的PTE(PTE_BASE的第1项==PTE_BASE)是无效的

PXE_BASE(描述PPE_BASE的PTE)->PPE_BASE(描述PDE_BASE的PTE)->PDE_BASE(描述PTE_BASE的PTE)->PTE_BASE(页表基址)

PDE_BASE,PPE_BASE,PXE_BASE本质上都是PTE

如果PTE描述的目标内存页无效,则原PTE就无效,要么是PTE本身就不可读取, 要么是PTE本身可读取但描述信息不正确。


太麻烦了,假如再多几级页表,脑袋都要搅晕了。

感谢楼主的提问!让我自学到了一些有关页表方面的知识!获益匪浅!











最后于 2021-2-4 12:35 被低调putchar编辑 ,原因:
雪    币: 6813
活跃值: (2711)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
不对 2021-2-5 14:39
9
0
低调putchar 我再练习另外一个1709的WIN10系统.加深印象:1: kd&gt; uf nt!MmGetVirtualForPhysicalnt!MmGetVirtualForPhysical:ffff ...
感谢回复,但是可能你误会我提问了,我一开始认为PTE_BASE既然是PTE_BASE了,它就应该有效,不过经过后续的搜索和实验,发现它只是一个计算变量,至于它这个数值指向的地址有没有效,那就要看它在Cr3里面有没有挂载了,如果没有,那就是无效的。

这是我很早之前的一个提问,后续研究之后觉得自己的提问很幼稚,但是一直没有删除,所以写了后续的帖子算是做出了一个补充,由此可能会给你带来困扰,很抱歉
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-5 21:53
10
0
不对 感谢回复,但是可能你误会我提问了,我一开始认为PTE_BASE既然是PTE_BASE了,它就应该有效,不过经过后续的搜索和实验,发现它只是一个计算变量,至于它这个数值指向的地址有没有效,那就要看它在C ...

还好!刚接触这块!感兴趣,所以学习下!

1: kd> uf nt!MmGetVirtualForPhysical
nt!MmGetVirtualForPhysical:
fffff807`774c1520 488bc1          mov     rax,rcx
fffff807`774c1523 48c1e80c        shr     rax,0Ch
fffff807`774c1527 488d1440        lea     rdx,[rax+rax*2]
fffff807`774c152b 4803d2          add     rdx,rdx
fffff807`774c152e 48b80800000080ecffff mov rax,0FFFFEC8000000008h
fffff807`774c1538 488b04d0        mov     rax,qword ptr [rax+rdx*8]
fffff807`774c153c 48c1e019        shl     rax,19h
fffff807`774c1540 48ba0000000080fcffff mov rdx,0FFFFFC8000000000h  ;PTE_BASE
fffff807`774c154a 48c1e219        shl     rdx,19h
fffff807`774c154e 81e1ff0f0000    and     ecx,0FFFh
fffff807`774c1554 482bc2          sub     rax,rdx
fffff807`774c1557 48c1f810        sar     rax,10h
fffff807`774c155b 4803c1          add     rax,rcx
fffff807`774c155e c3              ret

1: kd> !pte 0FFFFFC8000000000h
                                           VA 0000000000000000  ;NULL
PXE at FFFFFCFE7F3F9000 ;=PXE_BASE    PPE at FFFFFCFE7F200000 ;=PPE_BASE   PDE at FFFFFCFE40000000;=PDE_BASE    PTE at FFFFFC8000000000  ;=PTE_BASE
contains 8A000000081C6867  contains 0000000000000000
pfn 81c6      ---DA--UW-V  contains 0000000000000000
not valid
1: kd> r cr3
cr3=00000000001ad002

1: kd> !vtop 0 FFFFFCFE7F3F9000 ;PXE_BASE VA TO PA
Amd64VtoP: Virt fffffcfe7f3f9000, pagedir 00000000001ad002 ;=cr3
Amd64VtoP: PML4E 00000000001adfca
Amd64VtoP: pagefile PDPE 0:0000000008000fc8
Amd64VtoP: PML4E not present, 0xD0000147
Virtual address fffffcfe7f3f9000 translation fails, error 0xD0000147.

1: kd> !db 1ad000  ;PXE_BASE PA
#  1ad000 67 68 1c 08 00 00 00 8a-00 00 00 00 00 00 00 00 gh..............
#  1ad010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
#  1ad070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

1: kd> !db 081c6000 ;PPE_BASE PA
# 81c6000 00 00 00 00 00 00 00 00-67 78 2c 08 00 00 00 0a ........gx,.....
# 81c6010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
# 81c6070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

1: kd> db FFFFFCFE7F3F9000 ;PXE_BASE VA
fffffcfe`7f3f9000  67 68 1c 08 00 00 00 8a-00 00 00 00 00 00 00 00  gh..............
fffffcfe`7f3f9010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f3f9070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

1: kd> db FFFFFCFE7F200000 ;PPE_BASE VA
fffffcfe`7f200000  00 00 00 00 00 00 00 00-67 78 2c 08 00 00 00 0a  ........gx,.....
fffffcfe`7f200010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffffcfe`7f200070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

完全对应得上!

最后于 2021-2-5 22:27 被低调putchar编辑 ,原因:
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
低调putchar 1 2021-2-7 13:30
11
0

!vtop 这个命令超好用。可以把VA直接转换为PA
!vtop PFN VirtualAddress 

PFN

Specifies the page frame number (PFN) of the directory base for the process


1: kd> uf nt!MmGetVirtualForPhysical
nt!MmGetVirtualForPhysical:
fffff800`0a0bd520 488bc1          mov     rax,rcx
fffff800`0a0bd523 48c1e80c        shr     rax,0Ch
fffff800`0a0bd527 488d1440        lea     rdx,[rax+rax*2]
fffff800`0a0bd52b 4803d2          add     rdx,rdx
fffff800`0a0bd52e 48b80800000080e6ffff mov rax,0FFFFE68000000008h
fffff800`0a0bd538 488b04d0        mov     rax,qword ptr [rax+rdx*8]
fffff800`0a0bd53c 48c1e019        shl     rax,19h
fffff800`0a0bd540 48ba0000000000d1ffff mov rdx,0FFFFD10000000000h ;PTE_BASE
fffff800`0a0bd54a 48c1e219        shl     rdx,19h
fffff800`0a0bd54e 81e1ff0f0000    and     ecx,0FFFh
fffff800`0a0bd554 482bc2          sub     rax,rdx
fffff800`0a0bd557 48c1f810        sar     rax,10h
fffff800`0a0bd55b 4803c1          add     rax,rcx
fffff800`0a0bd55e c3              ret

1: kd> !pte 0FFFFD10000000000
                                           VA 0000000000000000
PXE at FFFFD168B45A2000;PXE_BASE    PPE at FFFFD168B4400000;=PPE_BASE    PDE at FFFFD16880000000;=PDE_BASE    PTE at FFFFD10000000000;=PTE_BASE
contains 8A0000000F588867  contains 0000000000000000
pfn f588      ---DA--UW-V  contains 0000000000000000
not valid

1: kd> r cr3
cr3=00000000001ad002

1: kd> !vtop 1ad000 FFFFD168B45A2000 ;PXE_BASE VA to PA
Amd64VtoP: Virt ffffd168b45a2000, pagedir 00000000001ad000
Amd64VtoP: PML4E 00000000001add10
Amd64VtoP: PDPE 00000000001add10
Amd64VtoP: PDE 00000000001add10
Amd64VtoP: PTE 00000000001add10
Amd64VtoP: Mapped phys 00000000001ad000
Virtual address ffffd168b45a2000 translates to physical address 1ad000.

1: kd> !vtop 1ad000 FFFFD10000000000 ;PTE_BASE VA TO PA
Amd64VtoP: Virt ffffd10000000000, pagedir 00000000001ad000
Amd64VtoP: PML4E 00000000001add10
Amd64VtoP: PDPE 00000000001ad000
Amd64VtoP: PDE 000000000f588000
Amd64VtoP: zero PDE
Virtual address ffffd10000000000 translation fails, error 0xD0000147 ;失败了,说明PTE_BASE VA处页无效.

实际上就是相当于楼主从cr3描述的最高级页目录表开始取VA低48位中的高36位的(9-9-9-9)一级一级去手动遍历,只是这个更快捷方便。这部分内容基本理解了, 我忙完了其他事情,以后再学习研究后面的!

最后于 2021-2-8 10:13 被低调putchar编辑 ,原因:
雪    币: 362
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
gdgdgdg 2021-2-9 11:58
12
0

要读物理内存 就通过vt 修改ept的最后一级页表pfn为要读的pfn
根本不需要管什么ptebase

最后于 2021-2-9 12:04 被gdgdgdg编辑 ,原因:
游客
登录 | 注册 方可回帖
返回