首页
社区
课程
招聘
[求助]为什么Windows的系统DLL对于每个程序都加载在同一个位置?
发表于: 2020-4-23 16:26 3144

[求助]为什么Windows的系统DLL对于每个程序都加载在同一个位置?

2020-4-23 16:26
3144
据我所知,Windows一个也有ASLR的机制吧,这样的话系统DLL的加载位置为什么对于每个程序都一样呢?

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
2
直接从其他内存映射过来,不加载。
你用pchunter把系统DLL文件删了,重启前exe照样可以正常运行。
2020-4-23 16:46
0
雪    币: 129
活跃值: (407)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
你看到的地址是Windows操作系统维护的线性地址;在Windows内核中维护了线性地址到物理地址的映射。
2020-4-23 17:20
0
雪    币: 364
活跃值: (1736)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
系统dll,是其他内存映射过来。所以基地址不变,除非这个dll,从全部进程卸了,重新加载dll。
2020-4-23 19:51
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
5
内存的属性一般有两种,private和mapped,Windows系统下,private属性的内存是由VirtualAlloc或者 VirtualAllocEx申请的,比如进程私有的,如堆,栈属于这类内存。而mapped属性的内存由CreateFileMapping申请,后者可能是在多个进程中共享同一个物理页,这样可以节省内存。在Windbg的输入命令!var addr  addr是某个进程EPROCESS位于0x11c位置处名为vadroot的首地址,(这是一个搜索二叉根节点所在地)可以看出一个进程的内存映射情况,如下图,我截取了一点,可以看到dll的内存属性mapped。共享的内存可以仅仅是内存,也可以是一个文件。我记得以前绝地求生的文件可以用MBR(叫啥忘记了喜喜)技术过掉文件保护,原理就是在另一个进程里映射这份受保护的文件,在本进程对该文件的修改就同步到其他进程中


另外,要注意写拷贝属性EXECUTE_WRITECOPY,由于写拷贝的存在,尽管映射为同一个物理页,但我们在一个进程如果给dll里某函数挂钩子,只能在本进程起作用,其他进程不起作用,就是由于写拷贝

最后于 2020-4-23 21:54 被r0Cat编辑 ,原因:
2020-4-23 21:39
2
雪    币: 247
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
amzilun 内存的属性一般有两种,private和mapped,Windows系统下,private属性的内存是由VirtualAlloc或者 VirtualAllocEx申请的,比如进程私有的,如堆,栈属 ...
那么我再一个进程中对这类文件的修改是不是要重启整个系统才能生效?
2020-4-23 21:50
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
先问是不是,再问为什么
2020-4-23 21:53
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
8
Freway 那么我再一个进程中对这类文件的修改是不是要重启整个系统才能生效?
不需要重启,对物理页的操作是即时生效的。
最后于 2020-4-23 22:01 被r0Cat编辑 ,原因:
2020-4-23 22:00
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
节省内存,也便于管理
2020-4-23 23:49
0
游客
登录 | 注册 方可回帖
返回
//