1. 程式人生 > >反除錯手段

反除錯手段

呼叫函式檢測方式 ---------------------------------------------------- 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

 

-------------------------------------------------- 系統痕跡檢測 簡單的說 如果有偵錯程式除錯我們程式,那麼在登錄檔中會有登錄檔項修改

 

----------------------------------------- INT掃描 檢視int3 (0xcc)是否存在   執行程式碼校驗和檢查 檢視CRC或者MD5校驗   時鐘檢測 使用rdstc指令 使用QueryPerformanceCounter和GetTickCount   ------------------------------------------------- 使用TLS回撥 檢測程式是否有.tls段,如果有在IDA中Ctrl+E來查看回調函式,TLS回撥函式都擁有一個字首字串TlsCallback
使用異常 原理就是我們的偵錯程式通常遇到異常都會自己處理,不會交給程式自己處理,那麼利用這一點,惡意程式碼程式就會檢測異常是否由自己實現的異常處理函式處理,如果沒有被處理,則視為在已經被除錯 破解方法:在我們除錯中,可以將所有的異常都由使用者自己處理   ---------------------------------------------- 插入中斷 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

 

利用擴充套件頭中的NumberOfRvaAndSizes 這個值普通是0x10,如果這個值大於0x10後,Winodws載入器會忽略這個值,但是OD在使用的時候,發現大於0x10,OD則會崩潰 還有一種PE頭欺騙,就是當彈出"File contains too much data" 這是因為PE檔案的擴充套件頭中

 

2.OutputDebugString漏洞