您的瀏覽器似乎不支援JavaScript語法,但沒關係,這裡的JavaScript語法並不會影響 到內容的陳述, 如需要選擇字級大小,IE6請利用鍵盤按住ALT鍵+ V → X → (G)最大 (L)較大(M)中(S)較小(A)小,來選擇適合您的文字大小, 而IE7或Firefox瀏覽器則可 利用鍵盤 Ctrl + (+)放大(-)縮小來改變字型大小,如需要回到上一頁可使用瀏覽器提 供的 Alt+左方向鍵(←) 快速鍵功能,列印可使用瀏覽器提供的(Ctrl+P)功能。
News Detail Banner

資安文章

程式隱匿技術的安全性探討

高榮鴻 2009/5/5 0:00:00

作者:國家資通安全會報技術服務中心 情蒐分析組 高榮鴻

程式隱匿技術(code obfuscation technique),指有意圖地隱藏程式行為的技術,無論是駭客撰寫惡意程式或一般開發者撰寫合法軟體,都可使用這種技術避免讓使用者知道其實際執行流程及背後執行的動作。常見的隱匿技術如加殼(pack)、加密(encrypt)及編碼(encode)等,都可視為用來隱藏其程式行為的方法。

程式隱匿技術的功能是讓使用者無法得知程式在執行時,電腦實際上執行哪些任務,進而讓逆向工程(reverse engineering)無法輕易完成。一般合法的目的是用來保護軟體內容、授權及智慧財產、進行數位版權管理(digital rights managementDRM),以確保軟體的商業利益或保護機密資訊。而程式隱匿技術被駭客用來撰寫惡意程式時,則可用來隱藏其惡意行為,躲避防毒軟體的偵測。

程式隱匿技術本身並無好壞之分,端看程式撰寫者的目的,卻也因此造成使用者無法分辨程式隱匿後之軟體的行為是好或壞。以政府公文為例,對卷宗加密確保了國家機密的安全,避免遭到無關或有心人士窺竊,造成國家安全的危害。但另一方面,卻也造成了檢察官在偵測貪污類似案件的困難度。

然而,無論程式隱匿技術再進步,程式指令最終仍需脫殼(unpack)、解密(decrypt)或解碼(decode)以載入記憶體並交由CPU執行,這也讓程式隱匿技術對於逆向工程而言並非是不可能的任務。而逆向工程可以讓我們瞭解程式實際的執行流程及動作,讓我們決定要不要使用該程式,或甚至修改程式。

因此程式隱匿技術與逆向工程之間的競爭將造成軟體不斷更新。反逆向工程與逆向工程之間的競爭促成不管是惡意程式或是合法軟體被設計成可以不斷更新。例如DRM系統在被逆向工程破解後,之後必須重新設計及更新,接著又將面對逆向工程的挑戰。而惡意程式,例如僵屍網路,為了避免被研究人員找出其特徵、偵測之並清除,會透過C&C Server更新其程式,但同時研究人員也不斷地對它進行逆向工程分析。若以戰爭來形容這種情形,可稱之為消耗戰。逆向工程人員及程式撰寫者都試圖擊敗對方,但往往也跟著被拖垮,造成「殺敵一萬,自損三千」的情形。

最常被使用的程式隱匿技術是透過修改自身程式碼(self modifying code),讓程式碼在儲存為二進制執行檔時與其實際在記憶體中的儲存映像不同。這讓依據病毒特徵碼進行掃描的防毒軟體無法辨別經過程式隱匿的檔案是否為惡意程式。

進行逆向工程任務時,大部分分析人員會先透過靜態分析(static analysis)觀察程式碼,進行脫殼、解密或解碼。接著才會透過偵錯器(debugger)實際執行該程式,並檢查其記憶體使用情形,稱為動態分析(dynamic analysis)或執行期分析(run-time analysis)。

然而,反偵錯器技術(anti-debugging technique)卻也應運而生。經過隱匿的程式可以偵測其執行環境是不是在偵錯器中,進而改變其行為或不進行任何動作,以躲避分析人員的檢查。

程式隱匿技術和逆向工程彼此對立,程式撰寫者試圖隱藏其程式行為,分析人員則試圖瞭解程式做了哪些動作,而實際上,逆向工程占據了優勢。一支程式在撰寫完成後,其資料隱匿模式已經固定,而分析師要瞭解其行為只是差在耗費時間的多寡而已。

總結以上論點,程式隱匿技術現今廣泛被使用在軟體的撰寫中,尤其是惡意程式為了避免被偵測及清除,通常會對其程式進行隱藏。因此對於資安研究人員在檢測程式是否存在惡意行為時,有一種快速且較為容易的方式即是先判斷它是否試圖隱藏其行為。包括靜態分析隱匿特徵、偵測自身修改程式碼、rookit行為或反偵錯器程式碼,以加快檢測的處理時間。

Chris WysopalVeracode公司的共同創辦人及技術長,Veracode為一家依照客戶需求提供軟體安全性測試服務的公司。Chris同時也是密碼破解工具L0phtCrack的共同開發人及The Art of Software Security Testing: Identifying Security Flaws一書的作者。

文章出處SecurityFocus, Good Obfuscation, Bad Code (http://www.securityfocus.com/columnists/498/1), 2009-04-17.

備註說明