首页
社区
课程
招聘
[求助]线性地址转换物理地址的问题
发表于: 2009-4-14 17:43 5746

[求助]线性地址转换物理地址的问题

2009-4-14 17:43
5746
在《软件调试》这本书上有从线性地址向物理地址转换的这个实验
实验成功将一个用户空间地址转换到物理地址空间 (非PAE情况)

当我在做这个实验的时候 将地址换成了内核空间的地址 譬如8055a700
可以得到下面的信息

然后通过CR3和dir = 201找页目录 找到的项总是0 不知道怎么回事?
根据在rootkit一书内存页一节中的介绍
我觉得内核空间地址和用户空间地址的转换是不是有不同之处?
不是很懂 还望解答 谢谢!

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
内核空间的地址转换和用户空间是一样的,都是由cr3定位到PDE,在PDE中根据索引找PTE,再由PTE内容的pfn部分找到相应的页。只不过内核部分的地址空间是所有进程共享。你可以看看JIURL的玩玩Win2000内存系列,应该有帮助
2009-4-14 17:58
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
Linux下面貌似也是这样~
2009-4-14 17:59
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果和用户空间的一样
转换的时候CR3是不是应该取System的DirBase还是其他的什么值?
2009-4-14 18:05
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
kd> !process 0 0 System
PROCESS 80e82830  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000b78  HandleCount: 237.
    Image: System

kd> !dd 00039000  
#   39000 01840067 00000000 00000000 00000000
#   39010 00000000 00000000 00000000 00000000
#   39020 00000000 00000000 00000000 00000000
#   39030 00000000 00000000 00000000 00000000
#   39040 00000000 00000000 00000000 00000000
#   39050 00000000 00000000 00000000 00000000
#   39060 00000000 00000000 00000000 00000000
#   39070 00000000 00000000 00000000 00000000

可见页目录表中 只有一项 后面的都是0了
如果转换8055a700的话 dir=201 也是0
2009-4-14 18:11
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
看来你没理解进程上下文的概念。在哪个进程上下文中,就用哪个进程的页目录来寻址
2009-4-14 18:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
比如你WriteFile->KiSystemService->NtWriteFile,这时虽然已经到了内核中,但是还是处于WriteFile发起者的进程上下文中,所以要取当前进程的页目录来寻址,而页目录的位置在cr3中
2009-4-14 18:40
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢你的回答
但是譬如有两个进程p1 p2
p1和p2都通过WriteFile->KiSystemService->NtWriteFile进入内核
p1的CR3=x p2的CR3=y (x != y)

那么对p1来讲内核空间的某个地址 如8055a700
页目录位于x[201]处 (201 = DirectoryOffset)
而对于p2进程来说 页目录位于y[201]
难道同一个内核地址被映射到两个不同物理地址?
2009-4-14 18:53
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
真正决定是哪一页的是pfn,PTE可以不同,但它的内容pfn可以是相同的。p1进程和p2进程看到的8055a700是相同的,因为内核部分的地址空间是所有进程共享,就好像ntdll,kernel32等knowndll一样也是所有进程共享。你可以分别切换到不同的进程空间然后执行!pte 8055a700看看PTE的内容pfn是不是一样的
2009-4-14 19:10
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
同一个物理页可以被映射到不同的地址,比如SharedUserData,MmSessionSpace都是这样,你可以观察一下他们映射的地址的PTE,pfn是一样的,但页属性可能不一样
2009-4-14 19:13
0
雪    币: 215
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
eepo 是哪里的新手?

怎么这么熟悉?
2009-4-21 09:11
0
游客
登录 | 注册 方可回帖
返回
//