天天看點

基于AheadLib工具進行DLL劫持

背景

或許你聽過DLL劫持技術,擷取你還沒有嘗試過DLL劫持技術。DLL劫持技術的原理是:

由于輸入表中隻包含DLL名而沒有它的路徑名,是以加載程式必須在磁盤上搜尋DLL檔案。首先會嘗試從目前程式所在的目錄加載DLL,如果沒找到,則在Windows系統目錄中查找,最後是在環境變量中列出的各個目錄下查找。利用這個特點,先僞造一個系統同名的DLL,提供同樣的輸出表,每個輸出函數轉向真正的系統DLL。程式調用系統DLL時會先調用目前目錄下僞造的DLL,完成相關功能後,再跳到系統DLL同名函數裡執行。這個過程用個形象的詞來描述就是系統DLL被劫持

實作過程

本文選取劫持的程式是從網上随便下的一個程式“360檔案粉碎機獨立版.exe”,我們使用 PEview.exe 檢視改程式的導入表,主要是看有程式需要導入哪些DLL檔案。

基于AheadLib工具進行DLL劫持

觀察導入的DLL,類似KERNEL32.DLL、USER32.DLL等受系統保護的重要DLL,劫持難度比較大,是以,我們選擇VERSION.DLL。至于,判斷是不是受系統保護的DLL,可以檢視系統資料庫裡面的鍵值,裡面的DLL都是系統保護的,加載路徑固定:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\knowndlls      
基于AheadLib工具進行DLL劫持

然後,确定劫持的DLL檔案之後,我們使用 AheadLib 工具來生成DLL劫持代碼:

基于AheadLib工具進行DLL劫持

接着,建立一個DLL工程,把AheadLib工具生成的代碼拷貝到DLL工程中,同時,我們在DLL的入口點函數DllMain中增加一行彈窗代碼,這樣可以提示我們DLL劫持成功。然後編譯連結,生成DLL檔案。這個我們自己編譯生成的DLL檔案,就可以把DLL名稱改成“VERSION.DLL”,放到和“360檔案粉碎機獨立版.exe”程式在同一目錄下,運作程式,則會加載同一目錄下的“VERSION.DLL”。為了驗證DLL程式是否能成功劫持,我們把改名後的“VERSION.DLL”和“360檔案粉碎機獨立版.exe”放在桌面,然後,運作程式,這是,成功彈窗:

基于AheadLib工具進行DLL劫持

我們使用 Process Explorer 工具檢視下“360檔案粉碎機獨立版.exe”程序加載的DLL情況:

基于AheadLib工具進行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;
    }