-
-
[旧帖]
[讨论]Windows是如何处理进程环境切换的?
0.00雪花
-
发表于:
2008-2-28 13:39
4692
-
[旧帖] [讨论]Windows是如何处理进程环境切换的?
0.00雪花
1、每个进程都以为自己有4G的可寻址空间,里面要放代码和数据,还有别的要加载的DLL等等
但实际不可能存在这么大的空间,其实是虚拟的,那么应该只有唯一的一块空间吧?
2、系统有3个核心的dll(kernel32/user32/gdi32),这3个肯定是已经加载到这个所谓的虚拟空间里面了的,那么,是不是对于每个进程来说它们都是映射到同一个地址?
这个问题举个例子来说,比如MessageBoxA是在user32.dll里面的,而大多进程都有这个dll,那么是不是对于每个进程来说,MessageBoxA的地址都是相同的?具体来说,对于进程A来说MessageBoxA的地址假如是0x77777777,那么对于进程B来说MessageBoxA的地址是否也是0x77777777?
如果是的话:
a)假设进程A将MessageBoxA的头几个指令修改为跳转到自己的处理函数MyMsgBox去执行,那么进程B在调用MessageBoxA的时候应该也会执行这个MyMsgBox函数才对。
b)进程A为了让进程B调用MessageBoxA,只需要修改进程B的代码(注入等等方法)并将自己所认为的MessageBoxA的地址传给它就行了,因为地址假设是相同。
但这样就会乱套,实际也不可能这么简单就修改到这些API,那么为什么对于进程A来说,当修改MessageBoxA的代码的时候,确实是真的修改到了,而对于进程B来说,MessageBoxA还是原来的MessageBoxA?那Windows究竟是怎么解决或者说如何实现这个问题的处理的?
会不会是这样:
每个进程都确实地分别加载那些核心DLL(kernel32/user32/gdi32)各一份,同时分别加载各自要求加载的别的DLL,这样的话,进程A实际上只能修改到自己的MessageBoxA了。
但这样却又让我产生两个疑问:
i)浪费空间,很多DLL都重复的加载
ii)进程环境切换的时候应该是要拷贝dll到虚拟空间去吧,这样代价似乎太大了,很消耗时间
请大家帮忙一下,我在上面提到的各种自己乱猜的想法中,有哪些是对的?哪些是错的?
找了很多资料,没找到非常肯定的答案,唉,只好来论坛问问了,我太菜了!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法