好了,前面說了這麽多,大概又嚇得壹批人開始冒冷汗了吧,我們現在就來學習如何防範和破解“映像劫持”。 最簡單的方法是逐個運行妳常用的安全工具,檢查是否出現“無法找到文件”或者幹脆直接沒了反應的,當然,執行結果和預期差別太大的也要被懷疑為劫持,例如妳執行IceSword.exe反而是妳的QQ運行了,那就不必我多說了。
其實只要註冊表編輯器regedit.exe、regedt32.exe沒有被劫持,那我們直接用它進入“HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”這個註冊表項並展開裏面的子項列表壹個個看下來確認是否出現Debugger參數或其他可能影響程序運行的堆管理參數,便可得知機器是否被劫持。
如果註冊表編輯器被劫持了怎麽辦?直接改個名就能用了啊……
更簡單的方法,是使用Sysinternals的Autoruns,點擊它的“Image Hijacks”選項卡,即可看到被劫持的程序項了。 如果不幸妳的機器上已經成為“映像劫持”的受害者,請記錄好Debugger指向的程序位置,也不要試圖再執行那些安全工具,首先應該嘗試刪除受影響的 IFEO項,然後刷新註冊表看看數據是否馬上恢復了,如果馬上恢復,則說明後臺裏有程序正在實時判斷和寫入IFEO,這時候必須拿出 Sysinternals出品的註冊表監控工具Regmon或類似工具,設置Filter為妳正在嘗試刪除的安全工具的IFEO項,很快就能發現具體是什麽進程在操作註冊表了,然後將IceSword改名(如果已經被劫持),在它的進程列表裏將相應進程終止掉。如果這個進程立即又重生了呢?再終止壹次,然後迅速點擊IceSword的“監視進線程創建”,妳就能發現上壹次搗亂的程序是什麽名字了,將它記錄下來,再開啟壹個Sysinternals的工具 “Process Explorer”,在對應進程上點擊右鍵選擇“Suspend”,這個進程就會被掛起,用IceSword和它配合把相關惡意進程都掛起後,再使用 IceSword的文件功能裏的“強制刪除”,在這個程序還沒來得及反應時就把它們的本體給殲滅,這時候再返回Process Explorer裏按照大小排列從最大的壹個守護進程開始Kill Process即可,由於沒有了映像文件存在,它們意欲重新建立木馬帝國的賊心也就無法實現了。
如果查殺過程更為復雜的話,請自行參閱相關文章,這裏就不再贅述了。
如此實現“免疫”?不被推薦的做法
由於AV終結者搞得人心惶惶,壹時間網絡上開始流傳“免疫映像劫持”甚至“利用映像劫持免疫大部分常見病毒”的做法,對於這些方法的最初提供者,我相信他們的出發點是好的,只是,從嚴格的角度來看,這卻是不可取的。
首先是“免疫映像劫持”,具體的方法是,例如免疫威金病毒“logo_1.exe”,則在IFEO列表裏建立壹個“logo_1.exe”項,然後設定它的 Debugger參數為它自身即“logo_1.exe”,根據原作者解釋,其原理是遞歸死循環:“當Debugger的值等於本身時,就是調用自身來調試自己,結果自己不是調試器,又來壹次,遞歸了,就進入了死循環,也就不能啟動了。”
這種方法雖然有效(最後的現象是“找不到文件”),但是它會導致系統在短時間內陷入壹個CreateProcess循環和命令參數的字符串累加狀態,會消耗壹定的資源,最終沒能執行程序是因為系統使用 CreateProcess啟動的實例會被它自身代替執行,從而造成死循環,而且命令行的長度是有系統限制的,到壹定範圍就會出錯了,尤其在可以接受命令行參數的程序裏,妳甚至會發現硬盤狂轉了好壹會兒才彈出錯誤提示,這段時間裏就是在死循環傳遞狀態了,最終由於超過系統限制的命令行長度而導致系統傳遞執行請求時出錯,才得以跳出這個死循環,換壹個角度來看,如果系統沒有限制命令行長度,那麽這個操作很可能直接導致系統所有資源都消耗在這個自己反復執行自己的“調試器”上了。
至於“利用映像劫持免疫大部分常見病毒”的做法,發起號召者模仿“映像劫持”後門屏蔽大部分常用安全工具的原理,搜集了許多流行危害程序的可執行文件名加以前面提到的遞歸死循環方法達到目的,如果不計較前面提到的遞歸死循環缺點,似乎這個方法是可行的。
然而這真的可行嗎?世界上存在許多與某些系統文件同名同姓的社交型後門,如位置不同而名字相同的命令提示符輸入法控制程序“conime.exe”(被 OSO超級U盤病毒借用名字)、重要程序Rundll32.exe被某些木馬替換為自身、甚至IE瀏覽器主體iexplore.exe也存在被木馬偽造文件名的案例,如此壹來不知道多少正常的系統程序可能會被這份“免疫列表”給誤殺了,我僅僅粗略瀏覽了壹下就發現msiexec.exe居然存在“免疫列表”中,要知道這可是微軟安裝程序的主執行體啊……
爭議話題:是否禁止IFEO列表權限?
同時,網上還流傳著壹個讓初級用戶看不懂的做法,那就是關閉IFEO列表的寫入權限,具體操作如下:
執行32位註冊表編輯器regedt32.exe 定位到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 確保焦點在Image File Execution Options上,選擇“安全”—“權限” 將出現的用戶列表內所有帶有“寫入”的權限去掉,確定退出這樣壹來,任何對IFEO的寫入操作都失效了,也就起了免疫效果。這個方法對壹般用戶而言還是不錯的,除非遭遇到壹些特殊的需要往裏面寫入堆管理參數的程序,否則我建議壹般用戶還是禁止此項,從而杜絕壹切IFEO類病毒來襲。
而爭議正在於此,因為從長計議來看,用戶很可能會遇到需要往IFEO列表裏寫入數據的正常程序,徹底禁止了IFEO的寫入可能會導致不可預見的後果,既然如此,我們就采取折中的方法好了,使用HIPS(主機入侵防禦系統)的註冊表防禦體系RD(Registry Defend),為我們提供壹種兩者都能兼顧的IFEO管理方法!
以SSM為例,首先確保RD體系模塊已經開啟,然後添加新監視規則,“鍵路徑” 指向HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,“操作”為“當更改時報警”,記得“包含值”選上,最後把“子鍵深度最大值”設為“3”,點擊確定生成新的監視規則,然後在“規則”主界面裏確保“存取”、“刪除”、“寫入”的操作均為疑問狀態,這是表示在相關鍵值被進行寫入操作時彈出消息詢問用戶,最後點擊“應用設定”讓規則生效,從此只需開著SSM,映像劫持就離妳遠去了。 把以上代碼粘貼到記事本,保存為 任意文件名.bat,即可查看、禁止和解除被映像劫持不能運行的程序
:: 本工具可查看、禁止和解除被映像劫持不能運行的程序。
:: 很多木馬病毒等會用映像劫持技術來禁止安全軟件運行,當然妳也可用它來禁止木馬病毒運行。
@echo off
title 映像劫持查看、解除和禁止程序運行。
:start
cls
rd /s /q %temp%\ifeo 1>nul 2>nul
md %temp%\ifeo 1>nul 2>nul
set adir=%temp%\ifeo
set route=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
echo 正在讀取已被禁止運行的程序列表
reg query %route% 2>nul >%adir%\1.txt
for /F usebackq tokens=7 delims=\ %%i in (%adir%\1.txt) do @echo %%i >>%adir%\2.txt
findstr [.] %adir%\2.txt 2>nul > %adir%\3.txt
for /F %%i in (%adir%\3.txt) do (
reg query %route%\%%i /v Debugger 2>nul 1>nul && echo %%i >>%adir%\list.txt
)
del /q /f %adir%\?.txt
:input
cls
echo 已被禁止運行的程序列表
echo -------------------------------------------
IF EXIST %adir%\list.txt (type %adir%\list.txt) else (echo 無映像劫持項)
echo -------------------------------------------
echo.
echo 輸入 程序名稱(如 qq.exe),如果程序已禁止則會解除禁止
echo 輸入 a 則刪除全部的禁止項目
echo 輸入 d 則刪除劫持項(不推薦)
echo 輸入 b 則批量禁止(先在當前目錄建立 list.txt 文件,每行壹個名稱)
echo 輸入 x 則退出本工具
echo.
set name=
set /p name=請輸入:
if /I %name% == goto input
if /I %name% == a goto 3
if /I %name% == d goto 4
if /I %name% == b goto 5
if /I %name% == x goto end
echo 已輸入:%name% | findstr [.] || (echo 輸入錯誤 & pause >nul & goto input)
findstr %name% %adir%\list.txt 2>nul 1>nul
if not %ERRORLEVEL% == 1 goto 2
:1
reg add %route%\%name% /v Debugger /t REG_SZ /d ntsd -d # 劫持 %name% 禁止它運行 /f >nul 2>nul
echo.
echo 已禁止運行 %name%
echo.
pause
goto start
:2
reg delete %route%\%name% /f >nul 2>nul
echo.
echo 已解除禁止運行 %name%
echo.
pause
goto start
:3
for /F %%j in ('IF EXIST %adir%\list.txt type %adir%\list.txt') do (reg delete %route%\%%j /f 2>nul 1>nul)
echo.
echo 已解除所有禁止運行項
echo.
pause
goto start
:4
reg export %route% %adir%\Image File Execution Options.reg 2>nul 1>nul
copy /y %adir%\Image File Execution Options.reg Image File Execution Options.reg 2>nul 1>nul && echo. & echo 已備份到當前目錄,有問題時請恢復。
reg delete %route% /f >nul 2>nul
echo.
echo 已刪除整項
echo.
pause
goto start
:5
IF EXIST list.txt (
for /F %%j in (list.txt) do (reg add %route%\%%j /v Debugger /t REG_SZ /d ntsd -d # 劫持 %name% 禁止它運行 /f >nul 2>nul)
echo.
echo 已禁止 list.txt 文件中的所有項
) else (
echo 當前目錄無 list.txt 文件
)
echo.
pause
goto start
:end
rd /s /q %temp%\ifeo 1>nul 2>nul
二 打開註冊表編輯器,定位到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\,把“ImageFileExecutionOptions”項刪除即可。
三 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options;
確保焦點在Image File Execution Options上,選擇“安全”—“權限”; 將出現的用戶列表內所有帶有“寫入”的權限去掉,確定退出。俗話說:道高壹尺,魔高壹丈,當幾乎所有可能利用的啟動項都被安全工具翻了個遍以後,與安全對立的技術也就不得不往上提高壹個檔次,於是無論什麽歪門邪道的招數,只要能夠被利用,哪怕它原意是好的,也會被改寫定義,從這次的映像劫持事件可以看出,這個系統遠遠不如我們想像中那麽容易被掌握,尤其對普通用戶而言,這次技術的誤用簡直是他們的滅頂之災!在安全技術與反安全技術鬥爭激烈的今天,我們用戶越來越有在夾縫中生存的感覺了,當年輕松就可以得到的隨便開多少個網頁都不會帶來壹個病毒的日子早已遠去,要想在這個瘋狂的世界裏得以保全,我們只能借助於各種工具的守護,和學習更多本來可以不用接觸的安全知識,難道這真的要變成互聯網的生存法則嗎?