1. 程式人生 > >反除錯主要方法簡述

反除錯主要方法簡述

反除錯技術概覽:怎麼噁心怎麼來

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放到虛擬機器中模擬執行

指令級虛擬機器:可以將任意一段指令放到虛擬機器中保護起來