1. 程式人生 > 其它 >教我兄弟學Android逆向11 動態除錯init_array

教我兄弟學Android逆向11 動態除錯init_array

上一篇 《教我兄弟學Android逆向10 靜態分析反除錯apk》我帶你用jeb+IDA靜態分析了反除錯apk,並且瞭解了init_array和jnionload的執行順序 通過靜態patch的方法 我們過掉了反除錯驗證,但光是靜態patch似乎還不過於完美 ,有時候還需要配合動態除錯來達到破解的目的,基於上節課你表現良好,那麼這節課我將為你帶來動態除錯init_array的教程,注意認真聽課不要眨眼睛呀!
要麼學!要麼不學!學和不學之間沒有中間值 不學就放棄,學就要去認真的學! --致選擇


環境:IDA7.0 ,手機:nexus
本節課的內容和上節課相關聯,班級新來的同學請從上節課開始學起。
在開始本節課之前你需要先去了解IDA動態除錯的相關方法和技巧

https://blog.csdn.net/feibabeibei_beibei/article/details/52740212

現在課程開始 請同學們回想一下上節課我給出的兩種過反除錯的方法:
1.改android埠號,android_serve的名稱和修改核心的方式繞過tracepid的檢測。
2.通過修改thread_function函式, SearchObjProcess函式和checkport函式的ARM指令來達到靜態patch的目的。

這節課我將給你帶來第三種過反除錯的方法,也就是動態除錯其實方法和第二種雷同 只不過是把靜態patch換成了動態 。

一 .關鍵函式下斷點
1.找到init_array段裡面的函式thread_function 並在其第一條ARM指令上面按F2下斷點。

<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

2.在JNI_OnLoad函式呼叫SearchObjProcess處下斷點 (c程式碼視窗和彙編指令視窗快速轉換按Tab鍵)
<ignore_js_op>
<ignore_js_op>

3.動態註冊的函式sub_1174第一條指令下斷點。
<ignore_js_op>

二.動態除錯
1.開啟Android Device Monitor。
<ignore_js_op>
<ignore_js_op>

2.執行android_server
/data/local/tmp/android_server

<ignore_js_op>

3.埠轉發adb forward tcp:23946 tcp:23946
<ignore_js_op>

4.因為我們要除錯init_array所以需要在程式剛啟動的時候進行除錯 如果你對這條指令不熟悉 複習下第四課吧《教我兄弟學Android逆向04 動態除錯smali程式碼 》
啟動程式 am start -D -n demo2.jni.com.myapplication/.MainActivity
<ignore_js_op>

5.附加程序
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

6.附加完成後 如果IDA彈框直接點Yes Debugger option設定一下,因為我們裡面會除錯到執行緒所以執行緒打一個鉤 。
<ignore_js_op>
<ignore_js_op>

7.上一步完成後F9執行程式 在IDA等待的時候執行命令。
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

8.點選完same後程序會斷在一個點,不要理會,直接F9(如果彈出框都點Yes) 直到程式斷在了我們的斷點處 並將函式第二條ARM指令改成POP讓函式不執行直接出棧或者把下面呼叫exit對應的HEX改成00 00 00 00都是可以的。
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

9.IDA繼續F9讓程式執行起來直到程式斷在我們下的第二個斷點處 ARM指令BL是呼叫函式的意思 所以將其指令對應的HEX改成00 00 00 00 無意義的指令 直接patch掉達到讓其不呼叫的目的 注:ARM指令不是本節課的重點,關於ARM指令的教程以後的課程會有講到.
<ignore_js_op>
<ignore_js_op>

10.IDA繼續F9 這時會來到我們下的第三處斷點,注意這裡是動態註冊的函式 對於動態註冊的函式我們就不能通過把第二條ARM指令改成POP直接出棧 否則程式會崩潰 那這裡怎麼改呢?這裡可以直接把呼叫exit退出對應的HEX改成00 00 00 00來過掉。
<ignore_js_op>
<ignore_js_op>

11.到此這三處反除錯就都過掉了,現在F9執行遇見彈框都點確定,然後程式彈框 恭喜你挑戰成功!


三.總結
本節課我帶你用IDA動態除錯了init_array段和JNI_OnLoad裡面的方法,並且熟悉了常用的兩種patch方法,如果你不想讓so中的某一個函式執行,可以直接把這個函式的第二條ARM指令改成POP出棧,但是有一點需要注意 對於動態註冊的函式是不可以這樣修改的,否則程式會發生異常退出。也可以找到其呼叫處直接將其對應的HEX改成00 00讓其不呼叫。到此Android逆向基礎部分已告一段落,希望大家對課程裡面講解的知識多多練習 畢竟師傅領進門 修行在個人嘛。下節課我將會帶你走進Hook的世界。


四.課後作業
1.瞭解Xpose的使用。
2.搭建Xpose環境,嘗試編寫Hook程式碼。


下一篇:《教我兄弟學Android逆向12 編寫xpose模組

學習時的痛苦是暫時的 未學到的痛苦是終生的