安卓APP動態調試-IDA實用攻略

來源:互聯網
上載者:User

標籤:pac   navig   令行   keyword   檔案的   crackme   windows   download   轉寄   

隨著智能手機的普及,移動APP已經貫穿到人們生活的各個領域。越來越多的人甚至已經對這些APP應用產生了依賴,包括手機QQ、遊戲、導航地圖、微博、、手機支付等等,尤其2015年春節期間各大廠商推出的搶紅包活動,一時讓移動支付應用變得異常火熱。

然後Mobile Security問題接憧而至,主要分為移動斷網路安全和用戶端應用安全。目前移動APP軟體保護方面還處於初級階段,許多廠商對APP安全認識不夠深入,產品未經過加密處理,使得逆向分析者能夠通過逆向分析、動態調試等技術來破解APP,這樣APP原本需要帳號密碼的功能可以被破解者順利繞過,使得廠商利益嚴重受損。

對未加殼的APP進行動態調試,通常可以非常順利且快速地繞過一些登陸限制或功能限制。本文將以安卓APP為例,來詳細介紹一下移動APP動態調試技術。

0x01 調試環境搭建

1.1 安裝JDK

JAVA環境的搭建請自行尋找資料,這裡不做詳述。

1.2 安裝Android SDK

:http://developer.android.com/sdk/index.html。

下載完安裝包後解壓到任意一目錄,然後點擊運行SDK Manager.exe,然後選擇你需要的版本進行安裝,

1.3 安裝Eclipse整合式開發環境

:http://www.eclipse.org/downloads。選擇Eclipse for Mobile Developers,解壓到任意目錄即可。

1.4 建立Android Virtual Device

動態調試可以用真實的手機來做調試環境,也可以用虛擬機器來做調試環境,本文採用虛擬機器環境。因此建立虛擬機器步驟如下:

1開啟Eclipse –>windows->Android Virtual Device

2點擊Create,然後選擇各個參數

這裡Target 就是前面步驟中安裝的SDK 選擇任意你覺得喜歡的版本就可以。點擊OK 就建立完畢。

1.5 安裝 APK改之理

這個是一個很好用的輔助調試的軟體,請自行搜尋下載。

1.6 安裝 IDA6.6

IDA6.6開始支援安卓APP指令的調試,現該版本已經提供免費下載安裝,請自行搜搜。

0x02 Dalvik指令動態調試2.1 準備工作

安卓APP應用程式尾碼為apk,實際上是一個壓縮包,我們把它改尾碼為rar開啟

其中classes.dex是應用的主要執行程式,包含著所有Dalvik指令。我們用APK改之理開啟apk,軟體會自動對其進行反編譯。反編譯後會有很多smail檔案,這些檔案儲存的就是APP的Dalvik指令。

在APK改之理裡雙擊開啟AndroidManifest.xml,為了讓APP可調試,需要在application 標籤裡添加一句android:debuggable="true"

然後點擊儲存按鈕,然後編譯產生新的apk檔案。接著開啟Eclipse –>windows->Android Virtual Device,選擇剛才建立的虛擬機器,然後點擊start,虛擬機器便開始運行。偶爾如果Eclipse啟動失敗,報錯,可以同目錄下修改設定檔:

把配置參數原本為512的改為256 原本為1024的改為512,然後再嘗試啟動。

在SDK安裝目錄有個命令列下的調試工具adb shell,本機所在目錄為E:\adt-bundle-windows-x86-20140702\sdk\platform-tools,把adb.exe註冊到系統內容變數中,開啟dos命令列視窗執行adb shell 就可以進入APP命令列調試環境,或者切換到adb所在目錄來執行adb shell。

這裡先不進入adb shell,在DOS命令列下執行命令:adb install d:\1.apk 來安裝我們剛才重新編譯好的APK檔案。安裝完畢會有成功提示。

2.2 利用IDA動態調試

將APP包裡的classes.dex解壓到任意一目錄,然後拖進IDA。等待IDA載入分析完畢,點擊Debugger->Debugger Options

按圖所示勾選在進程入口掛起,然後點擊Set specific options 填入APP包名稱和入口activity

其中包的名稱和入口activity 都可以通過APK改之理裡的AndroidManifest.xml 檔案擷取:

123 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.simpleencryption">    <application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/creakme_bg2" android:label="@string/app_name" android:theme="@style/AppTheme">        <activity android:label="@string/app_name" android:name=".MainActivity">

然後在IDA點擊Debugger->Process Options

其他預設不變,連接埠這裡改為8700。這裡預設連接埠是23946,我在這裡困擾了很久,就是因為這個連接埠沒有改為8700所致。然後我們看看這個8700連接埠是怎麼來的。在Android SDK裡提供了一款工具DDMS,用來監視APP的運行狀態和結果。在SDK的TOOLS目錄有個DDMS.BAT的腳步,運行後就會啟動DDMS。由於我的本機安裝了SDK的ADT外掛程式,DDMS整合到了Eclips中,開啟Eclips->Open perspective->ddms就啟動了DDMS。

在DDMS選中某個進程後面就會注釋出它的調試連接埠,本機這裡是8700。

到此所有的工作就準備就緒,然後就可以下斷點來調試該APP了。我們在APK改之理中在com目錄下查看smali檔案 發現MainActivity.smali裡有一個感興趣的函數getPwdFromPic(),那麼我們就對它下斷以跟蹤APP的運行。

在IDA裡搜尋字串getPwdFromPic,發現onClick有調用該函數

我們在onClick 函數開始位置按F2下斷

然後點擊中綠色三角形按鈕啟動調試

調試過程中有一個問題出現了很多次,浪費了我大量的時間,就在寫文章的時候,操作時還是遇到了這樣的問題。就是點擊啟動後IDA提示can’t bind socket,琢磨了很久終於找到原因了,當開啟過一次DDMS後 每次啟動Eclips都會啟動DDMS 而8700連接埠正是被這個DDMS給佔用了,然後每次都會啟動失敗,解決辦法就是 虛擬機器運行起來後關閉掉Eclips,這時一切就正常了!

案例中是一個APP crackme 提示輸入密碼才能進入正確介面。這個時候我們輸入123,點擊登陸,IDA中斷在了我們設定斷點的地方,這時選中ida->debugger->use source level debugger,然後點擊ida->debugger->debugger windows->locals開啟本地變數視窗,

然後按F7或F8單步跟蹤程式流程,同時可以觀察到變數值的變化,也可以在IDA右鍵選擇圖形視圖,可以看到整個APP執行的流程圖:

如所示 變數視窗中我們輸入了123 被轉化成的密碼是麼廣亡,pw變數也顯示出了正確的密碼,其實這個時候已經很容易判斷出正確密碼了。

0x03 Andoid原生動態連結程式庫動態調試

通常為了加密保護等措施,有時dex執行過程中會調用動態連結程式庫檔案,該檔案以so為尾碼,存在於APP檔案包裡。

這裡我們以動態附加的方式來調試原生庫。

3.1 準備工作

1、將IDA->dbgsrv目錄下的android_server拷貝到虛擬機器裡,並賦予可執行許可權

DOS命令分別為:

adb shell pull d:\ android_server /data/data/svadb shell chmod 755 /data/data/sv

2、啟動調試伺服器android_server

命令:adb shell /data/data/sv

伺服器預設監聽23946連接埠。

3、重新開啟DOS視窗進行連接埠轉寄,命令:

adb forward tcp:23946 tcp:23946 

3.2 利用IDA進行動態調試

1、虛擬機器裡啟動要調試的APP 2、啟動IDA,開啟debugger->attach->remote Armlinux/andoid debugger

連接埠改為23946 其他保持不變,點擊OK

如,選中要調試的APP 的資料包名,然後點擊OK。

正常情況下,IDA會把APP進程掛起。

3、由於當前程式不是在動態連結程式庫領空,這時我們要重新開啟一個IDA,用它開啟需要調試的so檔案,找到需要下斷的位置的檔案位移,並做記錄,然後關閉後面開啟的這個IDA。

4、在原IDA介面按下ctrl+s鍵,找到並找到需要調試的so,同時記錄該檔案的載入基址。然後點擊OK 或者cancel按鈕關閉對話方塊。

5、按下快速鍵G 輸入基址+檔案位移所得地址,點擊OK 就跳轉到SO檔案需要下斷的地方,這時按下F2鍵設定斷點。當APP執行到此處時便可以斷下來。

3.3 在反調試函數運行前進行動態調試

程式載入so的時候,會執行JNI_OnLoad函數,做一系列的準備工作。通常反調試函數也會放到JNI_OnLoad函數裡。進行4.2中第2步時也許會遇到如下情況:

這時APP檢測到了調試器,會自動結束,那麼這時調試策略需要有所改變。

接著4.1第3步後,在DOS命令列執行命令:

adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity    

來以偵錯模式啟動APP

com.yaotong.crackme是APP包名稱,com.yaotong.crackme.MainActivity是執行入口 這些可以用APK改之理查看。

這時由於APP還未運行,那麼反調試函數也起不了作用,按照4.2中第2步把APP掛起。這時IDA會中斷在某個位置

然後點擊debugger->debugger opions設定如下:

點擊OK 後按F9運行APP,然後再DOS命令下執行命令:

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

這時APP會斷下來,然後按照4.2中的3、4、5補找到JNI_OnLoad函數的地址並下斷,然後按F9 會中斷下來。然後便可以繼續動態跟蹤調試分析。

0x04 主要參考資料

1、《Andoroid 軟體安全與逆向分析》

2、看雪論壇安卓安全版

3、吾愛破解論壇安卓版

安卓APP動態調試-IDA實用攻略

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.