0x00 前言android
動態調試是比靜態分析更爲高效地一種破解手段。所以在破解安卓應用以前,通常會先對應用進行動態調試,瞭解應用大體運行流程和各個類之間的邏輯關係。算法
反動態調試能夠從如下兩個個方向着手:安全
1.運行環境檢測:檢測應用的運行環境是否安全,是否可能存在被調試的風險架構
2.動態調試指令檢測:檢測應用的運行過程當中是否受到動態調試指令的控制函數
本文徹底參考自網友 愛吃菠菜 的反調試總結,因爲個人資料是pdf文檔,已經找不到出處,在此對網友 愛吃菠菜 說一聲抱歉。加密
0x01 運行環境檢測spa
1.調試端口檢測線程
不一樣調試器默認使用不一樣的調試端口,且這些端口默認值每每不被修改。調試
2.調試器進程檢測server
不一樣調試器會在系統中建立不一樣進程對應用進行劫持以達到動態調試目的。
3.父進程名檢測
針對so文件,破解者能夠本身編寫一個APK對so庫進行調試。
4.自身進程名檢測
原理同上條。正常的APK進程名通常爲入口類的目錄。形如:com.xxx.xxx.xxxx.xxxMainActivity。在開發時,該值是已知的,所以可對該值進行檢測。
5.apk線程檢測
正常APK運行時通常會有多個線程在運行,能夠在開發階段分析本身的源碼,正常運行時至少會有多少線程同時運行。針對若是破解者還是本身編寫APK調用so庫調試分析的狀況,此時的APK中通常只有一條線程。
6.apk進程fd文件檢測
分析系統中/ proc/pid/fd路徑下的文件差別進行判斷。
1)APK自己啓動的進程和非APK啓動的進程,fd數量不同
7.安卓系統自帶的動態調試檢測函數
8.tracepid
/proc/pid/status文件中有一個tracepid字段,若進程被調試,則tracepid值不爲0,不然爲0。能夠對該值進行檢測以判斷該進程是否被調試。
能夠將statue字段寫爲t,中止調試
10.stat
若是是被調試狀態,則
/proc/pid/stat
/proc/pid/task/pid/stat
第二個字段是t(T)
11.wchan
/proc/pid/wchan
/proc/pid/task/pid/wchan
ptrace_stop
12.ptrace
每一個進程同一時刻只能被一個進程ptrace。
能夠主動ptrace本身,讓別的進程沒法對本身ptrace;也能夠寫多個進程,讓其互相之間ptrace以避免被調試器ptrace
13.代碼執行時間間隔檢測
在兩段不一樣代碼處插入時間函數,獲取當前時間。對兩個時間差進行檢測,若是差值過大,則說明兩段代碼運行時間間隔過長,多是被單步調試。
14.mem、pagemap監測
0x02 動態調試中檢測
1.斷點指令檢測
2.函數hash值檢測
so文件中函數的指令是固定,可是若是被下了軟件斷點,指令就會發生改變(斷點地址被改寫爲bkpt斷點指令),能夠計算內存中一段指令的hash值進行校驗,檢測函數是否被修改或被下斷點。
3.單步調試陷阱
4.利用IDA先截獲信號的特性進行檢測
5.利用IDA解析缺陷攻擊IDA調試器
IDA調試器原理:IDA採用遞歸降低算法來反彙編指令,而該算法最大的缺點在於它沒法處理間接代碼路徑,沒法識別動態算出來的跳轉。而arm架構下因爲存在arm和thumb指令集,就涉及到指令集切換,IDA在某些狀況下沒法智能識別arm和thumb指令,進一步致使沒法進行僞代碼還原。