吳 極,王 逍,肖植燦
(云南大學(xué) 軟件學(xué)院,云南 昆明 650504)
隨著計(jì)算機(jī)技術(shù)的廣泛應(yīng)用,軟件產(chǎn)業(yè)在人類日常生活、工業(yè)生產(chǎn)、科學(xué)研究等領(lǐng)域正在發(fā)揮著越發(fā)重要的作用。但是,在經(jīng)濟(jì)利益或純粹愛好的驅(qū)使下,非法用戶在未經(jīng)許可的情況下對(duì)軟件的非法復(fù)制和使用無疑破壞了軟件開發(fā)人員的利益。這種行為同時(shí)也會(huì)對(duì)全球軟件產(chǎn)業(yè)的健康發(fā)展造成不利影響。單純依靠法律和道德約束來保護(hù)軟件是不夠的,因此,軟件保護(hù)技術(shù)的開發(fā)是非常必要的,它可以保護(hù)軟件在技術(shù)層面上的安全。
可以應(yīng)用于軟件程序以保護(hù)它們免受惡意逆向工程的工作機(jī)制被稱為軟件保護(hù)[1-2]。目前關(guān)于反逆向工程的研究通常側(cè)重于混淆、虛擬機(jī)檢測(cè)、反拆卸和防篡改[3]。但毫無疑問,隨著軟件產(chǎn)業(yè)的快速發(fā)展,以反調(diào)試技術(shù)為中心的軟件保護(hù)已經(jīng)成為一個(gè)需要受到重視的問題[4]。
本文將對(duì)現(xiàn)有的反調(diào)試技術(shù)進(jìn)行分類闡述,并在現(xiàn)有反調(diào)試技術(shù)的基礎(chǔ)上,對(duì)國(guó)內(nèi)外反調(diào)試技術(shù)和相關(guān)軟件保護(hù)技術(shù)的研究進(jìn)行深入分析,總結(jié)、歸納出應(yīng)用于軟件保護(hù)的反調(diào)試技術(shù)的研究現(xiàn)狀和發(fā)展趨勢(shì)。
反調(diào)試是“在計(jì)算機(jī)代碼中實(shí)現(xiàn)一種或多種技術(shù),它阻礙了對(duì)目標(biāo)進(jìn)程進(jìn)行逆向工程或調(diào)試的嘗試”[5]。反調(diào)試技術(shù)是反逆向工程中一種常見的反檢測(cè)技術(shù)。
軟件在運(yùn)行時(shí)如果通過反調(diào)試技術(shù)檢測(cè)到自身處于被調(diào)試狀態(tài),就會(huì)觸發(fā)預(yù)先設(shè)定好的反調(diào)試策略,來響應(yīng)并處理調(diào)試行為,若自身未被調(diào)試,則軟件程序繼續(xù)正常運(yùn)行。
文獻(xiàn)[6]從逆向分析人員的立場(chǎng)出發(fā),根據(jù)調(diào)試技術(shù)的破解方法將反調(diào)試技術(shù)分為靜態(tài)反調(diào)試和動(dòng)態(tài)反調(diào)試。靜態(tài)反調(diào)試是指在程序啟動(dòng)時(shí),系統(tǒng)會(huì)根據(jù)正常運(yùn)行和調(diào)試運(yùn)行分配不同的進(jìn)程環(huán)境,通過檢測(cè)進(jìn)程環(huán)境來檢測(cè)進(jìn)程是否處于調(diào)試狀態(tài)。許多靜態(tài)反調(diào)試技術(shù)對(duì)OS系統(tǒng)有較強(qiáng)的依賴性,這意味著有些靜態(tài)反調(diào)試技術(shù)在不同的平臺(tái)上可能會(huì)失效。動(dòng)態(tài)反調(diào)試是指在程序運(yùn)行時(shí),分析正在運(yùn)行的進(jìn)程的執(zhí)行流程和執(zhí)行狀態(tài)是否正常來檢測(cè)進(jìn)程是否處于調(diào)試狀態(tài)。例如,遇到異常時(shí),調(diào)試器會(huì)先接收異常事件而不是直接傳遞給進(jìn)程本身,所以可以利用異常處理機(jī)制來實(shí)現(xiàn)反調(diào)試[7]。反調(diào)試檢測(cè)流程如圖1所示。
圖1 反調(diào)試檢測(cè)流程圖
基于運(yùn)行環(huán)境檢測(cè)的靜態(tài)反調(diào)試技術(shù)是對(duì)整個(gè)程序的保護(hù),反調(diào)試手段相對(duì)“死板”,破解方式也比較簡(jiǎn)單。其實(shí)程序開發(fā)者只是想對(duì)程序的關(guān)鍵算法和核心數(shù)據(jù)進(jìn)行保護(hù)、避免逆向分析。動(dòng)態(tài)反調(diào)試則是基于執(zhí)行狀態(tài)來判斷調(diào)試器行為,使其無法正常跟蹤程序的執(zhí)行流程或加大其逆向分析難度。相比靜態(tài)反調(diào)試,動(dòng)態(tài)反調(diào)試隱蔽性較強(qiáng),技術(shù)難度更高,破解難度也更大。
此類別下的反調(diào)試方式通過直接觀察調(diào)試器及其相關(guān)信息來檢測(cè)調(diào)試器的存在。該類別存在的原因是調(diào)試器最初設(shè)計(jì)用于調(diào)試合法軟件。因此,并沒有被提供能使調(diào)試器隱身的對(duì)策。此外,通過調(diào)試工具分析程序時(shí),工具會(huì)在系統(tǒng)的不同級(jí)別留下大量痕跡[8-12],這些系統(tǒng)痕跡可以被用于檢查系統(tǒng)是否存在調(diào)試器工作。此類別可以基于讀取PEB過程環(huán)境塊、斷點(diǎn)、NtQuerySystemInformation()函數(shù)、查找系統(tǒng)痕跡、父進(jìn)程檢查等方式實(shí)現(xiàn)。
2.1.1 PEB環(huán)境塊字段
進(jìn)程環(huán)境塊(PEB)是系統(tǒng)中每個(gè)進(jìn)程存在的數(shù)據(jù)結(jié)構(gòu),包含有關(guān)該進(jìn)程的數(shù)據(jù)[12]。PEB的不同部分包含可由被直接探測(cè)以檢測(cè)調(diào)試器是否存在的信息??偟膩碚f,依靠PEB的反調(diào)試策略構(gòu)成了大部分被觀察到的反調(diào)試技術(shù)[13]。
對(duì)于讀取PEB過程環(huán)境塊,可以通過讀取此字段的特定API,即IsDebuggerPresent(),CheckRemoteDebuggerPresent()或通過檢測(cè)PEB其他稍微復(fù)雜的內(nèi)容NtGlobalFLags和ProcessHeap等方式來實(shí)現(xiàn)反調(diào)試?;贜tGlobalFlags實(shí)現(xiàn)反調(diào)試如圖2所示。LIMC等人在文獻(xiàn)[14]中提出了一種基于動(dòng)態(tài)二進(jìn)制分析的惡意軟件檢測(cè)方法,該方法采取對(duì)應(yīng)策略來破解惡意軟件的軟件保護(hù)。該方法分析了惡意軟件基于PEB環(huán)境塊實(shí)現(xiàn)反調(diào)試的過程以及對(duì)應(yīng)的破解方法,也說明了單一反調(diào)試技術(shù)在軟件保護(hù)方面存在的局限性。
圖2 基于NtGlobalFLags實(shí)現(xiàn)反調(diào)試
2.1.2 斷點(diǎn)檢測(cè)
斷點(diǎn)是任何調(diào)試過程的重要部分,因此檢測(cè)斷點(diǎn)可以實(shí)現(xiàn)檢測(cè)并中斷調(diào)試器?;跀帱c(diǎn)檢測(cè)的反調(diào)試策略是最強(qiáng)大且難以繞過的策略之一。斷點(diǎn)檢測(cè)存在軟件斷點(diǎn)和硬件斷點(diǎn)兩種類型[4,9]。軟件斷點(diǎn)由調(diào)試器通過在代碼中寫入特殊操作碼0xCC(int 3h指令)來設(shè)置斷點(diǎn)。執(zhí)行此指令時(shí),將引發(fā)斷點(diǎn)異常并通過Windows傳遞給調(diào)試器。對(duì)于硬件斷點(diǎn),該類型使用特定的調(diào)試寄存器設(shè)置硬件斷點(diǎn):DR0-DR7。使用它們,開發(fā)人員可以中斷程序的執(zhí)行并將控制權(quán)轉(zhuǎn)移到調(diào)試器。
對(duì)于斷點(diǎn)檢測(cè),可以通過自掃描、完整性檢驗(yàn)、查找0xCC和使用函數(shù)GetThreadContext()檢查CPU寄存器等方式實(shí)現(xiàn)反調(diào)試。TORRUBIA A等人在文獻(xiàn)[15]中提出了一種通過編寫主動(dòng)使用所有可用于中斷的代碼(特別是硬件斷點(diǎn)和軟件斷點(diǎn)中斷)來實(shí)現(xiàn)反調(diào)試的方法。如圖3所示。
圖3 基于硬件斷點(diǎn)實(shí)現(xiàn)反調(diào)試
2.1.3 父進(jìn)程檢查
通常,應(yīng)用程序通過雙擊圖標(biāo)或通過命令行執(zhí)行時(shí),其父進(jìn)程名稱和對(duì)應(yīng)ID可相應(yīng)地檢索。如果檢查的父進(jìn)程名稱屬于調(diào)試器或父進(jìn)程名稱不為explorer.exe,那么它將是調(diào)試器存在的明顯標(biāo)志[16]。同時(shí),父進(jìn)程ID與explorer.exe的進(jìn)程ID如果不匹配,它也可能說明調(diào)試器存在。但可能存在多個(gè)explorer.exe和對(duì)應(yīng)的PID導(dǎo)致匹配過程復(fù)雜化,所以基于父進(jìn)程檢查的反調(diào)試方式很少被使用[17]。
對(duì)于父進(jìn)程檢查,可以通過GetCurrentProcessId()、 CreateToolhelp32Snapshot(). (Process32First())、 Process32Next()等函數(shù)進(jìn)行父進(jìn)程名稱和ID的匹配以實(shí)現(xiàn)反調(diào)試?;贕etCurrentProcessId實(shí)現(xiàn)反調(diào)試如圖4所示。高兵等人在文獻(xiàn)[18]中提出了一種基于代碼自修改的軟件反跟蹤方法來實(shí)現(xiàn)軟件保護(hù),該方法使用了基于父進(jìn)程檢測(cè)的反調(diào)試方法來實(shí)現(xiàn)反加載模塊。
圖4 基于GetCurrentProcessId實(shí)現(xiàn)反調(diào)試
2.1.4 系統(tǒng)痕跡查找
從安裝到配置和執(zhí)行,調(diào)試器會(huì)在OS的不同級(jí)別留下痕跡,例如在文件系統(tǒng)、注冊(cè)表、進(jìn)程名稱等中留下系統(tǒng)痕跡。因此,可以通過跟蹤查找這些系統(tǒng)痕跡實(shí)現(xiàn)反調(diào)試[8-9]。
可以通過FindWindow()、FindProcess()、FindFirstFile()等API來檢測(cè)調(diào)試器痕跡從而判斷是否存在調(diào)試器。SHIELDS T在文獻(xiàn)[19]中對(duì)FindWindow()這一最常見的應(yīng)用于反調(diào)試的查找系統(tǒng)痕跡的API進(jìn)行了詳細(xì)介紹,并給出了實(shí)現(xiàn)過程,如圖5所示。
2.1.5 其他檢測(cè)方法
除了上述的主動(dòng)檢測(cè)方式,還有許多反調(diào)試方法基于使用系統(tǒng)信息直接檢測(cè)是否存在調(diào)試器,這也是最直接的檢測(cè)調(diào)試器的存在或操作的方法。
這些基于系統(tǒng)信息的檢測(cè)機(jī)制不直接訪問內(nèi)存區(qū)域或內(nèi)存的索引部分,而是依賴于已記錄和未記錄的Microsoft API函數(shù)調(diào)用的功能,這些函數(shù)可以在各種.DLL和.SYS文件中導(dǎo)出[17]。大多數(shù)情況下,所提出的基于API的檢測(cè)機(jī)制將依賴于底層操作系統(tǒng)調(diào)用來直接訪問存儲(chǔ)器。
對(duì)于可用于調(diào)試器檢測(cè)的系統(tǒng)信息,可以通過.NtQueryInformationProcess()、NtQuerySystemInformation()、NtQueryObject()、ZwSetInformationThread()、DebugActiveProcessStop()等API函數(shù)來獲取并用來實(shí)現(xiàn)反調(diào)試?;贜tQuryInformationProcess 實(shí)現(xiàn)反調(diào)試如圖6所示。CHEN P等人在文獻(xiàn)[16]對(duì)這些可以訪問系統(tǒng)信息以檢測(cè)調(diào)試器存在的函數(shù)進(jìn)行了列舉,對(duì)函數(shù)功能和實(shí)現(xiàn)反調(diào)試的方式進(jìn)行了說明。
圖6 基于NtQueryInformationProcess實(shí)現(xiàn)反調(diào)試
此類別下的反調(diào)試方式不是直接觀察調(diào)試器及其相關(guān)信息,而是通過利用系統(tǒng)邏輯的相關(guān)信息來計(jì)算并評(píng)估推斷調(diào)試器存在的概率。此類別可以基于異常機(jī)制、時(shí)間差異檢測(cè)等方式實(shí)現(xiàn)。
2.2.1 異常機(jī)制
基于異常機(jī)制的反調(diào)試的原理是調(diào)試器捕獲某些異常后,可以不將異常正確地傳遞給內(nèi)部運(yùn)行的進(jìn)程,從而可以在進(jìn)程內(nèi)部的進(jìn)程異常處理機(jī)制中檢測(cè)到該異常,并對(duì)其進(jìn)行操作。
可以利用Windows在存在調(diào)試器的情況下使用異常處理機(jī)制(Structured Exception Handling,SEH)處理異常的特點(diǎn)來實(shí)現(xiàn)反調(diào)試。作為異常處理的內(nèi)部機(jī)制,SEH主要在系統(tǒng)級(jí)工作。因此,掌握SEH工作原理是基于SEH的軟件反調(diào)試技術(shù)研究的關(guān)鍵問題[20]。
對(duì)于異常處理,可以通過int 2d、int 3引發(fā)中斷異常,通過陷阱標(biāo)志位或者ICEBP引發(fā)單步異常,通過RaiseException函數(shù)產(chǎn)生若干不同類型的異常等方式實(shí)現(xiàn)反調(diào)試?;趇nt 2d實(shí)現(xiàn)反調(diào)試如圖7所示。BING C等人在文獻(xiàn)[21]中提出了一種基于SEH處理機(jī)制的將單步異常和代碼提取相結(jié)合的反調(diào)試方法。該方法在存在調(diào)試器的情況下,會(huì)使得代碼中的異常將被調(diào)試器接管,則異常處理程序無法觸發(fā)相應(yīng)的跳轉(zhuǎn)執(zhí)行被提取的正常代碼的過程,從而使程序無法正常運(yùn)行以實(shí)現(xiàn)反調(diào)試。
圖7 基于int 2d實(shí)現(xiàn)反調(diào)試
2.2.2 時(shí)間差異
基于時(shí)間差異的反調(diào)試是通過計(jì)算程序運(yùn)行的時(shí)間差異來判斷進(jìn)程是否處于被調(diào)試狀態(tài)。在調(diào)試狀態(tài)下逐行跟蹤代碼比程序正常運(yùn)行耗費(fèi)的時(shí)間要長(zhǎng)很多,因此,如果程序運(yùn)行時(shí)間超過預(yù)先設(shè)定程序正常運(yùn)行的閾值,就可以推斷存在調(diào)試器?;跁r(shí)間差異的反調(diào)試測(cè)試可以分為基于本地API和外部網(wǎng)絡(luò)資源兩種類型。但無論是利用本地時(shí)間還是外部資源,對(duì)抗基于時(shí)間差異的反調(diào)試仍然是一個(gè)懸而未決的問題[22]。
對(duì)于時(shí)間差異,可以在本地通過利用本地API(GetTickCount(),QueryPerformanceCounter()等)或者利用CPU rdtsc(讀取時(shí)間戳計(jì)數(shù)器) 或者可以通過網(wǎng)絡(luò)查詢區(qū)別于本地的外部資源來進(jìn)行定時(shí)來實(shí)現(xiàn)反調(diào)試?;趓dtsc 實(shí)現(xiàn)反調(diào)試如圖8所示。KANZAKI Y等人在文獻(xiàn)[23]提出了一種通過將時(shí)間差異檢測(cè)的反調(diào)試方法和自修改代碼相結(jié)合來實(shí)現(xiàn)軟件保護(hù)的方法。該方法進(jìn)一步增加了軟件破解的難度和成本。自修改代碼是一種在正在運(yùn)行的程序中修改或生成代碼的機(jī)制[24],其廣泛用于運(yùn)行時(shí)的代碼生成、優(yōu)化技術(shù)和即時(shí)編譯器等。
圖8 基于rdtsc實(shí)現(xiàn)反調(diào)試
此類別下的反調(diào)試方式是因?yàn)橛幸恍┘夹g(shù)可以被用于干擾調(diào)試器的正常運(yùn)行,這些技術(shù)當(dāng)且僅當(dāng)程序處于調(diào)試器控制時(shí)才會(huì)試圖擾亂程序的運(yùn)行。此類別可以通過流控制機(jī)制、鎖定策略、調(diào)試器漏洞等方式實(shí)現(xiàn)。
2.3.1 流控制
基于Windows系統(tǒng)的隱式流控制機(jī)制可用于實(shí)現(xiàn)反調(diào)試。此方式包括回調(diào)、直接隱藏、單線程操作、多線程操作和自調(diào)試等子類別。
回調(diào)操作常被隱式控制流用來實(shí)現(xiàn)反調(diào)試。當(dāng)調(diào)試器執(zhí)行一個(gè)回調(diào)操作時(shí),執(zhí)行流將被轉(zhuǎn)移到指定為其參數(shù)的函數(shù)[25]。它可以使用回調(diào)、枚舉函數(shù)、線程本地存儲(chǔ)(Thread Local Storage,TLS)等方式來實(shí)現(xiàn)“逃避調(diào)試器”的目標(biāo)。
單線程操作可以通過隱藏線程或暫停線程使調(diào)試器無法繼續(xù)調(diào)試,其中暫停線程只對(duì)用戶模式的調(diào)試器生效。單線程操作可以通過使用ETHREAD內(nèi)核結(jié)構(gòu)的NtSetInformationThread()函數(shù)設(shè)置字段ThreadHideFromDebugger()來實(shí)現(xiàn)隱藏線程,通過使用來自ntdll的SuspendThread()或NtSuspendThread()來實(shí)現(xiàn)暫停線程[8]?;赥hreadHideFromDebugger實(shí)現(xiàn)反調(diào)試如圖9所示。
圖9 基于ThreadHideFromDebugger實(shí)現(xiàn)反調(diào)試
多線程操作通過啟動(dòng)在調(diào)試器外部運(yùn)行的不同線程使得核心線程繞過調(diào)試器并繼續(xù)運(yùn)行來實(shí)現(xiàn)反調(diào)試。多線程操作可以通過CreateThread()來實(shí)現(xiàn)反調(diào)試。
自我調(diào)試可以防止調(diào)試器成功附加到軟件中[26]。默認(rèn)情況下,每個(gè)進(jìn)程只能連接到一個(gè)調(diào)試器。軟件利用這通過運(yùn)行自身的副本并作為調(diào)試器附加到軟件本身來阻止另一個(gè)調(diào)試器附加到軟件中。它可以通過DbgUiDebugActiveProcess()或NtDebugActiveProcess()來實(shí)現(xiàn)。ABRATH B等人在文獻(xiàn)[27]中提出了一種基于自調(diào)試的反調(diào)試方法,該方法通過將完整的代碼片段從應(yīng)用程序遷移到調(diào)試器,讓代碼處于自調(diào)試狀態(tài)從而實(shí)現(xiàn)反調(diào)試保護(hù)。而完整的代碼片遷移使調(diào)試器和主應(yīng)用程序之間的耦合過程更加緊密,使該反調(diào)試過程更加難以破解。
2.3.2 鎖定策略
在鎖定策略中,軟件調(diào)用系統(tǒng)API來鎖定調(diào)試者的鼠標(biāo)、鍵盤或屏幕。一旦鎖定成功后,鎖定效果將一直持續(xù)到軟件進(jìn)程退出。
基于鎖定策略的反調(diào)試可以選擇通過BlockInput()來阻止鼠標(biāo)和鍵盤輸入直到調(diào)試退出、通過SwitchDesktop()選擇讓調(diào)試工具運(yùn)行在不同的活動(dòng)桌面來實(shí)現(xiàn)反調(diào)試[13],如圖10所示。CAIVANO D等人在文獻(xiàn)[28]中對(duì)勒索軟件進(jìn)行了具體分析,部分勒索軟件使用SwitchDesktop()來鎖定桌面,在實(shí)現(xiàn)勒索目的同時(shí)防止其自身被調(diào)試。
圖10 基于BlockInput實(shí)現(xiàn)反調(diào)試
2.3.3 調(diào)試器漏洞
和所有的軟件一樣,調(diào)試器也存在軟件漏洞,這些漏洞是特定調(diào)試器獨(dú)有的,難發(fā)現(xiàn)而易攻擊??梢酝ㄟ^攻擊調(diào)試器的軟件漏洞實(shí)現(xiàn)反調(diào)試,但找到調(diào)試器漏洞是實(shí)現(xiàn)這一反調(diào)試方式的難點(diǎn)。
OllyDbg1.1存在格式化字符串漏洞,可以使用OutputDebugString()提供一個(gè)%S字符串的參數(shù),讓OllyDbg崩潰[29]。同時(shí),也可以通過OutputDebugString()的返回值來檢測(cè)調(diào)試器是否存在。SoftICE中可以通過其發(fā)生int 1中斷時(shí)會(huì)產(chǎn)生一個(gè)特定異常信息EXCEPTION_SINGLE_STEP (0x80000004)的特點(diǎn)實(shí)現(xiàn)反調(diào)試[30],如圖11所示BRANCO RR等人在文獻(xiàn)[31]中對(duì)惡意軟件使用的防止逆向分析的技術(shù)進(jìn)行了總結(jié),其中對(duì)基于調(diào)試器漏洞的反調(diào)試技術(shù)做出了具體的分析。
圖11 基于OutputDebugString實(shí)現(xiàn)反調(diào)試
2.3.4 反調(diào)試技術(shù)分類總結(jié)
總結(jié)歸納本文提到的反調(diào)試技術(shù)分類,所用反調(diào)試技術(shù)的策略,反調(diào)試技術(shù)的具體實(shí)現(xiàn)方法,反調(diào)試技術(shù)的實(shí)施難度,對(duì)抗反調(diào)試技術(shù)的難度和反調(diào)試技術(shù)的普遍性,如表1所示(見下頁)。
對(duì)于已有的反調(diào)試技術(shù),針對(duì)不同的反調(diào)試技術(shù)有不同的對(duì)抗方法,且存在相關(guān)研究提出實(shí)現(xiàn)反調(diào)試破解技術(shù)的方法。文獻(xiàn)[32]從調(diào)試器輔助技術(shù)和代碼檢查及修補(bǔ)兩個(gè)方面陳述了對(duì)抗部分反調(diào)試技術(shù)的相關(guān)策略。文獻(xiàn)[33]提出了一個(gè)基于規(guī)則的反反調(diào)試系統(tǒng),該系統(tǒng)分析和跟蹤通用寄存器的值,以確定是否存在反調(diào)試指令,并根據(jù)分析內(nèi)容總結(jié)出反抗調(diào)試規(guī)則集,可以避免二進(jìn)制文件中的反調(diào)試技術(shù)。文獻(xiàn)[34]提出了一個(gè)針對(duì)環(huán)境進(jìn)行分析的反調(diào)試程序自動(dòng)檢測(cè)方法,該方法使用調(diào)試器和模擬器,通過使用模擬器提取應(yīng)用程序接口(API)上的跟蹤信息以及執(zhí)行指令,檢查并比較提取的指令來自動(dòng)檢測(cè)可疑的反調(diào)試程序,且該方式不依賴于某種反調(diào)試方法,能對(duì)大多數(shù)常用反調(diào)試技術(shù)能進(jìn)行有效檢測(cè)。文獻(xiàn)[35]提出了一個(gè)基于系統(tǒng)管理模式(System Management Mode,SMM)的調(diào)試框架,該調(diào)試框架相對(duì)現(xiàn)有的調(diào)試器更加“透明化”,可以實(shí)現(xiàn)不被反調(diào)試技術(shù)發(fā)現(xiàn)的調(diào)試功能。文獻(xiàn)[36]提出了一種對(duì)混淆的反調(diào)試技術(shù)進(jìn)行自動(dòng)靜態(tài)檢測(cè)的檢測(cè)引擎。
面對(duì)越來越多的檢測(cè)和破解反調(diào)試技術(shù)的方法,單純的反調(diào)試技術(shù)很難保障軟件的安全性。近年來提出了將反調(diào)試和其他主流軟件保護(hù)技術(shù)結(jié)合以實(shí)現(xiàn)綜合型軟件保護(hù)方案。
文獻(xiàn)[37]將反調(diào)試技術(shù)與代碼混淆、迷宮加密等技術(shù)融合,實(shí)現(xiàn)了一種防反轉(zhuǎn),防篡改和防破解效果好的迷宮型軟件保護(hù)系統(tǒng)。文獻(xiàn)[38]中描述的用于軟件保護(hù)參考架構(gòu)將反調(diào)試、數(shù)據(jù)混淆、白盒加密、代碼隱藏、代碼混淆和其他軟件相關(guān)技術(shù)組合,共同實(shí)現(xiàn)對(duì)軟件應(yīng)用程序的保護(hù)。文獻(xiàn)[39]提出了一種將反調(diào)試和反跟蹤、基于安全令牌的加密技術(shù)、PE文件調(diào)用過程保護(hù)結(jié)合的打包程序,用于實(shí)現(xiàn)對(duì)PE文件機(jī)密性的保護(hù),防止PE文件被逆向分析。文獻(xiàn)[40]介紹了嵌入式系統(tǒng)軟件的二進(jìn)制保護(hù)框架,該框架通過反調(diào)試和應(yīng)用加密、軟件防篡改等不同機(jī)制的結(jié)合來確保嵌入式系統(tǒng)軟件的完整性并阻礙逆向工程。
表1 反調(diào)試技術(shù)對(duì)比表
同時(shí),隨著軟件安全技術(shù)的進(jìn)一步發(fā)展,針對(duì)軟件保護(hù)的逆向工程技術(shù)的研究也會(huì)越發(fā)深入,軟件保護(hù)要想在對(duì)抗逆向工程的過程中搶占先機(jī),如何比逆向工具運(yùn)行在系統(tǒng)的更底層無疑是實(shí)現(xiàn)軟件保護(hù)的關(guān)鍵點(diǎn)之一。
針對(duì)傳統(tǒng)的被限制運(yùn)行于Ring 0或以上層的反調(diào)試技術(shù),文獻(xiàn)[41]提出了一種基于硬件虛擬化技術(shù)的反調(diào)試框架:虛擬機(jī)監(jiān)視器(Virtual Machine Monitor,VMM),它擁有比Ring 0更高的權(quán)限級(jí)別從而可以禁用斷點(diǎn)異常以及阻止應(yīng)用程序由調(diào)試器等其他應(yīng)用程序外部訪問而實(shí)現(xiàn)更加可靠的反調(diào)試目的。文獻(xiàn)[42]參考文獻(xiàn)[41]提出的反調(diào)試框架實(shí)現(xiàn)了一套基于硬件虛擬化技術(shù)進(jìn)行反調(diào)試軟件保護(hù)的框架,在實(shí)現(xiàn)VMM的基礎(chǔ)上,它還利用硬件虛擬化技術(shù)為該框架設(shè)計(jì)了自隱藏模塊來實(shí)現(xiàn)更加隱蔽、可靠且對(duì)系統(tǒng)性能影響較小的基于反調(diào)試的軟件保護(hù)方法。文獻(xiàn)[43]將進(jìn)程級(jí)虛擬機(jī)與反調(diào)試技術(shù)相結(jié)合,在運(yùn)行時(shí)將受保護(hù)程序和反調(diào)試代碼轉(zhuǎn)換為虛擬指令,當(dāng)虛擬機(jī)中的反調(diào)試技術(shù)未檢測(cè)到程序被調(diào)試時(shí)從虛擬機(jī)中調(diào)度程序,同時(shí)該方法結(jié)合防篡改技術(shù)保護(hù)虛擬指令來實(shí)現(xiàn)軟件保護(hù)。
本文詳細(xì)介紹了反調(diào)試技術(shù),敘述了反調(diào)試的定義,闡述了現(xiàn)有反調(diào)試技術(shù)的分類,并在軟件保護(hù)技術(shù)的基礎(chǔ)上展開了對(duì)反調(diào)試技術(shù)的研究。毫無疑問,單一的軟件保護(hù)技術(shù)已經(jīng)很難實(shí)現(xiàn)軟件保護(hù)的目的,而反調(diào)試和代碼混淆、軟件加殼、軟件防篡改、虛擬化等其他主流軟件保護(hù)技術(shù)相結(jié)合能夠提供更加可靠的軟件保護(hù)。同時(shí),反調(diào)試與其他主流軟件保護(hù)技術(shù)的結(jié)合也會(huì)改變現(xiàn)有的反調(diào)試乃至軟件保護(hù)的實(shí)現(xiàn)方法,促進(jìn)軟件產(chǎn)業(yè)健康發(fā)展。