反除錯主要方法簡述
反除錯技術概覽:怎麼噁心怎麼來
PEB相關
特點:一般在除錯的開始阻攔除錯者,除錯者只需找到原因後可一次性突破。
PEB:
BeginDebug:除錯標記位
Ldr:記憶體狀態
Heap(Flags,Force,Flags):堆狀態
NtGlobaFlag:核心全域性標記
TEB:
StaticUnicodeString:靜態緩衝區
使用原始API:
NtQueryInformationProcess()
ProcessDebugPort(0x07);獲取除錯埠
ProcessDebugObjectHandle(0x1E);獲取除錯控制代碼
ProcessDebugFlag(0x1F);獲取除錯標記
NtQuerySystemInformation()
SystemKermelDebuggerInformation(0x23);獲取系統除錯狀態(雙機除錯)
NtQueryObject():遍歷系統核心物件
攻擊偵錯程式
分離偵錯程式
NtSetInformationThread()--------ThreaHideFormDebugger(0x11)
開啟程序檢查
SeDebugPrivilege;檢查程序是否具有除錯許可權
利用TLS回撥函式
使用普通API父程序檢查
視窗名檢查
程序名遍歷
檔名及遍歷
檔名及檔案路徑檢查
登錄檔檢查
動態除錯
特點:一般在除錯過程中阻攔除錯者,可在除錯的過程中被頻繁觸發,因此需要除錯者隨時關注
使用SEH
異常;斷點;SetUnhandleadExceptionFilter()
時間檢查
RDTSC:彙編指令,讀取時間數計數器的內容
單步檢查
補丁檢查
0XCC掃描:根據規則掃描程式內的0XCC,如發現則有可能被下了斷點
Hash掃描:掃描關鍵程式碼段的Hash值,如不對則證明在執行時被修改/除錯
API斷點掃描:掃描API的第一個位元組是否為0XCC,是的話證明被除錯了
反反彙編
指令截斷:將一條指令截斷,進而導致反彙編引擎後續指令解析錯誤
指令混淆:將敏感指令拆分成多塊或幾塊不相干的指令迷惑除錯者
指令膨脹:將一條指令膨脹到數十條指令,但其行為與這一條指令一致
指令亂序:將原有程式碼執行順序在記憶體級別中打亂,用jmp連結,干擾除錯者
偷取程式碼
偷取OEP程式碼:將OEP程式碼移動到其他地方加密執行
偷取API程式碼:將api的部分起始程式碼移動到其他地方
分頁保護
執行時保護分頁:修改程式碼及資料段保護屬性干擾分析
殼
壓縮殼:配合OEP加密可以使除錯者很難順利逆向
加密殼:新增各種反除錯手段干擾除錯者分析
虛擬機器
API虛擬機器:將部分常用API放到虛擬機器中模擬執行
指令級虛擬機器:可以將任意一段指令放到虛擬機器中保護起來