首页
社区
课程
招聘
[旧帖] [讨论]Windows是如何处理进程环境切换的? 0.00雪花
发表于: 2008-2-28 13:39 4691

[旧帖] [讨论]Windows是如何处理进程环境切换的? 0.00雪花

2008-2-28 13:39
4691
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到虚拟空间去吧,这样代价似乎太大了,很消耗时间

请大家帮忙一下,我在上面提到的各种自己乱猜的想法中,有哪些是对的?哪些是错的?

找了很多资料,没找到非常肯定的答案,唉,只好来论坛问问了,我太菜了!

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
举个例子
为了得到每个进程调用send发送了什么,有个做法就是利用钩子,修改每个进程的send函数的头部的代码,先跳到自己的处理函数得到发送的数据,然后再返回执行send函数,这个算是API HOOK了吧

所谓“加载”,无非就是指将DLL的代码拷贝到内存中去
比如将user32.dll的全部函数代码包括MessageBoxA拷贝进去,这样每个程序都可以方便地调用他
那是不是说,当系统调度后轮到进程A运行了,这时候进程A如果要调用user32的MessageBoxA函数,就会先拷贝一次这个MessageBoxA代码

也就是说,由头到尾始终只有一份代码拷贝。

但是如果没有多份拷贝,应该不会出现我上面提到的问题的:进程A修改他的MessageBoxA并不会影响到进程B

所以:操作系统为了减少环境切换时的时空消耗,应该要尽量减少拷贝的操作,为了实现这个目的,对同一个DLL,应该只需要维持一份就行了
但是:既然只有一个拷贝,进程A修改了某个函数的代码,为什么没有影响到别的进程?
2008-2-28 14:16
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
有CopyOnWrite机制,如果你去修改自己的kernel32,系统产生一个副本
没有修改的都映射在一起
2008-2-28 14:30
0
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢forgot的回复!

这个我也曾经想过可能是这样处理的,这么做的复杂度是很大的,我还以为操作系统不会这么实现,呵呵,看来我低估了写操作系统的人。。。
2008-2-28 14:44
0
游客
登录 | 注册 方可回帖
返回
//