反編譯之利用AndroidStudio動態調試smali源碼

前言:咱們能夠利用apktool獲得smali源碼,能夠利用dex2jarclasses.dex文件編譯成.jar文件,而後經過jd-gui工具來查看Java代碼,對比着Java代碼,基本就能夠看懂smali源碼了。但有時一個變量的值很難肯定,這時候就須要咱們經過動態調試來肯定不一樣的條件下這個變量具體的值了。html

讓apk可調式

  想要調試apk的首要條件就是讓這個apk具有能夠調試的條件,讓apk具有能夠調試的方法有兩種:android

  1. 反編譯apk,修改AndroidManifest.xml的debug屬性並在程序的入口處添加waitForDebugger代碼進行調試等待。
  2. 打開系統調試總開關,使用am命令,以調試模式啓動應用。

下面我將詳細介紹這兩種方法,到底使用哪種方法,就取決於大家本身了。git

經過反編譯修改AndroidManifest.xml的debug屬性

  1. 這一種方法須要對要調試的apk進行反編譯,反編譯以後找到「AndroidManifest.xml」文件,而後修改debug屬性,具體操做以下github

    若是沒有設個屬性的話,咱們本身增長android:debuggable="true"這句代碼便可.

  2. 要找到啓動apk的啓動界面,而後在啓動界面的onCreate方法的第一行添加invoke-static {}, Landroid/os/Debug;->waitForDebugger()V這句代碼。那麼問題來了,咱們怎麼知道程序的啓動界面呢?其實能夠經過如下幾種方式:shell

    1. 觀察「AndroidManifest.xml」文件中的代碼,看下圖bash

      若是圖中「1」處的代碼,那麼程序啓動界面的smail文件就是「2」處的名稱。如上圖啓動界面的smali文件就是「MainActivity.smali」。而後在「MainActivity.smali」文件中的onCreate方法中添加等待調試的代碼便可。

    2. 經過adb命令來發現apk的啓動界面,命令以下markdown

      adb shell dumpsys activity top
      複製代碼

      運行命令後會出現如下界面app

      圖中用紅框標記的就是啓動界面的smali文件名。注:這種方式找到的啓動界面可能不許確,由於有的app會有歡迎頁,所以推薦用第一種方法來找app的啓動界面。

  3. 回編譯apk並簽名安裝到手機,若是啓動app出現如下界面,則說明以啓動模式運行app成功。框架

打開系統調試總開關

  這種方法不用修改「AndroidManifest.xml」,並且當你打開這個開關後手機中的全部App都是能夠調試的了。可是這種方法操做起來比較複雜,並且手機必須是已經root過的,下面會詳細描述怎麼打開系統調試的總開關。tcp

  這裏會介紹兩種方法,第一種方法是你們廣泛採用的,可是我使用採用第一種方法沒有成功,因而查找資料找到了第二種方法,若是你使用第一種方法不成功,那麼能夠試下第二種方法。

第一種方法
  1. 點擊這裏下載「mprop」文件。

  2. 依次運行一下命令設置「ro.debuggable」

    adb push 「下載mprop文件所在的位置」\mprop /data/local/tmp/
    adb shell su
    chmod 755 /data/local/tmp/mprop
    data/local/tmp/mprop
    setprop ro.debuggable 1
    /data/local/tmp/mprop -r
    複製代碼
  3. 運行getprop ro.debuggable命令能夠查看debuggable的狀態,顯示爲1,表示更改爲功。

注:這種方法在開機後設置的「debuggable」將會失效,須要從新設置

第二種方法

  這種方法其實說複雜也不復雜,說不復雜呢!仍是有一點複雜的。具體操做方法以下:

  1. 須要手機刷入「Magisk」,刷入方法就想卡刷手機系統同樣,能夠到這裏下載zip包

    Magisk是什麼:簡單的說就是集成了root的框架,它強大的是root權限還能夠設置對其餘軟件隱藏。Magisk的強大遠不止這點,想了解Magisk具備哪些功能能夠自行搜索。

  2. 經過Magisk安裝「MagiskHide Props Config」模塊,安裝的方法能夠看下面的動圖。

  3. 安裝完成以後須要重啓,才能生效。

  4. 打開終端,輸入如下命令

    adb shell
    props
    複製代碼

    會出現這個界面

    而後,輸入3,回車,會出現這個界面

    而後,輸入1,回車,出現這個界面

    能夠看到圖中顯示當前的「ro.debuggable」的值爲0,若是要修改成1的話輸入「y」,回車便可修改完成。

  5. 接着終端會彈出是否重啓,這時繼續輸入「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
複製代碼

這是目標應用就會以調試模式運行,處於等待調試的狀態。

將目標應用的smali源碼導入AndroidStudio

  將smali源碼導入AndroidStudio挺簡單的,只須要將反編譯出來的smali文件夾放在工程項目中的模塊的src目錄下便可。簡單的說一下操做方法吧。

  1. 新建一個Android項目,不新建項目也行,但須要新建一個module。
  2. 將項目切換到project視圖,將新建的項目下app中src目錄下的代碼刪除或將新建的module下src目錄下的代碼刪除。
  3. 將咱們反編譯的smali文件夾放入src目錄下。

這樣,就講反編譯的smali文件導入到AndroidStudio項目中了。操做後的目錄界面大體以下。

運行程序,設置遠程調試項目

設置AndroidStudio爲遠程調試模式

  按下面的步驟操做,將AndroidStudio運行模式設置爲遠程調試模式。

  1. 打開Edit Configurations..

  2. 在出現的界面,點擊左上角的「+」,在出現的下拉列表中再點擊「Remote」

  3. 設置遠程調試的名稱和監聽遠程的端口

    在圖中1處修改遠程調試的名稱,不修改直接用默認的也行。在2處修改遠程調試服務端監聽的端口,通常設置爲「8700」,固然也能夠設置成當前調試項目所在的端口,能夠在「Monitor」工具中查看項目所在的端口。

    能夠看到當前調試的項目有兩個遠程服務端端口,「8700」端口是每一個調試程序默認的遠程端口,若是不想每次運行程序都從新設置一下端口,2處設置成「8700」就好了,而後點擊OK完成修改。這時你會發現可運行的程序中多出了一個你剛纔設置的調試項目名稱。

    如上圖,這裏我直接使用默認的調試名稱,則可運行的項目中多出了一個「Unnamed」選項,咱們選中這個就好了,這時Android Studio就在「8700」端口監聽項目的運行了。

以調試模式運行並將進程映射到8700端口

  1. 用am命令,使目標程序以調試模式運行。

  2. 將進程映射到「8700」端口,使用如下命令

    adb forward tcp:8700 jdwp:進程id
    複製代碼

    進程id能夠在「Monitor」工具中查看,以下圖

    也能夠運行adb命令查看,用adb命令查看進程id的命令以下

    adb shell ps | grep 包名
    複製代碼

完成了以上兩步,接着在AndroidStudio點擊Debug選項,以下圖

而後就能夠打斷點調試項目了。

注:在點擊Debug選項運行項目以前,須要先將「Monitor」工具關掉,不然會提示8700端口被佔用,沒法進行動態調試項目。

結束語

  動態調試步驟是有點複雜,其實熟悉以後就沒多大感受了,簡單設置幾下就好了。可能有的手機不能root,這時就只能修改「AndroidManifest.xml」文件了,修改以後不用在程序的啓動界面添加代碼也行,只要以am命令運行程序就好了。

相關文章:

反編譯之將脫殼後的dex文件從新打包成apk

反編譯之脫去樂固加固的殼

  轉載請註明出處:www.wizardev.cn

歡迎關注個人公衆號
掃碼關注公衆號,回覆「獲取資料」有驚喜
相關文章
相關標籤/搜索