映像劫持簡介
“映像劫持”,也被稱為“IFEO”(Image File Execution Options,其實應該稱為“Image Hijack”,後面章節會詳細提到,至少也應該稱為IFEO Hijack而不是只有“IFEO”自身!),它的存在自然有它的理由,在WindowsNT架構的系統里,IFEO的本意是為一些在默認系統環境中運行時可能引發錯誤的程式執行體提供特殊的環境設定,系統廠商之所以會這么做,是有一定歷史原因的,在Windows NT時代,系統使用一種早期的堆(Heap,由應用程式管理的記憶體區域)管理機制,使得一些程式的運行機制與現在的不同,而後隨著系統更新換代,廠商修改了系統的堆管理機制,通過引入動態記憶體分配方案,讓程式對記憶體的占用更為減少,在安全上也保護程式不容易被溢出,但是這些改動卻導致了一些程式從此再也無法運作,為了兼顧這些出問題的程式,微軟以“從長計議”的態度專門設計了“IFEO”技術,它的原意根本不是“劫持”,而是“映像檔案執行參數”!
“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”內,使用與可執行程式檔案名稱匹配的項目作為程式載入時的控制依據,最終得以設定一個程式的堆管理機制和一些輔助機制等,大概微軟考慮到加入路徑控制會造成判斷麻煩與操作不靈活的後果,也容易導致註冊表冗餘,於是IFEO使用忽略路徑的方式來匹配它所要控制的程式檔案名稱,例如IFEO指定了對一個名為“小金.EXE”的可執行程式檔案進行控制,那么無論它在哪個目錄下,只要它名字還叫“小金.EXE”,它就只能在IFEO的五指山里打滾了。
實例操作
具體步驟說了半天都只是純粹的概念,那么IFEO到底是怎么樣發揮作用的呢?例如有一個程式檔案名稱為“xiaojin.exe”,由於使用了舊的堆管理機制,它在新系統里無法正常運行甚至出現非法操作,為了讓系統為其提供舊的堆管理機制,我們需要IFEO來介入,則需執行以下步驟:
1. 確保在管理員狀態下執行regedit.exe,定位到以下註冊表項:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
2. 在“Image File Execution Options”下建立一個子鍵,名為“xiaojin.exe”,不區分大小寫。現在確保位於HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\xiaojin.exe\下,建立一個字元串類型的註冊表項,名為“DisableHeapLookAside”,值為“1”
3. 再次運行xiaojin.exe查看運行情況,如果真的是由於堆管理機制引發的問題,則程式得以正常運行,否則該程式問題不屬於IFEO能夠干涉的範圍,或者需要嘗試搭配其他的參數使用。
ApplicationGoo
Debugger
PageHeapFlags
DisableHeapLookAside
DebugProcessHeapOnly
PageHeapSizeRangeStart
PageHeapSizeRangeEnd
PageHeapRandomProbability
PageHeapDllRangeStart
PageHeapDllRangeEnd
GlobalFlag
BreakOnDllLoad
ShutdownFlags
詳細介紹‍
說白了,IFEO本質是系統廠商為某些可能以早期設計模式運行的軟體提供一種保全措施而設計出來的產物,並對其加以擴充形成了一套可用於調試程式的簡易方案,如“BreakOnDllLoad”參數可設定在載入某個DLL時設定斷點,便於程式設計師調試ISAPI接口;帶有“Range”字樣的幾個參數則用於限制堆的大小等。
而裡面有一個導致了今天這種局面的參數:Debugger。或許微軟當初的用意是便於程式設計師能夠通過雙擊某個設定了IFEO控制列表的執行體檔案來直接調用調試器對其進行調試,而不用再通過繁瑣的打開調試器再進行檔案載入來實現調試,提高了工作效率。
為了使得IFEO能夠影響到任何一個程式啟動請求,NT架構中將IFEO的優先權設定得很高,基本上,當用戶要求執行某個程式時,系統首先判斷該程式檔案是否可執行體,然後就到IFEO的入口項進行檔案名稱配對了,直到通過IFEO這一步後,進程才真正開始申請記憶體創建起來。
如果系統在IFEO程式列表里匹配了當前運行的檔案名稱,它就會讀取檔案名稱下的參數,這些參數在未被人為設定之前均有個默認值,而且它們也具備優先權,“Debugger”的優先權是最高的,所以它是第一個被讀取的參數,如果該參數未被設定,則默認不作處理,如果設定了這個參數,就有可能發生“映像劫持”。
記住,惹禍的參數只有一個,那就是“Debugger”,將IFEO視為映像劫持,大概是因為國內一些人直接套用了“Image File Execution Options”的縮寫罷,在相對規範的來自Sysinternals的專業術語裡,利用這個技術的設計漏洞進行非法活動的行為應該被稱為“Image Hijack”,這才是真正字面上的“映像劫持”。
Debugger參數,直接翻譯為“調試器”,它是IFEO里第一個被處理的參數,其作用是屬於比較匪夷所思的,系統如果發現某個程式檔案在IFEO列表中,它就會首先來讀取Debugger參數,如果該參數不為空,系統則會把Debugger參數裡指定的程式檔案名稱作為用戶試圖啟動的程式執行請求來處理,而僅僅把用戶試圖啟動的程式作為Debugger參數裡指定的程式檔案名稱的參數傳送過去,
在系統執行的邏輯里,這就意味著,當一個設定了IFEO項Debugger參數指定為“notepad.exe”的“iexplore.exe”被用戶以命令行參數“-nohome ”請求執行時,系統實際上到了IFEO那裡就跑去執行notepad.exe了,而原來收到的執行請求的檔案名稱和參數則被轉化為整個命令行參數“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome”來提交給notepad.exe執行,所以最終執行的是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome ”,即用戶原來要執行的程式檔案名稱iexplore.exe被替換為notepad.exe,而原來的整串命令行加上iexplore.exe自身,都被作為新的命令行參數傳送到notepad.exe去執行了,所以用戶最終看到的是記事本的界面,並可能出現兩種情況,一是記事本把整個iexplore.exe都作為文本讀了出來,二是記事本彈出錯誤信息報告“檔案名稱不正確”,這取決於iexplore.exe原來是作為光桿司令狀態請求執行(無附帶運行命令行參數)的還是帶命令行參數執行的。
由於Debugger參數的這種特殊作用,它又被稱為“重定向”(Redirection),而利用它進行的攻擊,又被稱為“重定向劫持”(Redirection Hijack),它和“映像劫持”(Image Hijack,或IFEO Hijack)只是稱呼不同,實際上都是一樣的技術手段。
講解完Debugger參數的作用,現在我們來看看“映像劫持”到底是怎么一回事,遭遇流行“映像劫持”病毒的系統表現為常見的防毒軟體、防火牆、安全檢測工具等均提示“找不到檔案”或執行了沒有反應,於是大部分用戶只能去重灌系統了,但是有經驗或者歪打正著的用戶將這個程式改了個名字,就發現它又能正常運行了,這是為什麼?答案就是IFEO被人為設定了針對這些流行工具的執行檔名的列表了,而且Debugger參數指向不存在的檔案甚至病毒本身!
以超級巡警的主要執行檔案AST.exe為例,首先,有個檔案名稱為kkk.exe的惡意程式向IFEO列表里寫入AST.exe項,並設定其Debugger指向kkk.exe,於是系統就會認為kkk.exe是AST.exe的調試器,這樣每次用戶點擊執行AST.exe時,系統執行的實際上是作為調試器身份的kkk.exe,至於本該被執行的AST.exe,此刻只能被當作kkk.exe的執行參數來傳遞而已,而由於kkk.exe不是調試器性質的程式,甚至惡意程式作者都沒有編寫執行參數的處理代碼,所以被啟動的永遠只有kkk.exe自己一個,用戶每次點擊那些“打不開”的安全工具,實際上就等於又執行了一次惡意程式本體!這個招數被廣大使用“映像劫持”技術的惡意軟體所青睞,隨著OSO這款超級隨身碟病毒與AV終結者(隨機數病毒、8位字母病毒)這兩個滅殺了大部分流行安全工具和防毒軟體的惡意程式肆虐網路以後,一時之間全國上下人心惶惶,其實它們最大改進的技術核心就是利用IFEO把自己設定為各種流行安全工具的調試器罷了,破解之道尤其簡單,只需要將安全工具的執行檔案隨便改個名字,而這個安全工具又不在乎互斥量的存在,那么它就能正常運行了,除非你運氣太好又改到另一個也處於黑名單內的檔案名稱去了,例如把AST.exe改為Icesword.exe。
那些雙擊時明明程式檔案就在眼前,系統卻報錯說“找不到檔案”也只是IFEO的另一種套用罷了,其秘訣是將Debugger參數指向一個不存在的檔案位置,這樣系統就會因為找不到這個調試器而無法順利執行下去,如果系統老老實實報出“找不到調試器”的錯誤提示那倒還好了,但就不知道微軟是出於對IFEO這個東西存在的事實掩蓋還是什麼苦衷,卻死活不肯承認是Debugger指向的調試器不存在導致的錯誤,而是把已經被“變異”成為命令行參數無法進入系統創建進程機制的原執行請求作為“找不到的檔案”給報了回去,於是未曾了解過IFEO的用戶只能莫名其妙的看著眼前就存在而系統“不承認”的安全工具發愣了。
判斷你的機器是否被劫持
最簡單的方法是逐個運行你常用的安全工具,檢查是否出現“無法找到檔案”或者乾脆直接沒了反應的,當然,執行結果和預期差別太大的也要被懷疑為劫持,例如你執行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即可,由於沒有了映像檔案存在,它們意欲重新建立木馬帝國的賊心也就無法實現了。