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