日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Dll重定向(尚存否?)

發(fā)布時(shí)間:2023/12/19 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 Dll重定向(尚存否?) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  windows核心編程(第五版)的20.6節(jié)介紹了Dll重定向。

0x01 Dll重定向簡(jiǎn)介

  產(chǎn)生Dll重定向原因: 

  應(yīng)用程序 a.exe 依賴動(dòng)態(tài)鏈接庫(kù) compoent.dll 1.0 版本。但是用戶的另一個(gè)軟件b 在系統(tǒng)的系統(tǒng)目錄安裝了 component.dll 2.0 版本,這兩個(gè)版本不兼容,

因此,Windows 在加載 component.dll 的時(shí)候,會(huì)直接加載系統(tǒng)目錄中的 component.dll,這就造成了 a.exe 程序無(wú)法運(yùn)行,如果這時(shí)用戶需要同時(shí)使用兩個(gè)軟件,就會(huì)造成所謂的 DLL Hell。

  

  動(dòng)態(tài)鏈接庫(kù)重定向技術(shù)如何解決 DLL Hell:

 這里有兩種方法可以作為解決方案:

  1.創(chuàng)建 a.exe.local 文件,該文件內(nèi)容為空。

   這時(shí)系統(tǒng)就會(huì)強(qiáng)制使 a.exe LoadLibrary 時(shí)先在 a.exe 所在的目錄下查找要加載的動(dòng)態(tài)庫(kù),之后才到系統(tǒng)目錄下尋找。這個(gè)解決方法適用于兩個(gè)不同的應(yīng)用。

   2.創(chuàng)建 a.exe.local 目錄,將 a.exe 依賴的庫(kù)放入其中。

  這時(shí)系統(tǒng)就會(huì)強(qiáng)制使 a.exe LoadLibrary 時(shí)先在 a.exe.local 目錄下查找要加載的動(dòng)態(tài)庫(kù),之后才到系統(tǒng)目錄下尋找。這個(gè)解決方法適用于單個(gè)應(yīng)用中存在兩個(gè)應(yīng)用程序,并且以來(lái)同名但是互不兼容的庫(kù)。

  動(dòng)態(tài)鏈接庫(kù)重定向技術(shù)實(shí)際上是 M$ 修改了 LoadLibrary(Ex) 的代碼,使其在調(diào)用時(shí)先檢測(cè)是否存在<AppName>.local 文件或目錄實(shí)現(xiàn)重定向的。它是作為臨時(shí)解決 DLL HELL 的方法。并且,當(dāng)應(yīng)用程序存在 Manifest 時(shí),該技術(shù)將不會(huì)起作用。

0x01 Dll重定向?qū)崿F(xiàn)步驟:  

   (假設(shè)我的EXE為SHApp.exe, 要調(diào)試的DLL為 SHModule.dll):

  1)在 SHApp.exe的目錄下創(chuàng)建一個(gè) SHApp.exe.local

  2)把你希望加載的 SHModule.dll復(fù)制到 SHApp.exe.local目錄下

  3) 運(yùn)行 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參數(shù),獲取本模塊路徑
	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;
}

  

  按照這位博主的說(shuō)法(http://blog.csdn.net/zacklin/article/details/7535569),要打開(kāi).local這個(gè)功能,需要在注冊(cè)表設(shè)置DevOverrideEnable值,并且重啟機(jī)器

  [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options]

  "DevOverrideEnable"=dword:00000001

  然而,在筆者win10的注冊(cè)表上,并沒(méi)有找到這個(gè)鍵值:

  

   所以筆者猜測(cè)win10下的此技術(shù)可能得到了改進(jìn)?又或者是我個(gè)人的原因?各位看官路過(guò)如若知曉的話,還望不吝賜教,感激不盡~

  

總結(jié)

以上是生活随笔為你收集整理的Dll重定向(尚存否?)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。