背景
或許你聽過DLL劫持技術,擷取你還沒有嘗試過DLL劫持技術。DLL劫持技術的原理是:
由于輸入表中隻包含DLL名而沒有它的路徑名,是以加載程式必須在磁盤上搜尋DLL檔案。首先會嘗試從目前程式所在的目錄加載DLL,如果沒找到,則在Windows系統目錄中查找,最後是在環境變量中列出的各個目錄下查找。利用這個特點,先僞造一個系統同名的DLL,提供同樣的輸出表,每個輸出函數轉向真正的系統DLL。程式調用系統DLL時會先調用目前目錄下僞造的DLL,完成相關功能後,再跳到系統DLL同名函數裡執行。這個過程用個形象的詞來描述就是系統DLL被劫持
實作過程
本文選取劫持的程式是從網上随便下的一個程式“360檔案粉碎機獨立版.exe”,我們使用 PEview.exe 檢視改程式的導入表,主要是看有程式需要導入哪些DLL檔案。
觀察導入的DLL,類似KERNEL32.DLL、USER32.DLL等受系統保護的重要DLL,劫持難度比較大,是以,我們選擇VERSION.DLL。至于,判斷是不是受系統保護的DLL,可以檢視系統資料庫裡面的鍵值,裡面的DLL都是系統保護的,加載路徑固定:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls
然後,确定劫持的DLL檔案之後,我們使用 AheadLib 工具來生成DLL劫持代碼:
接着,建立一個DLL工程,把AheadLib工具生成的代碼拷貝到DLL工程中,同時,我們在DLL的入口點函數DllMain中增加一行彈窗代碼,這樣可以提示我們DLL劫持成功。然後編譯連結,生成DLL檔案。這個我們自己編譯生成的DLL檔案,就可以把DLL名稱改成“VERSION.DLL”,放到和“360檔案粉碎機獨立版.exe”程式在同一目錄下,運作程式,則會加載同一目錄下的“VERSION.DLL”。為了驗證DLL程式是否能成功劫持,我們把改名後的“VERSION.DLL”和“360檔案粉碎機獨立版.exe”放在桌面,然後,運作程式,這是,成功彈窗:
我們使用 Process Explorer 工具檢視下“360檔案粉碎機獨立版.exe”程序加載的DLL情況:
可以看到,我們自己的version.dll成功被加載,而且還加載了系統的version.dll。之是以會加載系統的version.dll檔案,是因為我們自己的DLL檔案中,會加載version.dll檔案。
編碼實作
現在,我給出version.dll劫持部分入口點部分的代碼,其餘的代碼都是使用AheadLib工具生成的,自己在入口點添加了一行彈窗的代碼而已。
// 入口函數
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
::MessageBox(NULL, "I am Demon", "CDIY", MB_OK);
return Load();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Free();
}
return TRUE;
}