首页
社区
课程
招聘
[旧帖] [求助]进程虚拟内存问题 0.00雪花
发表于: 2014-4-17 21:02 2107

[旧帖] [求助]进程虚拟内存问题 0.00雪花

2014-4-17 21:02
2107
每个进程虚拟内存的0x7FFFFFFF-0xFFFFFFFF地址是映射到相同的物理内存吗?这块内存有什么映射约定?

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
那也是虚拟内存啊,只是r3不能访问而已,建议你去看看分页机制。
保护模式下都是虚拟线性地址,几句话说不清楚,查资料吧。
2014-4-18 23:04
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
映射到相同物理内存不是很节省资源吗,反正r3不能访问,干脆锁死0x7FFFFFFF以上的也行啊,微软是怎么想的?
2014-4-21 11:20
0
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
你所说的大体意思上是对的,上次回复的时候没有想太多,不好意思

每个进程虚拟内存的0x7FFFFFFF-0xFFFFFFFF地址是映射到相同的物理内存吗?
答:是,共用一份页表(个人猜测)。
而且低2GB内存并带有CopyOnWrite属性的页同样映射到相同的物理内存。

这块内存有什么映射约定?
答:没看懂,不知道你要问什么。
2014-4-21 18:08
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这块内存在内存管理器的初始化阶段被建立,具体映射规则在内核中的MiGetPteAddress宏中可能有提到。(见潘爱民大神的《Windows内核原理与实现》)
2014-4-21 20:16
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
0x7FFFFFFF-0xFFFFFFFF既然是共享的,为什么我用调试器修改一个进程系统地址里的内存比如说kernel32.dll里的一个api,其他进程的该api没变化?
难道进程的高2GB虚拟地址也需要每个进程都备份吗?
2014-5-7 21:54
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
kernel32不在高位地址
2014-5-7 22:00
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
高位地址,共享的,任何进城均可修改,访问,但r3无权限,只要r0,用权限,r0代码可以在低位地址运行
2014-5-7 22:02
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我修改一个进程A的高2GB内存,另一个进程B同样地址的内存并没有改变啊?
2014-5-7 22:06
0
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
这个问题我遇到过,在内核态中不容易修改,因为kernel32的页带有CopyOnWrite属性,如果你修改成功,只会有两种情况:
1.触发了CopyOnWrite。2.修改了全局内存。
而你的结果很显然触发了CopyOnWrite,系统为你重新映射了一份内存,保护了全局的kernel32镜像内存。
另外,kernel32.dll的线性地址很显然在低地址,不属于内核态空间。
虽然有的地址是0x7F开头,但也是低位地址,只有地址大于0x80000000的才是内核空间内存,即二进制最高位是不是1代表了地址是否为内核空间。
2014-5-8 00:50
0
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
内核态内存,也就是高位地址确实是唯一共享的,你的实验方法不对。
2014-5-8 00:52
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看过 window核心编程  不过里面也没有lz的答案 哦
2014-5-8 17:16
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
这个,内核空间不是以2G区分的哈,你找找资料,
准确的说,是内核空间共享,内核空间只有一个,如果你修改掉了,其它进程所访问到的内核空间,不可能说没有改变
2014-5-8 17:44
0
雪    币: 6890
活跃值: (8944)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
14
好像是 0x80000000 开始的是内核,kernel32、ntdll.dll不在内核里。
2014-5-8 21:07
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
非常感谢你的耐心,也很详细。其他人也一并感谢,kernerl32确实在应用层,我看错了,之前对这个问题一直没想明白。
2014-5-9 00:02
0
游客
登录 | 注册 方可回帖
返回
//