標籤:
Android之so檔案調試分析
0x00:前言
在做這道題之前發現有學長之前做過,所以理了下思路準備寫寫過程。畢竟我是新手,所以寫得很囉嗦,其中遇到的很多細節問題困擾了我很久,也是希望通過這些讓想入Android的朋友少跳點坑,還望不吝指正。
這道題是在阿里挑戰賽上扒下來的,調試過程中遇到了不少的坑(畢竟第一次調=_=)。本來打算用真機調試,但是後面的步驟中有因為手機ROM的問題必須得刷機,所以還是用的模擬器來調。
0x01:
這個CM主要是調試native層和patch so的使用。
安裝apk進去是這樣的:
目標就是破解密碼。
一般思路是先看看java層,然而反編譯一看:
絲毫沒有破解的地方,所以只好考慮native層,調試so檔案。
將反編譯後的libcrackme.so丟進IDA裡可以看到驗證函式:
接著嘗試IDA attach這個so檔案,但是attach上程式就退出了,所以就對下面的JNI_Onload()這個載入資料函數進行分析。
0x02:
首先開啟ddms,不開啟的話調試連接埠是關閉的,後面沒法使用jdb。
!注意,這裡有個坑是:最好先cmd 然後netstat –ano | find “8700”是否被佔用,否則後續的調試時無法進行的。
只有佔用連接埠8700的程式為javaw時候才正常。
小tips:IDA中android_server一般有兩個,一種是支援Android5.0以上的(字元短些),還有一種是Android5.0以下的(字元長一點)。
我這裡為了方便把要用的android_server改了個名字
接著把IDA的androidserver push到模擬器上,並且用root身份進行。
接下來是連接埠轉寄 adb forward tcp:23946 tcp:23946
然後以debug模式啟動程式。這裡同樣有個坑,要重新開個cmd來執行連接埠轉寄和debug啟動,否則會出錯。
然後看模擬器上程式會顯示waiting for debugger的調試介面。
然後IDA attach
注意:attach的時候要先設定下
attach
然後調試選項(注意:一定要打上這個勾)
接下來一定要在IDA裡面點擊運行(這裡我不知道所以重做了好多次- -!)
使用jdb恢複程式
jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
然後在JNI_Onload下斷點
0x03:
IDA中按p鍵後會將代碼塊作為函數分析,再F5
發現是個死迴圈調試,參考了下so調試遇到死迴圈如何調試的方法比較後,選擇patch so的方式比較方便。
tips:這裡選擇patch so的原因是在之前的IDA中存在一個android_log_print()函數
每次啟動並執行時候固定輸出了I/yaotong (XXX): SecurityCheck Started...所以通過patch so修改列印的內容,
可以直接利用這個android_log_print函數來比較輸出正確的值。
當然也可以通過調試分析出上述的sub_130C()函數是用來反調試檢測的(即IDA attach就退出程式),nop掉這個函數就可以正常調試了。
0x04:
因為arm架構沒有單獨的nop指令,所以採用蒸米所說的movs r0,r0的方法,
對應的機器碼為00 00 A0 E1
來到sub_130C()的位置,將 13 FF FF EB 改為上述指令即可nop掉這個函數
再F5一看,發現已經成功nop掉
然後儲存so檔案,再覆蓋掉原來的so檔案,再重新簽名。
這次attach沒有退出就表明patch so成功了,然後在驗證函式
Java_com_yaotong_crackme_MainActivity_securityCheck下斷點。
然後在app上輸入密碼,就會定位到這個點
F5進去可以看到這裡應該就是加密的字串所在的地址
點進去按D轉為指標模式再看這個地址
aiyou,bucuoo應該就是flag了
0x05:
測試一下
破解成功!
0x06:
以前接觸的都是java層的東西,一般都是找核心驗證函式寫個註冊機就ok了。第一次調試native層讓我學到了很多東西,同時領會到了IDA的強大。雖然過程中有很多坑,有時候都不知道怎麼查,但是堅持下來還是完成了,為以後調試so檔案打下了基礎。
0x07:
參考
Android動態調試Ida Pro
Android--native層so檔案調試