作者dick901 (dick901)
看板CSSE
标题[问题] DLL只有一个执行个体?
时间Thu Jul 5 14:50:37 2012
小弟我在网路上搜寻的许久,结果都显示了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档的机制上理解有错误,还是我在系统记忆体的管理
理解上有错误?希望各位高手提点一下!!谢谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.224.65.226