MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 请问一个核心编程共关于虚拟地址空间的有关问题

请问一个核心编程共关于虚拟地址空间的有关问题

www.MyException.Cn  网友分享于:2013-02-26  浏览:8次
请教一个核心编程共关于虚拟地址空间的问题
13.2.4   64   KB禁止进入的分区—仅适用于Windows   2000
这个位于用户方式分区上面的64   KB分区是禁止进入的,访问该分区中的内存的任何企图均
将导致访问违规。M   i   c   r   o   s   o   f   t之所以保留该分区,是因为这样做将使得M   i   c   r   o   s   o   f   t能够更加容易地实
现操作系统。当将内存块的地址和它的长度传递给Wi   n   d   o   w   s函数时,该函数将在执行它的操作之
前使内存块生效。可以很容易创建类似下面这个代码(在3   2位Windows   2000系统上运行):

[代码]

对于Wr   i   t   e   P   r   o   c   e   s   s   M   e   m   o   r   y这样的函数来说,写入的内存区是由内核方式代码来使之生效的,
该代码能够成功地访问内核方式分区中的内存(   3   2位系统上0   x   8   0   0   0   0   0   0   0以上的地址)。如果在
0   x   8   0   0   0   0   0   0   0地址上存在内存,上面的函数调用就能成功地将数据写入只应该由内核方式代码访
问的内存。为了防止出现这种情况,并使这个内存区迅速生效,   M   i   c   r   o   s   o   f   t选择的办法是使该分
区始终保持禁止进入的状态。只要试图读取或写入该分区中的内存,就一定会导致访问违规。

这一段没太看懂,为什么这么做就能防止读取和写入内核分区中的内存?高手给解释一下。

------解决方案--------------------
这里先假设你没有打开/3g开关

如果不保留这样一个分区,用户调用WriteProcessMemory就有可能直接写入操作系统的代码空间, 那个例子也写得比较清楚了,用户可以创建那样一段代码,从用户地址空间的高段0x7F...开始写入一段实际上超过0x80000000边界的数据, 但由于这个起始地址空间是在用户区的,所以系统不会警告这个地址非法,因此调用成功。而一旦调用成功, WriteProcessMemory会进入了Kernel Mode调用内核代码来实现, Kernel Mode下是可以对高地址空间进行写入的,因此也不会报访问异常, 最后的结果就是用户把数据从用户空间一直写到了操作系统空间...

保留了这样一个分区以后, "任何 "从这里“路过”的内存访问都将导致Access Violation,所以那段程序运行中就会报错
我对这个“任何”的理解是包括了Kernel Mode下对该分区的访问.

这是我对该分区存在意义的理解 :)
------解决方案--------------------

WrietProcessMemory 会调用NtWriteVirtualMemory,里面有如下逻辑,

if (BaseAddress + BufferSize > MmHighestUserAddress)
return STATUS_ACCESS_VIOLATION;

(你可以在KD下面自己看一下:

u nt!NtWriteVirtualMemory

819f6e0a 8b7514 mov esi,dword ptr [ebp+14h]
...
819f6e11 8b450c mov eax,dword ptr [ebp+0Ch]
...
819f6e14 8d1430 lea edx,[eax+esi] (Edx = base + bufferSize)
..
819f6e25 a19c759281 mov eax,dword ptr [nt!MmHighestUserAddress (8192759c)]
819f6e2a 3bd0 cmp edx,eax
819f6e2c 7753 ja nt!NtWriteVirtualMemory+0x86 (819f6e81)

819f6e81 b8050000c0 mov eax,0C0000005h (return STATUS_ACCESS_VIOLATION)
)

起始地址当然也查,我省略了。你有兴趣自己研究研究。

kd> dt MmHighestUserAddress
nt!MmHighestUserAddress
0x7ffeffff <===================== = 0x7FFFFFFF - 64K.

所以起始地址和访问地址都会查。

文章评论

代码女神横空出世
代码女神横空出世
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
中美印日四国程序员比较
中美印日四国程序员比较
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我是如何打败拖延症的
我是如何打败拖延症的
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老程序员的下场
老程序员的下场
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Java程序员必看电影
Java程序员必看电影
一个程序员的时间管理
一个程序员的时间管理
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
 程序员的样子
程序员的样子
程序员的鄙视链
程序员的鄙视链
为什么程序员都是夜猫子
为什么程序员都是夜猫子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员必看的十大电影
程序员必看的十大电影
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
旅行,写作,编程
旅行,写作,编程
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员都该阅读的书
程序员都该阅读的书
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
那些争议最大的编程观点
那些争议最大的编程观点
总结2014中国互联网十大段子
总结2014中国互联网十大段子
每天工作4小时的程序员
每天工作4小时的程序员
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
鲜为人知的编程真相
鲜为人知的编程真相
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有