最近碰到了乙個問題,要引入乙個第三方的sdk,但是sdk中使用的一些dll和我原本程式裡面有些dll是同名的,而且本程式的dll和sdk的dll名稱都不能修改。
解決這個問題,首先想到的就是多程序,這就用到了我們之前開發的乙個專門用來託管dll的程序。先是將sdk打包到另外乙個單獨的目錄(因為與本程式中的dll名稱衝突),隨後寫了乙個包裝sdk的dll,把這個dll給了託管程序。
這樣既使用了sdk的功能,又把第三方的程式隔離開了,看似不錯的解決方案。
但是遇到了另外乙個問題,我的託管程序也是在exe的目錄下的,所以他的預設載入順序還是exe所在路徑為最優先,這樣隱式載入還是會先載入該目錄下的同名dll,這樣會導致sdk所在的託管程序無法啟動。
所以再加一道程式: 在包裝sdk的dll工程裡面設定要載入的sdk dll為延遲載入,然後在呼叫sdk方法前手動loadlibrary載入sdk的dll,這樣後面exe目錄下的同名dll就不會被載入了。
總結一下有一下幾點:
1. 隱式載入會按照標準順序載入,無法通過**修改載入順序
2. dll延遲載入,會在dll中匯出方法第一次被呼叫的時候載入,所以在這之前有機會修改載入順序。
3. 除了loadlibraryex用load_with_altered_search_path這個引數載入dll之外,沒有其他方法可以影響exe目錄為最優先的順序(setcurrentdirectory, setdlldirectory)
4. 同名的dll只會被載入一次,只有所有載入同名的dll都會被忽略。所以利用這個特性,就可以做一些事情。比如延遲載入,先載入自己的,後面系統再去載入的時候發現已經載入了,後續的dll就不會被記載進來。
目錄結構如下:
DLL載入順序劫持
動態鏈結庫搜尋順序 win32應用 微軟文件 技術分享 dll劫持 老樹開新花 dll劫持漏洞新玩法 h2z 深入解析dll劫持漏洞 wooyun知識庫 一種通用dll劫持技術研究 程式語言區 吾愛破解 lcg lsg 安卓破解 病毒分析 破解軟體 www.52pojie.cn 這個鏈結裡的內容沒看...
關於DLL路徑載入順序的問題
預設系統xp,安全搜尋模式 hklm system currentcontrolset control session manager safedllsearchmode值為0時為非安全,其餘情況為安全,xp後系統支援 一 標準的dll路徑載入 例如隱式載入,或者如下的顯示載入 loadlibrar...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...