反除錯手段
阿新 • • 發佈:2018-11-20
呼叫函式檢測方式
----------------------------------------------------
IsDebuggerPresent(檢測本程序)
檢查程序環境塊(PEB)中IsDebugged標誌
如果沒有被除錯就返回0,如果除錯附加了程序,函式返回非零值
CheckRemoteDebuggerPresent(檢測其他程序)
這個函式和上面的函式檢測的原理是一致的,但是他可以檢查其他程序是否被除錯,他需要一個程序控制代碼
NtQueryInformationProcess
此函式是Ntdll中的一個原生態的API,它用來提取一個給定的程序資訊,第一個引數是程序控制代碼,第二個引數是想獲取的程序相關的資訊,如果將此引數設定為ProcessDebugPort(值為0x7),如果該程式被除錯,則函式的返回值是除錯埠,否則返回0
OutputDebugString
在有偵錯程式存在和沒有偵錯程式存在時,OutputDebugString函式表現會有所不同。最明顯的不同是, 如果有偵錯程式存在,其後的GetLastError()的返回值為零。
解析:先設定一個錯誤碼,如果函式返回失敗,就會重置錯誤碼,相反如果錯誤碼沒有變,就證明OutputDebugString返回成功,正在被除錯
----------------------------------------------------
手動檢查反除錯
1.檢測BeingDebugged
原理是我們可以檢測PEB結構(程序環境塊)
我們可以檢測FS:[30h]找到PEB的基址,然後檢測BeingDebugged標誌檢視是否被除錯
2.檢測ProcessHeap屬性
它處於PEB結構的0X18處,他被設定為載入器為程序分配的第一個堆的位置,第一個堆頭有一個屬性欄位,他告訴這個堆是否在偵錯程式中建立(ForceFlags和Flags)
在XP中ForceFlags位於堆頭部偏移量0x10處,在win7他在0x44處
同理在XP中偏移量0x0C或者win7系統中偏離量0x40中檢視Flags屬性
經過兩次解析後檢測方式
3檢查NTGlobalFlag
檢查PEB的0x68處標誌位是否為0x70h
--------------------------------------------------
系統痕跡檢測
簡單的說 如果有偵錯程式除錯我們程式,那麼在登錄檔中會有登錄檔項修改
使用異常
原理就是我們的偵錯程式通常遇到異常都會自己處理,不會交給程式自己處理,那麼利用這一點,惡意程式碼程式就會檢測異常是否由自己實現的異常處理函式處理,如果沒有被處理,則視為在已經被除錯
破解方法:在我們除錯中,可以將所有的異常都由使用者自己處理
----------------------------------------------
插入中斷
1.插入INT3
雙位元組操作碼0xCD03可以產生INT3中斷,這種大部分用在干擾WinDbg,0XCD03會產生一個STATUS_BREAKPOINT異常,在WinDbg中由於斷點是單位元組0xcc 所以WinDbg會捕獲到這個斷點,將EIP加1,這樣會導致程式錯誤執行
2.INT 2D
類似的有INT 2D 它與INT3類似,INT2D用來探測核心偵錯程式
--------------------------------------------------
偵錯程式漏洞
1.PE頭漏洞
是利用修改PE檔案,當OD在載入PE檔案時候,導致OD崩潰
錯誤結果是Bad or Unknown 32-bit Executable File
具體程式碼
----------------------------------------- INT掃描 檢視int3 (0xcc)是否存在 執行程式碼校驗和檢查 檢視CRC或者MD5校驗 時鐘檢測 使用rdstc指令 使用QueryPerformanceCounter和GetTickCount ------------------------------------------------- 使用TLS回撥 檢測程式是否有.tls段,如果有在IDA中Ctrl+E來查看回調函式,TLS回撥函式都擁有一個字首字串TlsCallback
利用擴充套件頭中的NumberOfRvaAndSizes 這個值普通是0x10,如果這個值大於0x10後,Winodws載入器會忽略這個值,但是OD在使用的時候,發現大於0x10,OD則會崩潰 還有一種PE頭欺騙,就是當彈出"File contains too much data" 這是因為PE檔案的擴充套件頭中
2.OutputDebugString漏洞