遇見你我該如何逃避你——反調試技術概述

本篇文章用來總結大概的反調試技術,並不詳細,僅作概述。
反調試技術惡意代碼和一些軟件用來防止代碼被動態調試的一項技術。
《惡意代碼分析實戰》中有更爲詳盡的介紹。

一、探測Windows調試器

通過調試的痕跡去識別是否正在被調試。
1.WindowsAPI
1.1 IsDebuggerPresent
IsDebuggerPresent查詢進程環境塊(PEB)中的IsDebugged標誌。如果進程沒有運行在調試器環境中,函數返回0;如果調試附加了進程,函數返回一個非零值。
1.2 CheckRemoteDebuggerPresent
CheckRemoteDebuggerPresent同IsDebuggerPresent幾乎一致。它不僅可以探測系統其他進程是否被調試,通過傳遞自身進程句柄還可以探測自身是否被調試。
1.3 NtQueryInformationProcess
這個函數是Ntdll.dll中一個API,它用來提取一個給定進程的信息。它的第一個參數是進程句柄,第二個參數告訴我們它需要提取進程信息的類型。爲第二個參數指定特定值並調用該函數,相關信息就會設置到第三個參數。第二個參數是一個枚舉類型,其中與反調試有關的成員有ProcessDebugPort(0x7)、ProcessDebugObjectHandle(0x1E)和ProcessDebugFlags(0x1F)。例如將該參數置爲ProcessDebugPort,如果進程正在被調試,則返回調試端口,否則返回0。
1.4 OutputDebugString
在調試器中顯示一個字符串,同時也用來探測調試器是否存在。

2.手動檢測數據結構
2.1 檢測BeingDebugged屬性
BeingDebugged是一個標誌位,就像它的名字一樣,用來表示進程是否處於被調試狀態,當BeingDebugged=1時就說明被調試。
2.2 檢測ProcessHeap屬性
2.3 檢測NTGlobalFlag
當進程處於調試狀態時,PEB結構體偏移爲0×68的NtGlobalFlag的值會被設置爲0×70。
3.系統痕跡檢測
3.1 FindWindows
3.2 文件和目錄
3.3 註冊表
3.4 查看當前進程是否有調試相關進程
3.5 查看當前窗口中是否有相關窗口

二、識別調試器的行爲

在逆向工程中,爲了幫助惡意代碼分析人員進行分析,可以使用調試器設置一個斷點,或是單步執行一個進程。然而,在調試器中執行這些操作時,它們會修改進程中的代碼。因此,惡意代碼常使用幾種反調試技術探測軟件/硬件斷點、完整性校驗、時鐘檢測等幾種類型的調試器行爲。
1.INT掃描
檢查INT3 指令 0CCh
2.執行代碼校驗和檢查
CRC/MD5/硬件斷點
3.時鐘檢測
被調試時,進程的運行速度大大降低。
3.1 rdstc指令
3.2 QueryPerformanceCounter和GetTickCount
4.判斷父進程是否是explorer.exe
一般程序的父進程爲explorer.exe,被調試的進程一般爲調試器進程。

三.干擾調試器的功能

1.使用TLS回調
tls回調函數在程序入口點之前執行,可以寫入功能用來干擾調試。
2.使用異常
2.1RaiseException
RaiseException函數產生的若干不同類型的異常可以被調試器捕獲。
3.插入中斷
3.1 INT3
3.2 INT 2D 探測內核態的調試器。
3.3 插入ICE斷點
片內仿真器斷點指令icebp。

四、調試器漏洞

1.PE頭漏洞
對抗這種飯調試技術:利用十六進制編輯器手動修改PE頭部。
2.OutputDebugString漏洞

以上爲反調試技術的大體概括,深入學習,需要針對以上的每種方式進行深入學習。

相關書籍:《惡意代碼分析與實戰》

警示自己:學習不可好高騖遠,切記心靜,持之以恆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章