隨着智能手機的普及,移動APP已經貫穿到人們生活的各個領域。愈來愈多的人甚至已經對這些APP應用產生了依賴,包括手機QQ、遊戲、導航地圖、微博、微信、手機支付等等,尤爲2015年春節期間各大廠商推出的搶紅包活動,一時讓移動支付應用變得異常火熱。html
而後移動安全問題接憧而至,主要分爲移動斷網絡安全和客戶端應用安全。目前移動APP軟件保護方面還處於初級階段,許多廠商對APP安全認識不夠深刻,產品未通過加密處理,使得逆向分析者可以經過逆向分析、動態調試等技術來破解APP,這樣APP本來須要帳號密碼的功能能夠被破解者順利繞過,使得廠商利益嚴重受損。linux
對未加殼的APP進行動態調試,一般能夠很是順利且快速地繞過一些登錄限制或功能限制。本文將以安卓APP爲例,來詳細介紹一下移動APP動態調試技術。android
1.1 安裝JDKshell
JAVA環境的搭建請自行查找資料,這裏不作詳述。windows
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,解壓到任意目錄便可。app
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指令的調試,現該版本已經提供免費下載安裝,請自行搜搜。
安卓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文件。安裝完畢會有成功提示。
將APP包裏的classes.dex解壓到任意一目錄,而後拖進IDA。等待IDA加載分析完畢,點擊Debugger->Debugger Options如圖
按圖所示勾選在進程入口掛起,而後點擊Set specific options 填入APP包名稱和入口activity 如圖:
其中包的名稱和入口activity 均可以經過APK改之理裏的AndroidManifest.xml 文件獲取:
#!html <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變量也顯示出了正確的密碼,其實這個時候已經很容易判斷出正確密碼了。
一般爲了加密保護等措施,有時dex執行過程當中會調用動態連接庫文件,該文件以so爲後綴,存在於APP文件包裏。
這裏咱們以動態附加的方式來調試原生庫。
一、將IDA->dbgsrv目錄下的android_server拷貝到虛擬機裏,並賦予可執行權限
DOS命令分別爲:
adb shell pull d:\ android_server /data/data/sv adb shell chmod 755 /data/data/sv
二、啓動調試服務器android_server
命令:adb shell /data/data/sv
服務器默認監聽23946端口。
三、從新打開DOS窗口進行端口轉發,命令:
adb forward tcp:23946 tcp:23946
如圖:
一、虛擬機裏啓動要調試的APP 二、啓動IDA,打開debugger->attach->remote Armlinux/andoid debugger
端口改成23946 其餘保持不變,點擊OK
如上圖,選中要調試的APP 的數據包名,而後點擊OK。
正常狀況下,IDA會把APP進程掛起。
三、因爲當前程序不是在動態連接庫領空,這時咱們要從新打開一個IDA,用它打開須要調試的so文件,找到須要下斷的位置的文件偏移,並作記錄,而後關閉後面打開的這個IDA。
四、在原IDA界面按下ctrl+s鍵,找到並找到須要調試的so,同時記錄該文件的加載基址。而後點擊OK 或者cancel按鈕關閉對話框。
五、按下快捷鍵G 輸入基址+文件偏移所得地址,點擊OK 就跳轉到SO文件須要下斷的地方,這時按下F2鍵設置斷點。當APP執行到此處時即可以斷下來。
程序加載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中的三、四、5補找到JNI_OnLoad函數的地址並下斷,而後按F9 會中斷下來。而後即可以繼續動態跟蹤調試分析。
一、《Andoroid 軟件安全與逆向分析》
二、看雪論壇安卓安全版
三、吾愛破解論壇安卓版
感謝看雪論壇好友:我是小3、QEver、非蟲等的熱心指教!