※ 引述《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中其实都还是同一块
但当你一改 就不再共用了 所以才会发生你的状况