debugging 内核调试时-查找用户模式地址的页面保护

okxuctiv  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(135)

在内核调试Windows(XP SP3)机器时,我想找到用户模式地址的页面保护(实际上只是检查它是否是一个No-Execute页面)。
扩展名!vprot(它就是做这个的)在内核调试时不起作用。
我尝试改变到这个用户模式地址空间(使用'.process /i'),然后在地址上调用!pte。但有时,PTE条目是无效的,因为它被换页了(我想)。
有什么建议吗?

camsedfj

camsedfj1#

您可以尝试!vad!address的组合:

0: kd> !process 0 0 calc.exe
PROCESS 89e035f8  SessionId: 0  Cid: 021c    Peb: 7ffdd000  ParentCid: 00d4
    DirBase: 0aac0200  ObjectTable: e1f587a8  HandleCount:  44.
    Image: calc.exe

0: kd> .process /i 89e035f8

使用!vad

3: kd> !vad 0x1000000
VAD     level      start      end    commit
89e02578 (-1)       1000     101e         3 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\calc.exe
3: kd> !vad 0x1014000
VAD     level      start      end    commit
89e02578 (-1)       1000     101e         3 Mapped  Exe  EXECUTE_WRITECOPY  \WINDOWS\system32\calc.exe

问题是!vad命令只提供了整个页面范围的VAD(Virtual AQddress Descrippptor),更准确地说是VAD段的大小。显然,0x1000000 [PE Header]和0x1014000 [. data section]处的页面没有相同的保护。
使用!address
请注意,!address命令将Map很多内容(包括PTE/PFN和VAD):

3: kd> !address 0x1000000
Mapping user range ...
Mapping system range ...
Mapping page tables...
Mapping hyperspace...
Mapping HAL reserved range...
Mapping User Probe Area...
Mapping system shared page...
Mapping system cache working set...
Mapping loader mappings...
Mapping system PTEs...
Mapping system paged pool...
Mapping session space...
Mapping dynamic system space...
Mapping PFN database...
Mapping non paged pool...
Mapping VAD regions...
Mapping module regions...
Mapping process, thread, and stack regions...
Mapping system cache regions...

使用-v-map选项:

3: kd> !address -v -map 0x1000000
PDE:    c0600040 [contains 20b9a867]

        Page Frame Number:  20b9a, at address: 00000000
        Page Location:      6 (ActiveAndValid)
        PTE Frame:          00020a98
        Attributes:         M:Modified,Cached
        Usage:              PTEs Process 89e035f8 [calc.exe], Entries:22

PTE:    c0008000 [contains 20d86025]

        Page Frame Number:  20d86, at address: 00000000
        Page Location:      6 (ActiveAndValid)
        PTE Frame:          00020384
        Attributes:         P:Prototype,M:Modified,Cached
        Usage:              MappedFile CA:8a1282e0 [\WINDOWS\system32\calc.exe]
        
Type:   Valid
Attrs:  Private,NormalPage,NotDirty,NotDirty1,Accessed,User,NotWritable,NotWriteThrough
PFN:    20d86

Attrs输出提供了有用的信息。此时您可以使用!pte命令:

3: kd> !pte c0008000
                    VA 01000000
PDE at C0600040            PTE at C0008000
contains 0000000020B9A867  contains 0000000020D86025
pfn 20b9a     ---DA--UWEV  pfn 20d86     ----A--UREV

!pte的输出提供PTE位(右侧),如下所示:----A--UREV

  • A:已访问
  • 用户页面:首页
  • R:只读
  • E:可执行文件
  • V:有效

命令文档:

希望这能解决你的问题。

相关问题