一個android反除錯的學習
前言
初學android逆向除錯,用阿里上次的比賽練練手,第二題就是一個包含android反除錯機制的題目,於是仔細除錯分析了一下其反除錯的原理,記錄下來。
除錯方法
這個apk核心功能在so檔案中實現,於是試圖動態除錯so檔案,在關鍵函式下斷點之後,attach,F9,程式直接就退出了,經過一番搜尋,找到一種除錯方法。
- adb shell am start -D -n com.yaotong.crackme/.MainActivity
- 啟動IDA的android_server
- adb forward tcp:23946 tcp:23946
- IDA attach 到要除錯的程序上
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
之後在JNI_Onload下斷點,就可以除錯了。
反除錯
這個apk的反除錯,是在JNI_Onload函式裡,建立了一個執行緒,然後在這個執行緒的執行函式中,迴圈檢查tracerpid,該執行緒的執行函式如下圖。
主要除錯了一下這個檢測函式。首先通過getpid獲取當前程序號。
程序號在R0中。接下來通過sprintf拼接處/proc/pid/status字串,為後面讀取該其資訊做準備。
隨後通過fopen,開啟該檔案。
之後通過strstr和fgets,迴圈讀取資料,直到找到tracerpid,這裡沒有截圖。當找到tracerpid後,通過sscanf提取其資料。
可以看到,tracerpid為0x6DD4,即28116。也就是其除錯程序pid為28116。當tracerpid大於等於1時,認為當前程序正在被除錯中,跳到kill函式上,將當前程序退出。下圖為命令列得到的/proc/29592/status資訊,和android_server的pid,和除錯分析相對應。
總結
可以看到,這個apk的反除錯方法還是相對簡單,就是查詢其tracerpid的值,然後只要其大於0,就認為被除錯,從而退出。後面對該apk的破解就不寫出了,網上有很多方法。關於android的安全方面的學習,後面還要努力!