作者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