首页
社区
课程
招聘
[求助]32位分页模式地址转换问题
发表于: 2020-4-10 21:59 3378

[求助]32位分页模式地址转换问题

2020-4-10 21:59
3378

学习帖子:

https://bbs.pediy.com/thread-181016.htm

但是遇到问题,想问下怎么回事?


首先自己写一个测试程序

···

写一段C语言程序,调试,确认系统分页管理开启。

int main(int argc, char* argv[])

{

char *p="Hello World!\n";

printf("p=0x%X\n",p);

uint PDT,PTE,Offset;

uint addr=(uint)p;

PDT= (addr  & 0XFFC00000) >> 22;

PTE = (addr & 0X3FF000)>>12;

Offset= addr & 0xFFF;

printf("PDT=0x%x;PTE=0x%x;Offset=0x%x\n",PDT,PTE,Offset);

getchar();

return 0;

}

···

# 0x1.尝试指令!pte

获得PDT和PTE如下,但是直接打印为什么说是访问错误呢?



# 0x2 尝试从!process开始

用 !process 0 0枚举所有进程

发现目标程序的DirBase也就是CR3了 显示是098002a0 取高20位就是 9800000

同时对上边的VA  0x407058分解

PDE索引=0x1

PTE索引=0x7

内存页的偏移=0x58

PDE对应第二个项,为什么是0呢?




[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 15
活跃值: (3536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看看分页模式是10  10  12分页吗?
2020-4-10 22:13
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是,32位没有64的那么多名堂。
2020-4-10 22:57
0
雪    币: 15
活跃值: (3536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
刚没注意看 cr3不要取高20位  全部都要。 取高20位的是PDE 和PTE
2020-4-11 01:14
0
雪    币: 3263
活跃值: (3853)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
0xc0600010明显是一个虚拟地址,查看虚拟地址的内存命令前面不需要加感叹号
2020-4-11 17:05
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
麻木的时间 刚没注意看 cr3不要取高20位 全部都要。 取高20位的是PDE 和PTE
原贴有说明的,CR3是需要取高20位的。
线性地址到物理地址的转换规则
CR3寄存器高20位保存了PDT的物理页码
2020-4-11 20:49
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
刚才去试了你的方法,使用dd会显示一堆000000的区域,
2020-4-11 20:56
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
麻木的时间 刚没注意看 cr3不要取高20位 全部都要。 取高20位的是PDE 和PTE
我现在要通过VA转换,然后通过CR3,得到PDE和PTE,手动在windbg中定位物理地址,看到内存中的helloworld,就肯定要这样做。
2020-4-11 21:00
0
雪    币: 216
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
windbg中执行   .formats cr4    看看第五位是不是1,  如果是1 ,  说明开启了PAE. 开启PAE就不是10 10 12了.
2020-4-11 21:37
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
tsoo windbg中执行 .formats cr4 看看第五位是不是1, 如果是1 , 说明开启了PAE. 开启PAE就不是10 10 12了.
我写求助帖就确认开启了,既然说到了,那就再确认一次。
80528bdc cc              int     3
kd> .formats cr4
*** ERROR: Module load completed but symbols could not be loaded for vmmemctl.sys
Evaluate expression:
  Hex:     000006f9
  Decimal: 1785
  Octal:   00000003371
  Binary:  00000000 00000000 00000110 11111001
  Chars:   ....
  Time:    Thu Jan 01 08:29:45 1970
  Float:   low 2.50132e-042 high 0
  Double:  8.81907e-321
2020-4-12 23:23
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
tsoo windbg中执行 .formats cr4 看看第五位是不是1, 如果是1 , 说明开启了PAE. 开启PAE就不是10 10 12了.
看来还得还得去补点别的课了。
2020-4-12 23:26
0
雪    币: 216
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
yukihotaru 我写求助帖就确认开启了,既然说到了,那就再确认一次。 80528bdc cc              int     3 kd> .formats cr4 *** ERROR: Modu ...

感觉是不是你弄混了什么, 还是我没看懂你意思.  因为从你代码以及相关截图来看, 你是在用10 10 12的方式去解析CR3, 然后查找对应的表项, 但是从你执行.formats cr4的结果来看, 你的系统明明是工作在PAE模式,  既然开启了PAE,  那就应该按照 2 9 9 12而不是10 10 12的方式去解析.

另外你引用的那个原帖子我刚看了下也是有点迷, 什么叫"开启/关闭分页机制",  windows操作系统, 哪怕是2000,xp,只要进到桌面了, 这时候一定是开启了分页机制的. 原帖真正想说的似乎是"开启/禁用物理地址扩展"?   还有原帖中的 /nopage 参数我也是看不懂, 我记得只有 /nopae 参数, 从不记得有什么 /nopage, 更不知道windows可以禁用分页机制,  只知道能禁用的是 pae机制. (物理地址扩展)  

注意page和pae是两个东西,  一个是分页机制, 不是你想关就关的. 另一个是 physical address extension , 中文名叫物理地址扩展, 用来解决32位操作系统访问大内存用的.  

最后于 2020-5-22 00:09 被tsoo编辑 ,原因:
2020-4-13 00:47
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
666
2020-4-13 08:04
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
tsoo 感觉是不是你弄混了什么, 还是我没看懂你意思. 因为从你代码以及相关截图来看, 你是在用10 10 12的方式去解析CR3, 然后查找对应的表项, 但是从你执行.formats cr4的结果来看, ...
你提示我PAE我就去补课去了,现在已经达到以下目的。
1.PAE模式下手动定位物理内存中的HelloWorld成功。
2.使用 .formats cr4区分内存模式

不知道是虚拟主机的原因还是什么,我使用
 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /nopae
作为启动参数,依旧无法关闭PAE模式,导致分页模式无法得到验证。
PS:反正百度也没什么价值,全是易游和易乐游吹嘘他们技术多牛逼的页面。
2020-4-13 17:48
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
tsoo 感觉是不是你弄混了什么, 还是我没看懂你意思. 因为从你代码以及相关截图来看, 你是在用10 10 12的方式去解析CR3, 然后查找对应的表项, 但是从你执行.formats cr4的结果来看, ...
科学上网后又结果了,


2020-4-13 20:10
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
tsoo 感觉是不是你弄混了什么, 还是我没看懂你意思. 因为从你代码以及相关截图来看, 你是在用10 10 12的方式去解析CR3, 然后查找对应的表项, 但是从你执行.formats cr4的结果来看, ...
但是,我又看了,这个系列的第二篇文章,这优秀文章怎么那么多错误呢?
https://bbs.pediy.com/thread-180989.htm
 
他讲的第五位是不是错的,最低位应该是0位,下边是我双机调试输出的信息。

用windbg看cr4,
kd> .formats cr4
Evaluate expression:
  Hex:     000006d9
  Decimal: 1753
  Octal:   00000003331
  Binary:  00000000 00000000 00000110 11011001
  Chars:   ....
  Time:    Thu Jan 01 08:29:13 1970
  Float:   low 2.45648e-042 high 0
  Double:  8.66097e-321
2020-4-13 20:15
0
雪    币: 216
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
yukihotaru 但是,我又看了,这个系列的第二篇文章,这优秀文章怎么那么多错误呢? https://bbs.pediy.com/thread-180989.htm 他讲的第五位是不是错的,最低位应该是0位, ...

文章都是随手写的 ,   有点错误很正常,   

以intel手册为准.

最后于 2020-5-22 00:08 被tsoo编辑 ,原因:
2020-4-13 22:55
0
雪    币: 188
活跃值: (336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
tsoo 不要迷恋别人的文章, 文章都是随手写的 , 文章作者在当时可能自己都是迷迷糊糊一知半解. 有点错误很正常, 以intel手册为准.
哎,这也是没法的办法,内核书是有,理论远远大于实践的篇幅,甚至没有任何实践,初学的我真是看的云里雾里的,比如《Windows 内核情景分析》《天书夜读》都是这类,所以,这些优秀啊,精华啊,就是补充教材了,知识点不多,从理论->windbg操作,熟悉调试指令->驱动编程,DDK。就成了完整的学习曲线。
2020-4-14 01:47
0
游客
登录 | 注册 方可回帖
返回
//