如何禁用軟件DLL劫持(Disable DLL Hijacking)
來源:吾愛破解論壇
時間:2021-10-16
前言
越來越多的木馬使用DLL劫持功能進行加載,大家也經常做補丁使用DLL劫持功能進行破解,有沒有想過如何進行防護了?本文介紹通過修改文件manifest屬性進行定向位置加載和動態(tài)加載簽名校驗來解決劫持問題,給開發(fā)者提供一些防護思路,加強軟件保護,防止被劫持利用。
介紹
木馬:如早期的犇牛木馬,使用偽裝LPK.DLL、USP10.DLL系統DLL進行劫持加載傳播感染,到如今各種流氓軟件和APT組織使用DLL劫持正常軟件繞過安全軟件攔截,如使用偽裝chrome.dll劫持Chrome.exe來實現加載,其中比較知名APT組織海蓮花(OceanLotus)最為擅長。
破解補丁:Windows平臺加密殼發(fā)展到如今階段,脫殼成本提升和自校驗的加強,已經很少有直接通過文件Patch進行補丁破解了,基本都開始使用內存修改的方式進行補丁,相對于傳統的啟動進程再修改內存的方式,DLL劫持修改內存更為方便,DLL劫持補丁已經成為主流的破解補丁存在方式了。為什么可以進行DLL劫持了,本文不再贅述,可以參看微軟官方的介紹:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order。
防護方法
1、對于系統DLL,不通過修改本機KnownDLLs進行單機防護,而是通過修改文件manifest屬性進行定向加載DLL來解決通用系統DLL劫持問題,開發(fā)者可以看微軟的manifest介紹:
>https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests。
比如我們給程序添加以下代碼
復制代碼 隱藏代碼
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assemblymanifestVersion="1.0"xmlns="urn:schemas-microsoft-com:asm.v1">
<filename="winmm.dll"loadFrom="%SystemRoot%\system32\winmm.dll" />
<filename="lpk.dll"loadFrom="%SystemRoot%\system32\lpk.dll" />
<filename="version.dll"loadFrom="%SystemRoot%\system32\version.dll" />
</assembly>
編譯成功后再進行winmm.dll、lpk.dll和version.dll劫持,就會無效了,這里只添加了部分DLL,可以根據自己程序所需,把對應所有的導入表中的系統DLL都加入即可。對于二次開發(fā)的程序沒有源代碼如何進行修改了?我們可以使用ResEdit等資源工具進行修改,如圖所示:
2、對于非系統第三方DLL,上面的方法就不太適用了,可以使用動態(tài)加載方式,不要使用靜態(tài)導入方式加載,通過動態(tài)加載對文件進行校驗,如數字簽名校驗通過后再進行加載,來保證程序的安全性。
結語
未知攻焉知防,充分了解攻擊手段才才可以做出更好的防御。