您的位置:首頁(yè) > 菜鳥(niǎo)學(xué)院 > 使用調(diào)試器對(duì)安卓APP進(jìn)行安全測(cè)試
1、所需工具
下面列舉了本次攻擊演示所需要的所有工具:
Windows/Mac OS X/Linux Java(推薦1.7版本) IDE(Eclipse,IntelliJ IDEA,Android Studio,三者任選其一) Android SDK(https://developer.android.com/sdk/index.html?hl=i) APKTool(https://code.google.com/p/android-apktool/)或者APK Studio(http://apkstudio.codeplex.com) 安卓設(shè)備/模擬器 Dex2Jar(https://code.google.com/p/dex2jar/) JD-GUI(http://jd.benow.ca/)在這篇博文中,我將使用Windows 8系統(tǒng)、APK Studio和IntelliJ IDEA來(lái)演示。我所使用的安卓手機(jī)是普通的Nexus 4,系統(tǒng)版本是Android 4.4.4。推薦大家將所有工具都添加到path環(huán)境變量中,這樣用起來(lái)比較方便。
2、安卓設(shè)備設(shè)置
接下來(lái)我們就先設(shè)置一下手機(jī),為下面的步驟做好準(zhǔn)備。
設(shè)定開(kāi)發(fā)者選項(xiàng)
首先我們需要做的就是確保我們的安卓手機(jī)啟用了USB調(diào)試功能,這也是我們可以使用Android SDK工具集來(lái)與手機(jī)通信的前提條件。要做到這一點(diǎn),我們需要啟用開(kāi)發(fā)者選項(xiàng)功能。如果你正在運(yùn)行一個(gè)普通的安卓設(shè)備,那么你可以通過(guò)導(dǎo)航到“Settings”=>“About phone”,然后單擊“Build number”,最終手機(jī)應(yīng)該提示開(kāi)發(fā)者選項(xiàng)已啟用。(其實(shí)這里直接進(jìn)行“設(shè)置”=>“開(kāi)發(fā)者選項(xiàng)”=>“開(kāi)啟開(kāi)發(fā)者選項(xiàng)”就可以了。[譯者注])
啟用USB調(diào)試
下一步,我們通過(guò)進(jìn)行“Settings”=>“Developer options”=>”USB debugging”來(lái)訪(fǎng)問(wèn)開(kāi)發(fā)人員選項(xiàng)并啟用USB調(diào)試功能。
通過(guò)USB鏈接手機(jī)和電腦并使用ADB
將手機(jī)與電腦通過(guò)USB數(shù)據(jù)線(xiàn)連接之后,會(huì)提示“USB調(diào)試已經(jīng)連接上設(shè)備”。接下來(lái),我們要確保ADB(安卓調(diào)試橋)可以連接到手機(jī)。ADB是Android SDK工具集內(nèi)包含的一個(gè)軟件工具。我們?cè)赪indows系統(tǒng)控制臺(tái)(cmd)上輸入以下代碼:
adb devices正常情況下將會(huì)出現(xiàn)下圖所示的結(jié)果:
如果你的電腦上沒(méi)有提示上圖中的內(nèi)容,那么很可能是系統(tǒng)中沒(méi)有安裝正確的驅(qū)動(dòng)程序。你需要重新安裝該驅(qū)動(dòng),驅(qū)動(dòng)程序可以從AndroidSDK或者手機(jī)制造商的網(wǎng)站獲得。
3、判斷應(yīng)用可調(diào)試性
當(dāng)調(diào)試安卓應(yīng)用程序的時(shí)候,我們首先要檢查該應(yīng)用程序是否開(kāi)啟了調(diào)試功能?梢酝ㄟ^(guò)以下幾種方法來(lái)檢查是否開(kāi)啟了調(diào)試功能。
第一種方法是打開(kāi)安卓設(shè)備監(jiān)視器(Eclipse中的是DDMS),我們可以在設(shè)備區(qū)域窗口中看到我們的設(shè)備列表。
如果安卓手機(jī)里面的某個(gè)應(yīng)用設(shè)置為可調(diào)試,那么該應(yīng)用程序會(huì)出現(xiàn)在該列表中。在這里我創(chuàng)建了一個(gè)測(cè)試應(yīng)用程序,我們可以看到該程序并沒(méi)有出現(xiàn)在該列表中,表明該程序我設(shè)置為了不可調(diào)試。
第二種方法是,我們可以通過(guò)檢查APK文件中的AndroidManifest.xml文件來(lái)確定應(yīng)用是否可以調(diào)試。APK文件本質(zhì)上是一個(gè)包含應(yīng)用所有信息的zip壓縮文件。
如果你沒(méi)有目標(biāo)應(yīng)用的APK文件,那么就必須先從手機(jī)中導(dǎo)出該APK文件。每當(dāng)我們從Google Play 商店中下載應(yīng)用時(shí),系統(tǒng)都自動(dòng)下載了該應(yīng)用的APK文件,并將其存儲(chǔ)在了安卓設(shè)備上。這些APK文件的位置通常在手機(jī)中/data/app目錄下。如果你的手機(jī)還沒(méi)有root過(guò),可能你將不能查看該目錄下的文件。然而,如果你知道目標(biāo)APK的名字,那么也可以通過(guò)adb工具將該APK文件轉(zhuǎn)存到電腦中。為了查找目標(biāo)APK文件,我們可以打開(kāi)一個(gè)Windows shell并輸入以下指令:
adb shell這時(shí)將產(chǎn)生一個(gè)連接安卓設(shè)備的shell,然后輸入:
pm listpackages –f這條指令將列出安卓設(shè)備上所有應(yīng)用的安裝包。
通過(guò)查看結(jié)果列表,我們就能找到目標(biāo)應(yīng)用。
接下來(lái),需要將該APK文件導(dǎo)入到電腦中。為此,我們需要新打開(kāi)一個(gè)shell并輸入以下指令:
adb pull/data/app/[.apk file] [location]
到這里,我們已經(jīng)得到了目標(biāo)APK文件。然后我們將打開(kāi)該文件并檢查里面的AndroidManifest.xml文件。不幸的是,我們不能直接解壓該APK并查看xml文件,因?yàn)樗墙?jīng)過(guò)二進(jìn)制編碼處理過(guò)的,所以首先必須解碼才可以。目前針對(duì)該問(wèn)題最受歡迎的工具是apktool。不過(guò),最近我一直在使用APK Studio軟件,因?yàn)樗幸粋(gè)易于操作的友好界面。所以,在接下來(lái)的演示中我都使用APK Studio。
為了開(kāi)始使用APK Studio,單擊綠色的安卓小圖標(biāo)。然后在彈出的窗口中填寫(xiě)項(xiàng)目名稱(chēng)并選擇待分析的APK文件,最后設(shè)置文件保存的位置。
打開(kāi)APK文件之后,選擇AndroidManifest.xml文件,然后查找該應(yīng)用的節(jié)點(diǎn)。如果該文件中沒(méi)有“android:debuggable”標(biāo)記,那么說(shuō)明該APK文件是不可調(diào)試的。如果有一個(gè)標(biāo)記為‘a(chǎn)ndroid:debuggable=”false”’,同樣說(shuō)明該APK文件是不可調(diào)試的。
4、修改AndroidManifest.xml文件開(kāi)啟應(yīng)用調(diào)試功能
apktool和APK Studio比較好的一點(diǎn)是,可以編輯任何反編譯的APK文件并重新編譯它們。接下來(lái),我們通過(guò)添加“android:debuggable”標(biāo)記來(lái)啟用該應(yīng)用的調(diào)試功能。編輯AndroidManifest.xml文件,然后在里面添加‘a(chǎn)ndroid:debuggable=”true”’。
添加該標(biāo)記之后,通過(guò)單擊菜單上的錘子圖標(biāo)重新創(chuàng)建APK文件。我們重建的APK文件會(huì)被保存在build/apk目錄中。
重建的APK文件只有在簽名之后才能夠安裝到設(shè)備上。所有的安卓應(yīng)用都需要簽名,但大多數(shù)應(yīng)用程序并不檢查它們是否是用原始的證書(shū)進(jìn)行簽名的。如果此時(shí)應(yīng)用程序檢查了證書(shū)的原始性,那么直接簽名可能就沒(méi)效果了,除非我們同時(shí)也編輯了驗(yàn)證數(shù)字證書(shū)的相關(guān)代碼。
接下來(lái),我們需要安裝剛剛重建的APK文件。首先,卸載手機(jī)中原有的應(yīng)用程序。然后使用adb重新安裝重建的APK文件,輸入以下指令:
adbinstall [.apk file]
然后檢查并確保重新安裝的應(yīng)用在安卓設(shè)備上正確地運(yùn)行。如果一切正常,那么我們回到安卓設(shè)備監(jiān)視器界面并刷新一下,此時(shí)可以看到我們的應(yīng)用已經(jīng)顯示在列表中了。
5、IDE準(zhǔn)備
既然現(xiàn)在我們的應(yīng)用已經(jīng)可以調(diào)試了,那么接下來(lái)可以將調(diào)試器附加在它上面。在做這之前,我們需要設(shè)置一下IDE。在這篇博文中,我使用IntelliJ IDEA。首先,我創(chuàng)建一個(gè)新的安卓項(xiàng)目,該項(xiàng)目名字可以隨意取,但是包名字必須跟APK文件的包結(jié)構(gòu)相同。
以上這些都很容易實(shí)現(xiàn)。但是,如果你還不確定,可以查看下APK Studio中該APK文件的包結(jié)構(gòu)。對(duì)于我的這個(gè)應(yīng)用來(lái)說(shuō),包結(jié)構(gòu)就是APK的名字“com.netspi.egruber.test”?梢栽贏PK Studio中查看如下圖所示。
取消選中“Create HelloWorld Activity”項(xiàng),其它的地方使用默認(rèn)設(shè)置,這就完成了項(xiàng)目的創(chuàng)建。此時(shí),你的項(xiàng)目結(jié)構(gòu)看起來(lái)應(yīng)該是這樣:
現(xiàn)在已經(jīng)創(chuàng)建好了項(xiàng)目,就可以將APK文件的源代碼導(dǎo)入到該項(xiàng)目中。我們之所以要這么做,是因?yàn)檎{(diào)試器知道關(guān)于該應(yīng)用的所有符號(hào)名字、方法、變量等信息。安卓應(yīng)用程序比較好的一點(diǎn)是,它們可以輕松地通過(guò)反編譯來(lái)得到正確的java源代碼。接下來(lái)我們就需要這么做,然后將源代碼導(dǎo)入到IDE項(xiàng)目中。
6、Dump apk文件并反編譯得到源代碼
首先,為了得到源代碼,需要將APK文件轉(zhuǎn)換到j(luò)ar文件。然后,可以使用一個(gè)java反編譯器來(lái)恢復(fù)到j(luò)ava源代碼,我們使用dex2jar工具來(lái)進(jìn)行此步驟。Dex2jar包含一個(gè)d2j-dex2jar.bat文件,通過(guò)執(zhí)行該文件就可以將APK文件轉(zhuǎn)換成jar文件。它的語(yǔ)法很簡(jiǎn)單:
d2j-dex2jar.bat[.apk file]
到這里,你應(yīng)該得到了一個(gè)jar文件。下一步,我們將使用工具JD-GUI來(lái)打開(kāi)該jar文件。
現(xiàn)在你應(yīng)該可以看到j(luò)ar文件的包結(jié)構(gòu)啦,包里面都是可讀的java源代碼文件。接下來(lái)我們通過(guò)選擇“文件”=>“保存所有文件”來(lái)將源代碼保存為一個(gè)zip文件。
保存源代碼之后,將其解壓到當(dāng)前目錄中。
現(xiàn)在我們需要將這兩個(gè)目錄導(dǎo)入到之前創(chuàng)建的安卓項(xiàng)目中。對(duì)于IntelliJ IDEA來(lái)說(shuō),進(jìn)入到項(xiàng)目的src文件夾并將這兩個(gè)目錄粘貼到這里。
在IntelliJ中,如果我們返回到項(xiàng)目中,則項(xiàng)目結(jié)構(gòu)將會(huì)刷新。
單擊其中一個(gè)導(dǎo)入的活動(dòng)文件將會(huì)在右邊的窗口中顯示該文件中的源代碼。在下面的截圖中可以看到,我導(dǎo)入的源代碼是使用ProGuard混淆過(guò)的。
7、附加調(diào)試器
現(xiàn)在我們的項(xiàng)目中已經(jīng)填充了應(yīng)用程序的源代碼,我們就可以開(kāi)始設(shè)置斷點(diǎn)。在這個(gè)例子中,我在一個(gè)方法處設(shè)置一個(gè)斷點(diǎn),當(dāng)向一個(gè)文本輸入框中輸入內(nèi)容的時(shí)候程序就會(huì)調(diào)用該方法。即使代碼是經(jīng)過(guò)混淆過(guò)的,也可以正常工作。
設(shè)置斷點(diǎn)后,單擊主界面右上角的小屏幕圖標(biāo)彈出安卓設(shè)備中的進(jìn)程列表,該列表只列出可以調(diào)試的進(jìn)程,然后單擊目標(biāo)進(jìn)程將調(diào)試器附加到該進(jìn)程。當(dāng)然,不同的IDE對(duì)應(yīng)的功能圖標(biāo)不同。
選中目標(biāo)進(jìn)程之后,調(diào)試器就連接到了安卓設(shè)備。
在我測(cè)試的應(yīng)用中,我將向文本輸入框中輸入數(shù)字42,別忘了之前我們?cè)谶@里設(shè)置了斷點(diǎn)。
在單擊“Enter Code”按鍵后,進(jìn)程執(zhí)行到斷點(diǎn)處時(shí)會(huì)暫停。之所以這樣能夠正常工作,原因是調(diào)試器知道在安卓設(shè)備上該調(diào)用什么程序。編譯后的安卓應(yīng)用中包含了調(diào)試信息,例如變量名字,任何理解java調(diào)試線(xiàn)協(xié)議(JDWP)的調(diào)試器都可以識(shí)別這些信息。如果一個(gè)安卓應(yīng)用允許調(diào)試,那么一個(gè)兼容JDWP的調(diào)試器,例如大多數(shù)的Java IDE,將能夠連接安卓虛擬機(jī)并讀取和執(zhí)行調(diào)試指令。
此時(shí),我們就能夠在變量區(qū)域窗中查看到我們向應(yīng)用中輸入的內(nèi)容。
8、結(jié)論
在這里,我們不僅能夠從應(yīng)用中讀取數(shù)據(jù),而且還能夠插入自己的數(shù)據(jù)。如果我們想中斷程序流程或者繞過(guò)邏輯判斷,那么本文中的方法將可以起到作用。通過(guò)調(diào)試,我們可以更好地理解安卓應(yīng)用如何執(zhí)行某些操作。尤其是當(dāng)我們需要查看加密功能是如何使用,或者確定動(dòng)態(tài)密鑰的值時(shí),該方法將可以派上用場(chǎng)。當(dāng)調(diào)試函數(shù)與文件系統(tǒng)或者數(shù)據(jù)庫(kù)進(jìn)行交互時(shí),此方法也能幫助我們查看信息是如何存儲(chǔ)的。最主要的是,不需要root權(quán)限,我們就能在安卓設(shè)備上執(zhí)行這種類(lèi)型的測(cè)試。
國(guó)產(chǎn)工具PKAV HTTP Fuzzer滲透測(cè)試助手最新發(fā)布
閱讀FireEye:11.2%的移動(dòng)APP仍存在FREAK漏洞
閱讀惠普漏洞:惠普ArcSight企業(yè)安全系列產(chǎn)品曝高危安全漏洞
閱讀騰訊、360各顯神通,分別秒殺IE、Flash、PDF項(xiàng)目
閱讀蘋(píng)果Mac OS X系統(tǒng)被發(fā)現(xiàn)存在DLL劫持漏洞
閱讀金融行業(yè)平臺(tái)的針對(duì)性防御滲透測(cè)試
閱讀D-Link(友訊)路由器曝遠(yuǎn)程文件上傳及命令注入漏洞(已發(fā)布安全更新)
閱讀Win10將使用P2P進(jìn)行系統(tǒng)更新,引發(fā)安全擔(dān)憂(yōu)
閱讀美國(guó)最大的無(wú)卡ATM網(wǎng)絡(luò)即將推出,從此告別刷卡!
閱讀谷歌應(yīng)用漏洞泄漏超過(guò)28萬(wàn)條私人WHOIS數(shù)據(jù)
閱讀使命召喚、魔獸世界、英雄聯(lián)盟……專(zhuān)攻游戲的勒索軟件TeslaCrypt
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)