作者jackace (inevitable......)
看板CSSE
标题Re: [问题] DLL只有一个执行个体?
时间Sat Jul 7 01:22:21 2012
※ 引述《dick901 (dick901)》之铭言:
: 小弟我在网路上搜寻的许久,结果都显示了DLL可以节省记忆体的使用,多个执行序可
: 以同时使用单一DLL来共用记忆体里DLL的单一复本。也就是说一个执行序一但载入了
: 一个DLL,那个DLL就不必再次载入记忆体,就算其他的执行序呼叫LoadLibrary()等
: 函数载入该DLL档,也只是把计次变数+1,并不会做重复载入DLL的动作,直到执行
: 序退出,或者使用VirtualFree等函数,才会将该DLL档从记忆体卸载。(以上是小弟
: 我的理解,不知道有没有错)
: 但是,今天我写了一个小程式他会HOOK"User32.dll"里面的FindWindowExW()函数,
: 使用Inline Hook的方法,将该API的开头5个BYTES改成JMP XXXXXXXX,其中XXXXXXXX
: 是与我自己写的HOOK函数偏移,照刚刚的逻辑,是否我HOOK了一次FindWindowExW函数,
: 然後所有载入User32.dll的程序,里面的FindWindowExW函数的开头,都被我更改了呢?
: 为了验证,我又写了一个小程式,里面载入了User32.dll,并且让两个程式同时运行,
: 然後使用OllyDbg分别载入两个程式,观察FindWindowExW的开头,发现两个程式的
: FindWindowExW函数并不相同,一个受到了我的更改,另一个则是维持原状是
: mov edi,edi
: push ebp...
: 请问这是甚麽原因?是我在DLL档的机制上理解有错误,还是我在系统记忆体的管理
: 理解上有错误?希望各位高手提点一下!!谢谢!!
DLL的存在 是为了
1.把共用的部份抽出 让程式本身在硬碟上占据空间少一点
2.程式库更新方便 有新的改动换dll就好
像Win32 API那种dll 避免直接link进你的程式有这些好处
loading dll的时候 是载入到各自的process address space
当你改了process A中的user32.dll 这时不同的OS有时候有不同的做法
在Windows上
OS会进行copy on write
这样一来 只要process没有去改load进来的dll的code section
在physical memory中其实都还是同一块
但当你一改 就不再共用了 所以才会发生你的状况
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.169.153.177
※ 编辑: jackace 来自: 1.169.153.177 (07/07 01:32)
1F:推 dick901:感谢您的指导!终於搞懂了! 07/09 22:58