**
最近研究so檔案除錯和dump記憶體時,為了完整ida除錯起來,前後摸索了3天才成功,裡面有很多坑和細節,稍微不注意,就一直排行,需要理解每步驟的作用意義,否則就會覺得教程不對,要詳細的教程可能找不到,大部分都是簡單介紹,沒有提醒細節和易忽視的點
事先準備工作
1、要求root手機或者直接用模擬器
否則沒有許可權啟動android_server
2、ida在6.6以上版本 或者手機為5.0以下 否則會出現 pie異常:
error: only position independent executables (pie) are supported.
細步驟如下::
1、首先把ida安裝目錄下的android_server檔案通過adb push 命令push到手機/data/local/tmp/目錄下,並通過root許可權身份執行./android_server
c:\windows\system32>adb shell
shell@hwgra:/ $ cd /data/local/tmp/ shell@hwgra:/data/local/tmp $ ./android_server ida android 32-bit remote debug server(st) v1.19. hex-rays (c) 2004-2015
2、通過adb forward命令把埠轉cp端ida的監聽應用埠號
adb forward tcp:23946 tcp:23946
3、通過adb shell am start -d -n com.exaple.cctf/.mainactivity 命令開啟應用的除錯模式
4、開啟ida進行attach
是32-bit的debug server,於是將ida換成32位的。注意,除錯32位的程式得用ida的32位版,64位的程式用64位版。不然會出錯。如下:
incompatible ida version 以及ida報不識別host
通過執行android_server之後 顯示的位數來判斷是32位還是64,如下:
ida android 32-bit remote debug server(st) v1.19. hex-rays (c) 2004-2015
5、啟動ida之後並attach了除錯程序,設定了debugger options 使能在so載入除錯下停住。重點再是讓程序執行起來之後,再用jdb連線手機虛擬機器,否則連不起來,會阻塞,會無法新增到vm,順序很重要。
6、jdb連線,使進入除錯模式
jdb -connect com.sun.jdi.socketattach:hostname=127.0.0.1,port=8700
7、設定斷點,再繼續執行,便會停在斷點處。
相關adb 命令收集
1、adb shell pm list packages 獲取手機包名列表
2、adb shell dumpsys package [name] 獲取安裝包的資訊 檢視是否可以debugable
flags=[ debuggable has_code allow_clear_user_data test_only allow_backup sto
pped ]
flags中還有debuggable
3、adb forward tcp:23946 tcp:23946 把手機中的android_server的埠號**到cp應用ida埠
4、android list adv 列出adv虛擬機器列表
5、emulator -adv [name] 啟動某個名為name的虛擬機器
6、當有時候adb鏈結失敗時
,通過重啟來鏈結adb
adb kill-server 殺死adb程序,
adb start-server
7、adb shell am start -d -n [package/mainactivity.class路徑] 除錯模式啟動應用
android adb你真的會用嗎?
一種是直接除錯時候斷點到libdvm.so載入dex時候,找到在記憶體中的起始點r0和大小r1,然後通過ida執行指令碼:
static main(void)
把記憶體這塊連續位址內容dump出來,這種只能dump安裝執行時apk中classes.dex,不方便dump多次dex載入或動態載入時定位到起始位址
對於dump出來的檔案是odex直接開啟看不夠清晰,如用gda工具開啟裡面都是類似組合語言。這時就需要用到baksmali.jar 和smali.jar來轉換成dex檔案,可以直接方便查閱。詳見我的另一篇文章《手機dump記憶體odex格式反編譯》
當然這只是最簡單脫殼方法,很多高階殼會動態修改dex的結構體,比如將codeoffset指向記憶體中的其他位址,這樣的話你dump出來的dex檔案其實是不完整的,因為**段儲存在了記憶體中的其他位置。那麼針對這種反除錯情況下以及其他阻礙動態除錯下,dump內容和ida除錯都很難進行下去,看到網上有這樣的文章:利用開源脫殼工具dexextractor來脫殼。它的原理就是修改系統的dexfile.cpp原始碼,在解析dex的函式開頭處加上自己的dumpdex邏輯。 這樣不論怎麼繞,只要載入了dex就可以dump出來,可以研究下,傳送門:
ida遠端除錯 在記憶體中dump dex檔案
android逆向之旅—動態方式破解apk高階篇(ida除錯so原始碼)
android安全防護之旅—應用」反除錯」操作的幾種方案解析
ida 遠端除錯 android so
相關逆向工具
IDA動態除錯
使用ida開啟目標檔案。使用選單項上的 debugger 單擊 select debugger 再根據當前的檔案型別選擇合適的偵錯程式。我這裡除錯exe檔案時一般使用 local windows debugger 或 remote windows debugger。這裡需要注意的是,在ida7.0版...
IDA動態除錯so檔案
1 將ida安裝目錄的 dbgsrc android server或者 android server nonpie複製到虛擬機器的data資料夾 2 使用ida開啟so檔案 4 配置虛擬機器端的監聽 5 使用adb forward命令進行埠的 將裝置被除錯端的埠 到遠端除錯端中 6 設定ida的de...
IDA 動態除錯 ELF 檔案
01 ida 遠端除錯配置 配置方法和 windows 相同 bin bash cd home ubuntu ida dbgsrv linux server cd home ubuntu re tools ida idaq 執行 demo 02 ida 動態除錯 單步步入 f7 遇到函式,將進入函式...