關於假入庫的原理,大家在小黑盒上應該看過很多了,我在小黑盒寫的第一篇文章就是關於假入庫的原理,前段時間在寫項目的時候缺了一個NTL.DLL文件(NTL大數庫的動態鏈接庫),從網上下了一個卻不能用,最後逼得自己從頭編譯這個DLL,突然聯想到假入庫的最後一步也是替換DLL,正好講一下關於DLL劫持的知識。
DLL(Dynamic Link Library)文件被叫做動態鏈接庫文件,又稱“應用程序拓展”。在Windows中,許多應用程序或者工程並不是一個完整的可執行文件(不是一個巨大的exe文件,這樣可擴展性太差了),而是從exe文件中分割出一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。
一個應用程序可使用多個DLL文件,一個DLL文件也可能被不同的應用程序使用,這樣的DLL文件被稱為共享DLL文件,比如xlive.dll是一個包含 Games for Windows - LIVE 客戶端的實現代碼的庫文件,如果這個DLL缺少,很多遊戲就都不能啟動。
打個比方,我有一個計算農村裡有多少動物的程序EXE,那麼我可以把計算有多少牛的部分打包成一個DLL,計算多少豬的部分打包成DLL,exe本身只負責對他們的求和,這樣就可以有效減少程序本體的大小,同時模塊化程序結構,想用哪些動物就編寫哪些動物的DLL文件。
另外,DLL文件中存放的是各類程序的函數(子過程)實現過程,當程序需要調用函數時需要先載入DLL,然後取得函數的內存地址,最後進行調用。使用DLL文件的好處是程序不需要在運行之初加載所有代碼,只有在程序需要某個函數的時候才從DLL中取出,對於遊戲程序來說,不需要在遊戲加載界面就載入所有的功能函數,這也有效分擔了加載速度。
講完DLL的基本概念,再來聊一下DLL劫持,我們只來介紹最簡單的情況,當一個可執行文件運行exe時,Windows加載器將可執行模塊映射到進程的地址空間中,加載器分析可執行模塊的輸入表(可以理解為接口),需要在此時加載所有程序運行所需要的DLL文件,並將它們映射到進程的地址空間中。
當程序需要加載一個動態鏈接庫(DLL)時,攻擊者先偽造一個系統同名的DLL,提供同樣的輸出表,每個輸出函數轉向真正的系統DLL。程序調用系統DLL時會先調用當前程序所在目錄下偽造的DLL,完成相關功能後,再跳到系統DLL同名函數里執行。這個過程就是DLL劫持的過程 。
微軟為了防禦操作系統的DLL被劫持,將一些容易被劫持的系統DLL寫進了一個註冊表項中,那麼凡是此項下的DLL文件就會被禁止從EXE自身所在的目錄下調用,而只能從系統目錄即SYSTEM32目錄下調用。但是,攻擊者可以偽造一個相同名稱的dll文件,只要這個文件不在KnownDLLs註冊表項中,就可以對該dIl進行劫持。
該註冊表項下的dll被保護
在假入庫中,被攻擊者使用irm命令下載假入庫腳本,下載文件名為hid.dll的鏈接庫文件,釋放到steam文件夾裡,實現了dll劫持,使本地的客戶端誤以為遊戲已經解鎖,從而達到假入庫的目的。
dll劫持在計算機入侵中應用非常廣泛,只要目標dll文件不再'KnownDLLs'註冊表中,且是EXE程序首先加載的DLL,而不需要依賴其他DLL加載。一個很經典的案例是2023年ESET研究人員發現了一個使用木馬安裝程序來傳遞FatalRAT惡意軟件的活動,該惡意軟件通過隱藏在一些常用軟件裡(比如fiefox,whatsapp等),通過Google搜索結果中出現的廣告中鏈接的惡意網站進行分發,影響範圍非常大:
研究者在論文中給出的簡化攻擊流程
該惡意軟件通過旁加載惡意 DLL libpng13.dll 來運行,原始libpng13.dll也包含在安裝程序包中(重命名為看似隨機的名稱),因為惡意 DLL 將其導出的函數轉發到原始 DLL。原始 DLL 已重命名為 BHuedjhd.dll,並且惡意 DLL 被編譯為 Dll22.dll。
惡意 DLL 中轉發到原始 DLL 的部分導出函數
為了隱藏,該該惡意項目的加載程序 libpng13.dll 在內存中打開並執行一個名為 Micr.jpg 的文件,該文件與 DLL 位於同一目錄中。攻擊者通過多次調用一個函數來混淆加載程序,該函數只打印一些硬編碼值。此行為用於避免被安全解決方案檢測到或使 DLL 的分析複雜化。
左側的混淆代碼和右側的去混淆代碼
但是其實Micr是偽造的shellcode(即利用漏洞實現攻擊的代碼)還包含嵌入式 DLL。此 shellcode 的用途是通過調用名為 SignalChromeElf 的 DLL 的導出函數,在內存中加載和執行嵌入的 DLL。在執行此導出函數之前,shellcode會重構 DLL 的 imports 表並調用 DllEntryPoint,後者只是調用 Windows API 函數 DisableThreadLibraryCalls 作為增加 DLL 隱蔽性的一種方式。通過這種方式,成功繞過了安全審計,在用戶的移動終端上安裝了木馬軟件。
綜上所述,DLL劫持是一種很常用的攻擊手段,常見於病毒木馬或網絡釣魚攻擊中,不管是下載軟件還是購買遊戲前,都應該仔細審查是否有被劫持的風險,特別是在互聯網上裸奔的盒友(沒有使用殺毒軟件)。
參考:
CSDN:DLL 劫持原理(運維)_dll劫持
Bilibili:Steam入庫,irm steam.work|iex 風險和原理(代碼分析)
清華大學《操作系統原理與實踐教程》
ESET:These aren’t the apps you’re looking for: fake installers targeting Southeast and East Asia