安卓逆向_13 --- AndroidStudio + Smalidea 动态调试 smali 代码【APK可调试】、gradle 配置
教我兄弟學Android逆向04 動態調試smali代碼:https://www.52pojie.cn/thread-658865-1-1.html
From:Android Studio 3.6 調試 smali:https://blog.csdn.net/jha334201553/article/details/104494732
From:Smalidea+IntelliJ IDEA/Android Studio無源碼調試:https://bbs.pediy.com/thread-220743.htm
From:反編譯之利用AndroidStudio動態調試smali源碼:https://juejin.im/post/5c14622be51d4556c90be796
From:Android Studio動態調試smail源碼:https://blog.csdn.net/hp910315/article/details/52790740
smalidea?插件?github?地址:https://github.com/JesusFreke/smalidea
Android Studio Smali 調試:https://www.jianshu.com/p/b9312b056d15
Android調試系列—使用android studio調試smali代碼:https://www.cnblogs.com/gordon0918/p/5570811.html
Android Studio動態調試smali:https://zhuanlan.zhihu.com/p/85469186
AndroidStudio+ideasmali動態調試smali匯編:https://www.cnblogs.com/lanrenxinxin/p/4891424.html
Android Studio + smalidea進行smail動態調試:https://blog.csdn.net/u013736724/article/details/53292855
微信 APP 調試方法 AndroidStudio3.2 + smalidea + Xposed + BDOpen:http://www.bloguan.com/?id=518
前言
Android studio 配置
- Android Studio 配置(一):https://www.cnblogs.com/qianguyihao/p/4390905.html
- Android Studio 配置(二):https://www.cnblogs.com/qianguyihao/p/4392611.html
- Android Studio 配置(三):gradle項目構建:https://www.cnblogs.com/xiaofengfeng/p/9133043.html
在安裝 Android Studio之前,建議先提前準備好單獨的 Android SDK,這個可以在http://www.androiddevtools.cn/?網站下載。Android Studio 安裝完成后,第一次啟動 AS 前,為了避免重新下載新版本的SDK,需要做如下操作:AS啟動前,打開安裝目錄,請先將bin目錄的idea.properties 文件中增加一行:disable.android.first.run=true 就行了,避免第一次打開AS時自動重新下載 SDK。mac 平臺的右鍵安裝包->Show Package Contents 就找到bin目錄了。
第一次打開 Android Studio 時,需要配置JDK和SDK:
上圖中,選擇“Project Structure”,彈出如下界面:(選擇JDK和Android SDK的路徑)?
在使用 Android Studio 的時候,也可以隨時修改JDK和Android SDK的路徑。選擇「File-->Other Settings-->Default Sructure」,即可進行同樣的修改。?
AndroidStudio 安裝的時候 Gradle 的配置
將如圖路徑改成你自定義的。這時候你會發現以后下載的Gradle都會進入這個文件里面。?但是當在 Android 里面執行 gradlew 命令的時候你會發現,他又去下載對應的 gradle 版本了,而且保存路徑在默認的 c://[用戶]//.gradle 里面。這時候問題來了,打開?gradle-wrapper.properties?文件仔細研究下文件里面寫的東西:
指定一個默認路徑 GRADLE_USER_HOME 這個路徑就是c盤。既然發現問題的根源,現在來修改 GRADLE_USER_HOME 的值。在系統環境變量里面添加 GRADLE_USER_HOME 變量,值為指定的位置,然后一定要重啟計算機。
From :[Android Studio系列(五)] Android Studio手動配置Gradle的方法:https://blog.csdn.net/u010142437/article/details/109119501
(1) android sutdio第一次打開一個工程巨慢怎么辦??
(2) 手動配置Gradle?Home為什么總是無效??
(3) 明明已經下載了Gradle,配置了gradle home,為什么打開工程還是去自動下載Gradle?
Gradle 構建配置詳解:https://www.knowledgedict.com/tutorial/gradle-build-script-config.html
史上最全 Android build.gradle 配置詳解:https://www.jianshu.com/p/c11862136abf
在開發過程中,
- debug 版本我們可以跟蹤調試,查看 bug 等信息,
- 但是 release 版本中只能去打 log 進行代碼進行猜測,還有就是 dump 堆棧等無法與代碼直接交互的方法。無源碼調試 指的是在沒有源代碼的情況下可以對 app 進行代碼調試,逆向 smali 代碼,然后查看其運行邏輯。對發現 release 版本問題的過程中可以讓我們更塊的定位錯誤。
工具及下載地址:
- ①、apktool.jar 用于反編譯 smali,下載地址:https://github.com/iBotPeaches/Apktool?。
? ? ? ? 可以使用 AndroidKiller,更新 AK 的 apktool,然后使用 AK 進行反編譯。。。 - ②、Android Studio 下載地址:?https://developer.android.google.cn/studio/
- ③、smalidea-0.05.zip?(目前最新版 0.05),AS 插件,用來給 smali 下斷點,單步調試,
? ? ? ? 下載地址:https://github.com/JesusFreke/smalidea?。解決新版 IDEA 或者 AndroidStudio 不能調試 smali 工程的問題( 不能下斷點 ):https://blog.csdn.net/binbin594738977/article/details/106571844/
1. AndroidStudio?安裝?smalidea 插件:
從 github 下載 smalidea.zip,然后在 Android 中依次選擇: File? ?-->? Setting? ?將會彈出設置對話框
然后在設置對話框依次選擇:? Plugins? ?-->? <設置圖標>? --> Install Plugin from Disk...
在彈出選擇對話框中,找到下載好的 smalidea 壓縮包,選擇ok即可
點擊?OK ,會重新啟動?Android?Studio ,至此,插件安裝就完成了。
2. 反編譯
目前常用的 Android 反編譯工具有:
- Baksmali:https://github.com/JesusFreke/smali
- Apktool:https://ibotpeaches.github.io/Apktool/
- dex2jar:https://sourceforge.net/projects/dex2jar/
步驟:
- 第一步:拿到想要 debug 的 apk。
- 第二步:反編譯?apk 得到 smali 代碼。可以使用 baksmali 進行反編譯,也可以使用 apktool 進行反編譯。這里使用 AndroidKiller ( AK 其實調用?apktool)。
使用?Baksmali?反編譯?apk?
baksmail 反編譯命令:java?-jar?baksmali-2.2.1.jar??d?myapp.apk?-o?~/projects/myapp/src
$java -jar baksmali-2.0.5.jar debug.apk -o debug/src使用 apktool 反編譯 apk?
apktool?反編譯命令:java?-jar?apktool.jar?d?myapp.apk?-o?~/projects/myapp/src
使用命令 :?java.exe -jar? apktool.jar d -f? <xxxx.apk>? -o <xxxx目錄>
也可以直接使用 ApkTool 集成環境(如果反編譯失敗可以替換其中的 apktool.jar 至最新版):
這是使用?AndroidKiller?進行反編譯(?AK?下載地址:https://down.52pojie.cn/Tools/Android_Tools/ )
讓 apk 可調式
參考:簡單實現Android手機“全局可調試”(ro.debuggable = 1)的方法:http://www.mamicode.com/info-detail-2915184.html
在 Android 真機上調試程序有一個前提,就是這個apk包必須有 debuggable=true 的屬性才行。而除了自己開發的apk能夠控制打包屬性之外,其他的程序發行之后顯然不會設這個值為 true 的(不然隨隨便便就能被Debug ,豈不是很沒安全感 )。為了調試這些第三方的apk,我們可以從整個手機系統入手 —— 因為除了每個apk中的 debuggable 標志以外,這個標志還可以在系統中全局指定,換句話說,只要把系統里的 debuggable 值設為true,那么不管apk的這個屬性是什么值 都可以被調試了。
? ? ? Android手機系統的?ro.debuggable 這一配置位于 /default.prop 文件中,而 /default.prop 又來源于手機每次啟動時 boot.img 中 ramdisk 的掛載,所以想要直接通過修改 /default.prop 是不可行的,但是系統文件是只讀的,改了也沒用。網上流傳較廣的是改 boot.img ,然而錘子并沒有解鎖 bootloader ,改了的話會變磚的。好在Magisk 有一個模塊能夠助我們實現這個修改,且看操作(默認手機已經 root 且安裝了 Magisk ):
這一步很關鍵,就是讓運行在設備中的程序支持 debug。方法有幾種:
- 把設備 root 掉
- 修改測試機的 /default.prop 文件的 ro.debuggable=1,目測這一步也可能需要 root。
- 使用模擬器
- 修改 apk 的 Manifest application 屬性 android:debuggable="true",可以用 apktool 解出 Manifest 然后修改,接著重新打包回去。(?反編譯 apk,修改 AndroidManifest.xml 的 debug 屬性并在程序的入口處添加?waitForDebugger代碼進行調試等待。 )
- 打開系統調試總開關,使用 am 命令,以調試模式啟動應用。
- 終極辦法,自己編譯一個 debug 版的 rom,這個稍微麻煩一點,自己編一個,想怎么玩就怎么玩。
下面只說明兩種方法,
- 一種是?修改 "?AndroidManifest.xml "?實現可調試 ,
- 另一種是?打開系統調試總開關
修改 "?AndroidManifest.xml "?實現可調試
使用?AndroidKiller?進行反編譯,然后在反編譯出的?AndroidManifest.xml?添加?debug 屬性
如果沒有這個屬性的話,需要自己添加?android:debuggable="true" 然后編譯安裝修改后的 apk 即可。。。
不添加代碼的方法:
修改?AndroidManifest.xml 之后不用在程序的啟動界面添加代碼也行,只要以 am 命令運行程序就行了。
以調試狀態啟動 app ,命令:adb shell am start -D -n com.wizardev.testjar/.MainActivity
轉發 8700 端口 到安卓 對應進程 [app_pid]。命令:adb forward tcp:8700 jdwp:446
記住這時候需要將 DDMS 關掉,不然會出現錯誤
添加代碼方法:
- 找到啟動 apk 的啟動界面,然后在啟動界面的?onCreate?方法的第一行添加?invoke-static {}, Landroid/os/Debug;->waitForDebugger()V?這句代碼。
那么問題來了,我們怎么知道程序的啟動界面呢?
其實可以通過以下幾種方式:
方法 1:
觀察 “AndroidManifest.xml” 文件中的代碼,看下圖
如果圖中 “1” 處的代碼,那么程序啟動界面的 smail 文件就是 “2” 處的名稱。如上圖啟動界面的 smali 文件就是“MainActivity.smali”。然后在 “MainActivity.smali” 文件中的?onCreate?方法中添加等待調試的代碼即可。用 am 命令,使目標程序以調試模式運行。
方法 2:
通過 adb 命令來發現 apk 的啟動界面,命令:adb shell dumpsys activity top
運行命令后會出現以下界面
圖中用紅框標記的就是啟動界面的 smali 文件名。注:這種方式找到的啟動界面可能不準確,因為有的 app 會有歡迎頁,因此推薦用第一種方法來找 app 的啟動界面。
主 Activity 中加入??invoke-static {},Landroid/os/Debug;->waitForDebugger()V
回編譯 apk 并簽名安裝到手機,如果啟動 app 出現以下界面,則說明以啟動模式運行app成功。
(這步如果重新打包失敗,可以安裝原始包,把手機 root 配置/default.prop 的 ro.debuggable=1 開啟全局調試。
然后用命令啟動 Activiry : adb shell am start -D -n package屬性的值/android:name屬性的值??)
打開系統調試總開關(?不用修改 "?AndroidManifest.xml "?)
??這種方法不用修改 “AndroidManifest.xml”,而且當你打開這個開關后手機中的所有 App 都是可以調試的了。但是這種方法操作起來比較復雜,而且手機必須是已經 root 過的,下面會詳細描述怎么打開系統調試的總開關。
??這里會介紹兩種方法,第一種方法是大家普遍采用的,但是我使用采用第一種方法沒有成功,于是查找資料找到了第二種方法,如果你使用第一種方法不成功,那么可以試下第二種方法。
第一種方法
-
1.?點擊這里下載“mprop”文件。
-
2. 依次運行一下命令設置 “ro.debuggable”
-
3. 運行?getprop ro.debuggable?命令可以查看 debuggable 的狀態,顯示為 1,表示更改成功。
注:這種方法在開機后設置的“debuggable”將會失效,需要重新設置
第二種方法
這種方法其實說復雜也不復雜,說不復雜呢!還是有一點復雜的。具體操作方法如下:
- 需要手機刷入“Magisk”,刷入方法就想卡刷手機系統一樣,可以到https://github.com/topjohnwu/Magisk/releases。
- 通過Magisk安裝“MagiskHide Props Config”模塊,安裝的方法可以看下面的動圖。
安裝完成之后需要重啟,才能生效。
打開終端,輸入以下命令
adb shell props會出現這個界面
然后,輸入3,回車,會出現這個界面
然后,輸入1,回車,出現這個界面
可以看到圖中顯示當前的 “ro.debuggable” 的值為0,如果要修改為1的話輸入“y”,回車即可修改完成。
接著終端會彈出是否重啟,這時繼續輸入“y”重啟,重啟后修改的“ro.debuggable”才會生效。
經過以上5步,就可以打開系統調試的總開關,這時我們打開“Monitor”工具就可以看見當前運行的所有的所有進程了。
注:通過這種方式修改的 “ro.debuggable” 值,重啟手機后不會還原,就是設置過后,手機重啟后不需要再次設置。
打開系統調試的總開關后,這時通過 am 命令以調試模式啟動應用,即可讓目標應用處于可調式狀態。
adb shell am start -D -n xxx這里的 “xxx” 為我們要調試應用的啟動界面,如我們要調試應用的啟動界面為?com.wizardev.testjar/.MainActivity?則輸入以下命令
adb shell am start -D -n com.wizardev.testjar/.MainActivity這是目標應用就會以調試模式運行,處于等待調試的狀態。
3. 將?反編譯后的smali??導入到 Android Studio?
將目標應用的 smali 源碼導入 AndroidStudio。將 smali 源碼導入AndroidStudio 挺簡單的,只需要將反編譯出來的 smali 文件夾放在工程項目中的模塊的 src 目錄下即可。
3.1?導入?smali?代碼
簡單的說一下操作方法吧。有兩種方法導入:?
方法 1:新建工程導入?smali?代碼
這樣,就將反編譯的 smali 文件導入到 AndroidStudio 目中了。操作后的目錄界面大致如下。
方法 2:不新建工程導入?smali?代碼
步驟總覽:
- Import Project... -> Create project from existing sources
- 將 Project(ALT+1)里面默認的 Android 視圖切換為 Project 視圖,將 src 設置為?Sources Root.
- Project Structure(Ctrl+Shift+ALT+S),Project SDK設置為?Android API 10 Platform
- 遠程調試配置,Run -> Edit Configuration進入Run/Dubug Configurations;Add New Configuration(+符號) -> Remote,將 5005 端口,修改為 8700 端口。
圖示說明:
默認選擇 Create project from existing sources ,一路 next ,最后點擊 Finish 即可
3.2 導入工程后設置?Sources root
用 Project 視圖,在項目目錄右鍵? --> Mark Directory as ... --> Sources root
3.3 設置 Project 的 sdk:
如果是通過 "新建項目" 導入的?smali ,則不需要設置?sdk,因為 新建工程 時已經有默認的?sdk
如果是通過 "?導入已經存在的 "?方式導入?smali ,則需要設置?sdk :
選擇?sdk ,這里選擇?sdk? 1.8
3.4 配置?遠程調試?(?遠程 debug 配置 )
添加一個 remote 調試,
或者:
修改調試的端口:8701?( 未占用端口均可 )
安裝設置 debug=true 的 APK,在需要的地方打好斷點,通過以下命令行啟動進程調試等待模式:
啟動第一個 Activity 然后等待 debug,命令:adb shell am start -D -S -W 包名/MainActivity(帶路徑)
命令行啟動調試模式,adb shell am start -D -n packagename/ MainActivity
packagename 為進程名,MainActivity 為首頁 Activity
啟動調試 app,通過?adb shell dumpsys activity top | grep --color=always ACTIVITY?在終端獲取包名和頁面信息。
進入等待調試
獲取運行 apk 的進程(pid):adb shell ps | grep 包名 。
- 示例:adb shell ps | findstr "zhuceji" ,如下圖所示,可以看到?pid?是 3170
端口映射: adb forward tcp:8701 jdwp:<pid>
-
執行:adb forward tcp:8701 jdwp:3170? ? 建立端口轉發,即把端口 8701?上面的信息通過?jdwp 轉發到?pid?是 3170?上面
進入等待調試后,在 Android studio 中執行?Run?->?Debug?啟動剛才創建的遠程調試器,進入動態調試了。
在 Android Studio 選擇附加
圖二
此時,已經 Attach 到進程中,可以快樂的調試了。通過斷點可以查看內存的信息。
設置 AndroidStudio 為遠程調試模式
??按下面的步驟操作,將AndroidStudio運行模式設置為遠程調試模式。
工程配好了,配置 debug 的端口:即 遠程調試配置,Run -> Edit Configuration?進入?Run/Dubug Configurations;Add New Configuration(+符號) -> Remote,將 5005 端口,修改為 8700 端口。
在出現的界面,點擊左上角的“+”,在出現的下拉列表中再點擊“Remote”,添加一個 remote 調試
設置遠程調試的名稱和監聽遠程的端口
在圖中1處修改遠程調試的名稱,不修改直接用默認的也行。在2處修改遠程調試服務端監聽的端口,一般設置為“8700”,當然也可以設置成當前調試項目所在的端口,可以在 “Monitor”工具中查看項目所在的端口。
(?也可以用 8700 端口,然后啟動 ddms 去設置端口號映射,然后 apply -> ok。設置端口號映射后?ddms?監聽的 8700?端口和轉發的端口都可以接收到數據。?好了,project 方面就準備好了! )
可以看到當前調試的項目有兩個遠程服務端端口,“8700”端口是每個調試程序默認的遠程端口,如果不想每次運行程序都重新設置一下端口,2處設置成“8700”就行了,然后點擊OK完成修改。這時你會發現可運行的程序中多出了一個你剛才設置的調試項目名稱。
如上圖,這里我直接使用默認的調試名稱,則可運行的項目中多出了一個“Unnamed”選項,我們選中這個就行了,這時Android Studio就在“8700”端口監聽項目的運行了。
以調試模式運行并將進程映射到8700端口
進程 id 可以在 “Monitor” 工具中查看,如下圖
也可以運行 adb 命令查看,用 adb 命令查看進程 id 的命令如下:adb shell ps | grep 包名
完成了以上兩步,接著在AndroidStudio點擊Debug選項,如下圖
然后就可以打斷點調試項目了。
注:在點擊Debug選項運行項目之前,需要先將“Monitor”工具關掉,否則會提示8700端口被占用,無法進行動態調試項目。
接下來需要準備的就是如何連上設備debug了!過程也很簡單,啟動DDMS
Tools -> Android -> Android Device Monitor 選擇你要調試的 apk 的包名
最后,開始 debug。Run->Debug Smali
針對 DDMS 端口轉發,也可以手動的制定端口信息,操作如下(smalidea的作者推薦的是ddms的方式):
cmd?執行命令:adb shell am start -D -S -W packageName?
( packageName 的獲取可以反編譯 AndroidManifest.xml 里面有包含 )
正常的話,你會看到設備里的應用已經跑起來了,并且有個 Waiting For Debugger 的提示,別關掉它。
- 1. 拿到程序運行的pid: adb shell ps | grep packageName
- 2. 端口映射: adb forward tcp:8800 jdwp:5413? ?這里的 8800 是上一步在配置工程中自定義的端口。
官方步驟如圖所示:
以上就是基于smalidea無源碼調試的整個過程,有問題的可留言,我們一起交流學習。
結束語
??動態調試步驟是有點復雜,其實熟悉之后就沒多大感覺了,簡單設置幾下就行了。可能有的手機不能root,這時就只能修改“AndroidManifest.xml”文件了,修改之后不用在程序的啟動界面添加代碼也行,只要以 am 命令運行程序就行了。
總結
以上是生活随笔為你收集整理的安卓逆向_13 --- AndroidStudio + Smalidea 动态调试 smali 代码【APK可调试】、gradle 配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从输入URL到页面显示的过程
- 下一篇: CompletableFuture详解~