很多時候在對apk分析時,靜態調試顯得蒼白無力,需要我們手動算很多東西,而動態調試則可以直接觀察結果,一般的方法都需要再手機端運行服務纔可以進行調試,下面我們就來學習一下三個調試方法
jeb動態調試
使用jeb打開我們的22.apk文件
見名知意,Certificate:證書,Bytecode:字節碼,Resources:資源文件。
雙擊Bytecode,會打開兩個窗口,Bytecode/Hierarchy和Bytecode/Disassembly。
兩個窗口都顯示的是相當於用baksmali反編譯後smali下所有文件。
Bytecode/Disassembly是包含在Disassembly一個文件中。
而Bytecode/Hierarchy則是以樹形結構顯示。
、
在Bytecode/Hierarchy中雙擊指定文件如MainActivity,則會自動定位到Bytecode/Disassembly中對應的定義中。
也可以直接定位到方法和變量中。
標記斷點
在Smali中鼠標單擊選中行後,快捷鍵Ctrl+B可以標記和取消斷點。
開始調試
需要保證一些條件
查看androidmanifest.xml 的 debuggable
連接手機,設置好斷點後,運行設備上被調試的應用,點擊菜單欄上調試按鈕開始調試。
(但是我沒有root的手機 ,所以下面的是雲調試。。)
可以實現多種調試功能 單步 步入 步過等
可以查看當前寄存器值 VM/LOCLS
小例子
使用JEB打開文件,分析瀏覽器跳轉apk的原理。這就像我們正在網頁瀏覽百度,突然跳出來一個提示 可以在百度app中查看,點擊之後就進入了app,然後繼續
剛纔的內容瀏覽,這實際上是一個基於標籤的apk跳轉功能,我們來分析一下
在manifest中尋找打開瀏覽器的事件
關鍵詞爲android.intent.category.BROWSABLE,這就是通過瀏覽器可以跳轉的功能
找到對應的scheme 和 acctivity 這兩個是對應的跳轉事件 和 對應的標籤
<activity android:launchMode="singleTask" android:name="com.baidu.searchbox.share.social.share.handler.QQFriendShareReceiverActivity">
在二進制代碼中找到事件具體代碼
QQFriendShareReceiverActivity 直接在bytecode中搜索就可以 可能很慢的
點擊反彙編找到源代碼,可以找到類中的oncreat事件 觀察是如何進行傳遞參數和處理的,是否有邏輯漏洞
可以觀察事件 及參數。
我們還可以看到事件的標籤 用於在外部網頁中可以引導調用apk
在外部網頁調用時 需要編寫帶有固定標籤的網頁
<a href=“tencent1106087470://baidu.com“>歡迎來到新世界</a>
IDA的動態調試
設置調試斷點
IDA需要將apk文件和IDA pro安裝目錄下IDA 6.8\dbgsrv\androd_server文件上傳到手機,並修改執行權限,命令如下
adb push 22.apk /data/local/tmp/ adb push android_server /data/local/tmp/ adb shell chmod 777 /data/local/tmp/22.apk adb shell chmod 777 /data/local/tmp/android_server
調試步驟
1 開啓android_server,監聽23946端口,與IDA pro通信,命令如下
1. adb shell /data/local/tmp/android_server
2. 分開執行也可以
adb shell
cd /data/local/tmp
./android_server
開啓新的cmd 設置端口轉發
adb forward tcp:23946 tcp:23946
打開IDA pro,開啓界面選擇go,進入IDA 主界面,選擇Debugger->run->Remote ARMLinux/Android debugger/,配置如下
點擊OK,就會啓動android的mytest程序,此時會斷在linker的__dl__start函數中,如圖所示
我們一般使用的是attach 選擇我們的程序
進入之後可以通過view下不同地方的斷點,不過由於沒有root是看不見其他app的
ida也可以通過正常的調試 而不是進行attach
GDB動態調試方法
首先說一下大體的步驟:
1. 先要在目標手機的/data目錄下把gdbserver push到這個/data/local/tmp目錄下,然後運行chmod 777 gdbserver增加執行權限。
2. 在目標手機上運行你要調試的APP,獲取這個APP的進程號,比如是18440,然後在目標手機的命令行下執行./gdbserver :1234 --attach 18440,輸出如下:
# ./gdbserver :1234 --attach 18440
Attached; pid = 18440
Listening on port 1234
表示已經attach到進程2559上了,在tcp端口1234上監聽,gdb這邊只要也連上1234這個端口就可以了。
3. 在開發機這邊的命令行上面啓動gdb,然後執行shell命令(shell adb forward tcp:1234 tcp:1234),表示通過adb映射tcp端口1234,命令中前面的是local的端口,後面的是remote的端口,然後再執行命令(target remote localhost:1234)
使用gdb調試的話需要gdbserver,就像IDA中一樣將該部分push到手機上,然後調服務,開端口,具體的過程如下:
(別介意 當時忘記點同意調試了)
然後push文件到手機
查看一下進程 找到我們需要的
第二列的18344就是我們的目標進程
>adb push gdbserver /data/local/tmp
>adb shell
cd /data/local/tmp
chmod 777 gdbserver
./gdbserver --attach tcp:31137 18344
這裏常見的錯誤: ./gdbserver: not executable: 32-bit ELF file
原因是我們使用的是arm的ABI(arm爲處理器的一種,還有x86等)
所以我們要相應的手機 或者安裝對應ABI爲arm的虛擬機纔可以執行。
沒有root的設備,要使用gdbserver 調試app 會遇到權限問題。(emulator 沒有問題)
1|shell@mako:/data/local/tmp $ ./gdbserver :31137--attach 18344
Cannot attach to lwp 18344: Operation not permitted (1)
Exiting
Android 系統提供了一個run-as 命令來暫時切換用戶,但是這個命令有限制,必須是app 打開了debuggable才行,否則會報 Package xx is not debuggable 的錯誤。
run-as system_server /data/tmp/gdbserver --attach 31137 :18344
看看我們這個app有沒有這個標誌
這裏無法使用是因爲沒有root
然後是設置端口轉發
關於gdb的使用就不多說了 前面已經講解了。
https://blog.csdn.net/qq_35559358/article/details/79984935
https://www.cnblogs.com/xunbu7/p/8086091.html
原文:https://blog.csdn.net/doomvsjing/article/details/73695476
https://www.cnblogs.com/lao-liang/p/5111399.html
https://blog.csdn.net/itluochen/article/details/52262020
原文:https://blog.csdn.net/Kudou_Shinichi/article/details/79682575
來源: https://www.cnblogs.com/chen110xi/p/6612437.html
https://blog.csdn.net/weixin_39142112/article/details/80356244、
https://www.cnblogs.com/ouyangping/p/6366461.html
原文:https://blog.csdn.net/wangsfine/article/details/51205564
https://www.jianshu.com/p/8e8ed503d69b
https://www.cnblogs.com/gordon0918/p/5581597.html
https://blog.csdn.net/beyond702/article/details/50427640