重所周知,有破解就必有防破解,二者本為一體
破解技術就不要我多介紹了,下面我來介紹反調試技術 也就是所謂的防破解技術
反調試技術可以簡單通俗的理解為:防止OD分析軟件的技術,也就是反調試技術
那么反調試技術又有幾種呢? 下面我介紹幾種常用反調試技術
首先聲明,下面有一部分內容來源百度,若有噴子覺得惡心,請自覺刪除
- 1. 最常用的便是調用windows API 那么 windows API又如何檢測OD呢?每一個API的作用是什么呢
- 2. 小編在百度上搜尋了一些文章來引用
- 3. 1.1IsDebuggerPresent:探測調試器是否存在的最簡單的API函數是IsDebuggerPresent。它查詢進程環境塊(PEB)中的IsDebugged標志。如果進程沒有運行在調試器環境中,函數返回0;如果調試附加了進程,函數返回一個非零值。
- 解釋:這里介紹的API是lsDebuggerPresent 他就是一個可以用來檢測OD的函數,通過檢測自身是否被附加,來檢測OD,或者是在OD下運行也會被檢測
- 5.
- 1.2CheckRemoteDebuggerPresent:CheckRemoteDebuggerPresent中的Remote並不意味着調試器必須駐留在不同的計算機上;相反,它表示調試器駐留在單獨的並行進程中。 使用IsDebuggerPresent函數來檢測調用進程是否在調試器下運行。
- 解釋:這里介紹的是CheckRemoteDebuggerPresent,他很有實用性,不過可惜只能在XP版本使用,下面是來自網絡的解釋,CheckRemoteDebuggerPresent是另一個檢測調試的api,只是可惜它似乎只能在winxp sp1版本以后使用。它主要是用來查詢一個在winnt時就有的一個數值,其內部會調用NtQueryInformationProcess()
- 1.3NtQueryInformationProcess:這個函數是Ntdll.dll中一個原生態API,它用來提取一個給定進程的信息。它的第一個參數是進程句柄,第二個參數告訴我們它需要提取進程信息的類型,例如將該參數置為ProcessDebugPort(值為0x7),將會告訴你這個句柄標識的進程是否正在被調試。如果進程正在被調試,則返回調試端口,否則返回0。
- 9. 解釋:這個API函數是屬於Ntdll里面的API,它主要可以提取進程信息來檢測OD,如果OD信息全部被替換,則此API 檢測不到
- 1.4GetLastError:編寫應用程序時,經常需要涉及到錯誤處理問題。許多函數調用只用TRUE和FALSE來表明函數的運行結果。一旦出現錯誤,MSDN中往往會指出請用GetLastError()函數來獲得錯誤原因。惡意代碼可以使用異常來破壞或者探測調試器。調試器捕獲異常后,並不會立即將處理權返回被調試進程處理,大多數利用異常的反調試技術往往據此來檢測調試器。多數調試器默認的設置是捕獲異常后不將異常傳遞給應用程序。如果調試器不能將異常結果正確返回到被調試進程,那么這種異常失效可以被進程內部的異常處理機制探測。
解釋:這是利用OD處理異常信息檢測的API,他可以通過異常來檢測到OD - 1.5對於OutputDebugString函數,它的作用是在調試器中顯示一個字符串,同時它也可以用來探測調試器的存在。使用SetLastError函數,將當前的錯誤碼設置為一個任意值。如果進程沒有被調試器附加,調用OutputDebugString函數會失敗,錯誤碼會重新設置,因此GetLastError獲取的錯誤碼應該不是我們設置的任意值。但如果進程被調試器附加,調用OutputDebugString函數會成功,這時GetLastError獲取的錯誤碼應該沒改變。
- 這個API名字叫OutputDebugString,他這個函數意思是 程序如果調用了這個API,就會在OD中顯示一條字符串(由於API而生成的,非程序本身),然后用通過SetLastError函數,用來獲取返回值(上文所說的錯誤值),如果被OD調試 則返回的便是真,沒有被調試則為假
- 1.6對於DeleteFiber函數,如果給它傳遞一個無效的參數的話會拋出ERROR_INVALID_PARAMETER異常。如果進程正在被調試的話,異常會被調試器捕獲。所以,同樣可以通過驗證LastError值來檢測調試器的存在。如代碼所示,0x57就是指ERROR_INVALID_PARAMETER。
- 解釋:這個API名為DeleteFiber,他作用是拋出一個異常,眾所周知,OD會自動處理異常(除非你手動設置),這時候,他便可以通過LastError 返回值來檢測OD
那么關鍵來了,我們要如何干掉這些檢測呢???
- 用工具(推薦,簡單快捷)
- 可以用類似XUTER 冰刃等軟件,來掛鈎此函數,至於如何掛鈎,找到相關函數,如何右鍵-恢復
- 2.通過寫源碼 來HOOK此函數
- 這里就不過多介紹了,例子百度有一大堆
- 過API檢測就這么簡單,不過想要找到是哪個API 還是需要花費一番功夫的
- 常用的檢測OD方法還有幾種
- 1. 3.2查找窗體信息
FindWindow函數檢索處理頂級窗口的類名和窗口名稱匹配指定的字符串。 - 這個比較簡單過,只需要更改OD的窗口名稱和類名,可以用精易助手編寫
- 10. 5.判斷父進程是否是explorer.exe
- 11. 這個進程是系統主要進程,一般進程的父進程都是這個
- 12. 如果用OD運行的話會改變父進程從而檢測到軟件被調試,過此方法很簡單,OD附加即可
- 判斷是否具有SeDebugPrivilege權限
默認情況下進程是沒有SeDebugPrivilege權限的,但是當進程通過調試器啟動時,由於調試器本身啟動了SeDebugPrivilege權限,當調試進程被加載時SeDebugPrivilege也就被繼承了。所以我們可以檢測進程的SeDebugPrivilege權限來間接判斷是否存在調試器,而對SeDebugPrivilege權限的判斷可以用能否打開csrss.exe進程來判斷。 - 14. SeDebugPrivilege權限可以理解為系統最高權限,相當與在美國和奧巴馬一般,一般進程都獲取不了這個權限,除非一些病毒用非法手段獲取權限,OD運行時會獲取此權限,從而他的子進程也會附帶這個權限,所以可以通過檢測是否有次權限來判斷是否被調試,過檢測方法很簡單,一樣是附加
- 15. 15.時鍾檢測
- 16. 這個很容易理解,就是在時鍾里面添加檢測代碼,循環檢測
- 17. 解決方法
- 18. 推薦工具 XUTER
- 右鍵-查看-查看進程定時器-移除
- 下面再來講講關於一些反調試進程的反調試
- 有些進程調用了一些檢測模塊
- 檢測到OD會彈出
- 警告! 程序初始化失敗!
- 請關閉 調試工具 再試!
- 軟件破解逆向QQ群:xxxxxxx
- 首先聲明:下列說明我已經調試過,所以無法截圖,藍屏太容易觸發
- 然后迅速藍屏,對於這種軟件,我們應該怎么辦?
- 首先第一個想到的方法便是附加,但是我們一打開OD他就馬上檢測,怎么辦?,這樣就說明他要么是時鍾檢測,要么就是循環檢測,我們先看看時鍾檢測,用XUTER,查看定時器,哦 結果發現藍屏,那怎么辦呢? 下面教大家一招妙招
- 依然用到的是XUTER
- 首先暫停該程序運行,然后便發現程序卡死了,然后再結束定時器,再點下方的恢復進程運行
- 好了,這下他的檢測被我們解決了,我們就直接附加吧
- 結果發現,他隱藏了進程,沒關系,我們用拖拽補丁,結果顯示無法獲取窗口,附加失敗,那怎么辦呢? 出現這種情況無疑就是程序調用了驅動,導致沒有權限附加
- 這樣我們依然用到XUter
- 我們跳到本工具配置,然后勾選禁止驅動加載,然后再運行進程,重復上面操作,然后打開OD附加
- 就發現成功了,這方法是我專門對付那些有驅動保護的,如果軟件有檢測驅動是否加載成功,可以用OD去掉
- 這就是我總結的一些方法,很簡單很適用,至少我對於那些檢測 我都有應付的辦法
- 由於是自己寫的 對於API知識不是很到位,所以難免會有差錯,發現差錯可以@我及時糾正,現在時間試:2016年10月23日03:55:23 我也要睡覺了,雖然是星期六 但還是要睡覺的
- 下面有時間再完善一下吧,謝謝大家的觀看
- 吾愛破解論壇BY:Very-good