Dll重定向(尚存否?)
windows核心編程(第五版)的20.6節介紹了Dll重定向。
0x01 Dll重定向簡介
產生Dll重定向原因:
應用程序 a.exe 依賴動態鏈接庫 compoent.dll 1.0 版本。但是用戶的另一個軟件b 在系統的系統目錄安裝了 component.dll 2.0 版本,這兩個版本不兼容,
因此,Windows 在加載 component.dll 的時候,會直接加載系統目錄中的 component.dll,這就造成了 a.exe 程序無法運行,如果這時用戶需要同時使用兩個軟件,就會造成所謂的 DLL Hell。
動態鏈接庫重定向技術如何解決 DLL Hell:
這里有兩種方法可以作為解決方案:
1.創建 a.exe.local 文件,該文件內容為空。
這時系統就會強制使 a.exe LoadLibrary 時先在 a.exe 所在的目錄下查找要加載的動態庫,之后才到系統目錄下尋找。這個解決方法適用于兩個不同的應用。
2.創建 a.exe.local 目錄,將 a.exe 依賴的庫放入其中。
這時系統就會強制使 a.exe LoadLibrary 時先在 a.exe.local 目錄下查找要加載的動態庫,之后才到系統目錄下尋找。這個解決方法適用于單個應用中存在兩個應用程序,并且以來同名但是互不兼容的庫。
動態鏈接庫重定向技術實際上是 M$ 修改了 LoadLibrary(Ex) 的代碼,使其在調用時先檢測是否存在<AppName>.local 文件或目錄實現重定向的。它是作為臨時解決 DLL HELL 的方法。并且,當應用程序存在 Manifest 時,該技術將不會起作用。
0x01 Dll重定向實現步驟:
(假設我的EXE為SHApp.exe, 要調試的DLL為 SHModule.dll):
1)在 SHApp.exe的目錄下創建一個 SHApp.exe.local
2)把你希望加載的 SHModule.dll復制到 SHApp.exe.local目錄下
3) 運行 SHApp.exe
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
int main()
{
CHAR szMoudlePath[MAX_PATH];
LPSTR szKernel32 = "kernel32.dll";
LPSTR szuser32 = "user32.dll";
HMODULE hKernel32;
//使用NULL參數,獲取本模塊路徑
if (!GetModuleFileNameA(NULL, szMoudlePath, MAX_PATH))
{return 0;}
printf("本模塊路徑 %s
", szMoudlePath);
hKernel32 = LoadLibraryA(szKernel32);
//使用Kernel32.dll的句柄模塊,獲取其路徑
if (!GetModuleFileNameA(hKernel32, szMoudlePath, MAX_PATH))
{return 0;}
printf("kernel32模塊路徑 %s
", szMoudlePath);
return 0;
}
按照這位博主的說法(http://blog.csdn.net/zacklin/article/details/7535569),要打開.local這個功能,需要在注冊表設置DevOverrideEnable值,并且重啟機器
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options]
"DevOverrideEnable"=dword:00000001
然而,在筆者win10的注冊表上,并沒有找到這個鍵值:
所以筆者猜測win10下的此技術可能得到了改進?又或者是我個人的原因?各位看官路過如若知曉的話,還望不吝賜教,感激不盡~
總結
以上是生活随笔為你收集整理的Dll重定向(尚存否?)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《多元统计分析》学习笔记之主成分分析
- 下一篇: 《统计学》学习笔记之导论