Android 除錯Smali的兩種方式
前言
大家都知道我們在逆向分析的時候,很多時候主要在分析邏輯。網路抓包、資料來源流向分析、頁面邏輯跳轉分析、動態除錯等。由於很多程式碼都會混淆,很多時候我們直接通過程式碼可能看不出邏輯走向,所以我們就會選擇斷點來進行除錯。
C層一般會使用IDA進行除錯分析,Java層常常就會需要對Smali程式碼進行除錯分析。
剛接觸逆向這塊,看了很多網上的方法,於是就實踐了一下,在實踐的過程中又有了新方法的發現,於是乎,分享一下。
方案
話不多說直接上方案:
1、通過IDE+DDMS+Smalidea來進行除錯
2、通過Android studio + Smalidea來進行除錯
第一種方式:IDE+DDMS+Smalidea
系統環境 macOS
反編譯工具 ofollow,noindex">AndroidCrackTool
(分享一下工具,已經替換apktool為最新版2.3.4)
IDE Android studio 3.2
1、首先反編譯一個apk,修改其debuggable為true,並且重新打包
(當然如果也可以root然後是用mprop來修改系統的io.debuggable屬性,方法網上很多)

AndroidCrackTool
AndroidCrackTool是一個工具集合,可以通過設定來選擇使用Apktool,它是比較新的版本

反編譯
反編譯之後開啟AndroidManifest.xml清單檔案,在application下加入 android:debuggable="true"
大家可以看到這裡有多個smali,因為dex分包了,所以smali檔案下也有多個(有可能同一個module下的程式碼會分散到幾個資料夾下)
回頭我們會把這些smali程式碼拷貝到新的工程專案下進行除錯。
接下來就還是使用AndroidCrackTool(也可以自行使用apktool,它只是個成套的工具集)進行重新打包。

打包好之後就在dist目錄下
然後再使用AndroidCrackTool進行簽名,這個apk就變成一個可除錯的apk了。
2、使用IDE建立新工程(Android studio和idea都可以,我這裡使用的是Android studio,因為大家都有AS,並且Android專案有獨特的好處,後面會提到),然後把smali程式碼拷貝到source root目錄下(一般就是src)

預設src就是source root
3、下載安裝Smalidea外掛,然後建立偵錯程式
下載地址 [Smalidea] ( https://bitbucket.org/JesusFreke/smali/downloads/ )
下載出來的zip包,直接使用AS引入外掛即可。

引入外掛
然後,建立Remote偵錯程式


埠改為8700,module為app
4、使用DDMS依附除錯程序
新版的AS已經不能直接從IDE開啟DDMS了,從以下路徑找到開啟
sdk/tools/monitor
然後執行除錯adb 命令
adb shell am start -D -n {替換報名}/.ui.activity.LaunchActivity
這裡再提供一個快速查詢包名的命令(也可以用top,那個資訊較多)
adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'

執行命令後,app就出現一個彈框等到debugger attach了,DDMS開啟,然後就出現device裡面看到可調式的程序了。並且預設埠是8700

可調式了
然後AS執行我們的偵錯程式,

執行偵錯程式

大功告成
這下我們就可以除錯smali程式碼了,並且看左邊的Frames,還可以看到函式呼叫棧,很棒。
注意:
如果遇到開啟DDMS,提示8700埠已經佔用,比如AS的Android專案已經佔用了,這時候問就可以通過 lsof -i:8700
來檢視 使用這個埠的程序資訊,然後 kill -9 程序號
來殺掉這個程序,重新連線adb,開啟ddms就可以了。

檢視程序號,殺掉,重啟
第二種方式:Android studio+Smalidea
第二種就更簡單一些了,其實就只使用AS就可以了,我們都知道Android app專案,我們執行起app之後,直接點選Stop左邊的"Attach to Android processor"按鈕,就可以除錯此應用了。原理也一樣,我們也可以通過它來除錯我們想要除錯的apk的程序。

跟第一步不同,再執行了除錯adb命令 adb shell am start -D -n xxxx
之後,點選此按鈕,注意,這裡需要勾選"Show all processes",這樣就可以看到要除錯的程序了。

大功告成
一樣的,打上斷點,就可以除錯啦!哈哈哈,真方便。
第二個方法是最方便的,Android開發者就是用AS就夠了,不需要用idea啥的,還要去下載。這也是我推薦分享給大家的方法。
最後
本人也是剛剛開始接觸逆向相關,需要學習的還很多,後面如果有好的東西也會多多分享,如果大家有好的資源也歡迎留言分享,謝謝。