AndroidStudio無(wú)源碼動(dòng)態(tài)調(diào)試apk

其實(shí)說(shuō)白了就是AndroidStudio動(dòng)態(tài)調(diào)試Smali,一直在用的方法,挺有效的逆向分析方法。把a(bǔ)pk反編譯成Smali然后倒入AndroidStudio中剩盒,然后通過(guò)jdwp調(diào)試相關(guān)進(jìn)程。

基本技能

  • 會(huì)使用AndroidStudio的debug的功能慨蛙,不會(huì)的看這里
  • 能夠理解簡(jiǎn)單的Smali語(yǔ)法看這里
  • 能夠使用apktool反編譯apk辽聊,并且重新打包,不會(huì)的看這里

工具

  • AndroidStudio 最好是最新版本期贫,我用的是2.3 最近好像3.0的正式版出來(lái)了
  • smaliidea-x.x.x.zip這個(gè)是AndroidStudio的插件跟匆,從這個(gè)鏈接的列表中下載那個(gè),最新版本的zip文件插件的官網(wǎng)
  • apktool 反編譯apk->Smali 并且重新打包修改后的Smali到apk
  • jadx 用了查看Smali對(duì)應(yīng)的java代碼,增加可讀性

插件安裝:上面那個(gè)zip包下載完成后通砍,打開(kāi)AndroidStudio選擇
Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 選擇 smalidea.x.x.x.zip 插件 ->重啟 -> 插件就安裝好了玛臂。

動(dòng)態(tài)調(diào)試Smali文件

1. 調(diào)試的前提條件 使app可調(diào)試

開(kāi)發(fā)過(guò)Android的都知道烤蜕,要想調(diào)試一個(gè)apk的前提是這個(gè)apk是可調(diào)式,一般我們發(fā)版的時(shí)候迹冤,會(huì)發(fā)release版讽营。(在一開(kāi)始的時(shí)候,我們開(kāi)發(fā)Android是沒(méi)有g(shù)radle的泡徙,那時(shí)候發(fā)release版不像現(xiàn)在在gradle配置好就行了橱鹏,是直接操作AndroidManifest.xml文件中 <application>標(biāo)簽的 屬性 android:debuggable="true")因?yàn)樵?strong>一般的手機(jī)上,release版本的應(yīng)用是不可以被調(diào)試的堪藐,相對(duì)來(lái)說(shuō)起到了保護(hù)app的作用莉兰。

上面說(shuō)了是在一般的手機(jī)上,從上面來(lái)看庶橱,可以在AndroidManifest文件中設(shè)置debuggable開(kāi)關(guān)贮勃,那么這個(gè)開(kāi)關(guān)是被誰(shuí)來(lái)驗(yàn)證的呢?答案是系統(tǒng)苏章,Android系統(tǒng)會(huì)通過(guò)debuggable 驗(yàn)證一個(gè)app是不是可以調(diào)試寂嘉。可以不可以關(guān)掉系統(tǒng)的驗(yàn)證枫绅?答案是可以的泉孩。不過(guò)很麻煩,據(jù)說(shuō)有兩種方式可以修改并淋,一種是重新刷入boot.img 修改方法,另一種是通過(guò)xpost修改寓搬。

而我們平常用的最多的就是,修改AndroidManifest.xml 中的android:debuggable="true"县耽,然后重新打包apk句喷。

逆向工程不是普通的反編譯,一般來(lái)說(shuō)逆向都是帶有目的的兔毙。我們拿最近我用到的WPS 的Android版(WPSOffice_206.apk)來(lái)測(cè)試唾琼,在這里不討論逆向的目的。我們來(lái)處理這個(gè)apk澎剥,使它可以被被debug锡溯。

  • 首先 通過(guò)apktool d WPSOffice_206.apk來(lái)反編譯
  • 然后 在生成的目錄中找到AndroidManifest.xml,用AS或者文本編輯器打開(kāi)修改里面的<application>標(biāo)簽,如果有debuggable屬性哑姚,修改為true祭饭,如果沒(méi)有,給<application>標(biāo)簽添加android:debuggable="true"
  • 最后 apktool b WPSOffice_206 這時(shí)候會(huì)在./WPSOffice_206/dist目錄下生成重新打包好的apk叙量。(注意這個(gè)地方會(huì)出現(xiàn)重新打包的錯(cuò)誤倡蝙,文章最后給出解決方法)然后要給這個(gè)apk簽名。文章開(kāi)始給出的相應(yīng)的文章宛乃。
  • 然后我們把這個(gè)自簽名后的apk安裝到手機(jī)就可以了

2. 導(dǎo)入Smail源碼到AndroidStudio中

打開(kāi)as后悠咱,通過(guò)File-->Open ...選擇我們剛才反編譯處理的那個(gè)目錄蒸辆,WPSOffice_206,然后等待as建立完索引析既。
注意左側(cè)選擇Project視圖躬贡,如下所示:

2.0-Project視圖.png

然后右鍵工程主目錄:Mark Directory As -> Sources Root

2.1-SourcesRoot視圖.png

然后設(shè)置sdk,最后和測(cè)試手機(jī)的系統(tǒng)版本一致:項(xiàng)目目錄-->右鍵-->Open ModuleSettings:

2.3-設(shè)置sdk.png

3. Android Studio 的配置

接下來(lái)配置:Run/Debug Configurations里面的配置文件:

3.0-配置文件入口.png

打開(kāi)后我們點(diǎn)擊上面的+符合眼坏,然后選擇Remote拂玻,添加一個(gè)遠(yuǎn)程調(diào)試如下圖:

3.1-添加remote調(diào)試.png

然后配置遠(yuǎn)程調(diào)試的端口和一些其他信息,如下圖:

3.2-配置遠(yuǎn)程調(diào)試端口.png

注意宰译,上面的Name可以隨便寫檐蚜,因?yàn)槊恳粋€(gè)Remote配置都對(duì)應(yīng)手機(jī)app上的一個(gè)進(jìn)程,每一個(gè)手機(jī)app可能有多個(gè)進(jìn)程沿侈,所有名字上我們做下區(qū)分闯第。另一個(gè)需要配置的地方是Port,這個(gè)port也可以隨便寫缀拭,只要當(dāng)前電腦上沒(méi)有是用這個(gè)端口就好咳短,如果要同時(shí)調(diào)試手機(jī)上的某個(gè)app的多個(gè)進(jìn)程,這個(gè)每次配置Remote的時(shí)候蛛淋,port不能一樣咙好。我們這里是用默認(rèn)的5005。

4. 打通AndroidStudio和可調(diào)試apk之間的通道

手機(jī)上已經(jīng)安裝了我們前面重新打包的可調(diào)試的wps的apk褐荷。運(yùn)行它

4.1 查看wps的所有的進(jìn)程信息

然后命令行運(yùn)行adb shell ps | grep cn.wps.moffice_eng

4.1-查看當(dāng)前WPS的進(jìn)程.png

4.2 判斷你要debug的那個(gè)頁(yè)面(Activity)在哪個(gè)進(jìn)程里面

首先打開(kāi)這個(gè)頁(yè)面勾效,然后命令行運(yùn)行:
adb shell dumpsys activity | grep mFocusedActivity
這會(huì)得到當(dāng)前顯示的Activity的名字,然后去AndroidManifest.xml中去查看這個(gè)Activity的信息叛甫,里面會(huì)有進(jìn)程信息层宫。

4.3 端口映射

adb forward tcp:5005 jdwp:29685

設(shè)置端口轉(zhuǎn)發(fā),這條命令的含義可以認(rèn)為是在本地5005端口與手機(jī)29685進(jìn)程之間建立一條通道其监,當(dāng)開(kāi)始調(diào)試時(shí)卒密,AS連接本地的5005端口,通過(guò)這條通道控制程序的運(yùn)行棠赛。這個(gè)5005是前面(圖3.2)中配置的端口,這個(gè)29685是wps在手機(jī)上運(yùn)行的一個(gè)進(jìn)程的進(jìn)程id膛腐。(圖4.1)中獲取的睛约。

關(guān)于 adb (包括adbd,adb-Client adb-Server )中的端口映射的可以看這篇文章http://www.cnblogs.com/gordon0918/p/5570811.html哲身,端口映射可以省略辩涝,在ddms中選中要調(diào)試的進(jìn)程,ddms會(huì)附加一個(gè)8700端口勘天。

4.4 下斷點(diǎn)

這個(gè)隨便下怔揩,和平常一樣捉邢,只要下到你想要程序暫停的地方就好,我們把斷點(diǎn)下到wps的首頁(yè)商膊,通過(guò)adb shell dumpsys activity | grep mFocusedActivity這個(gè)命令可知道首頁(yè)叫cn.wps.moffice.main.local.HomeRootActivity伏伐。

4.4.1-測(cè)試斷點(diǎn).png

注:這里把斷點(diǎn)下到了首頁(yè)的onResume方法中是為了測(cè)試用,因?yàn)閛nResume方法會(huì)被調(diào)用很多次晕拆,當(dāng)我們按home鍵藐翎,然后在打開(kāi)wps的時(shí)候這個(gè)方法就會(huì)被調(diào)用。不說(shuō)了实幕,如果連onResume的調(diào)用時(shí)機(jī)都不知道還搞什么逆向吝镣。

4.5 啟動(dòng)debug

4.5-啟動(dòng)調(diào)試.png

首先選擇要調(diào)試的配置末贾,然后點(diǎn)擊那個(gè)調(diào)試按鈕掂为。如果左下角出現(xiàn)下圖說(shuō)明啟動(dòng)成功:

4.5-啟動(dòng)調(diào)試成功.png

試試打開(kāi)個(gè)別的應(yīng)用欲诺,然后再切回wps蛹含,這時(shí)候程序會(huì)停在斷點(diǎn)處祠锣。

5 舉個(gè)例子

舉個(gè)例子:以WPS的創(chuàng)建ppt為例,我們來(lái)把斷點(diǎn)打到創(chuàng)建ppt上糕珊,然后調(diào)試這個(gè)ppt的創(chuàng)建流程留特。

我們打開(kāi)WPS后右核,右下角有個(gè)很大的紅色加號(hào)菱鸥,點(diǎn)擊這個(gè)后會(huì)有創(chuàng)建選項(xiàng)染苛,我們選中創(chuàng)建PPT躯概,然后選擇新建空白文檔姿锭。會(huì)看到如下圖所示

5.1-wps創(chuàng)建ppt.png

這個(gè)時(shí)候我們運(yùn)行adb shell dumpsys activity | grep mFocusedActivity
會(huì)得到

mFocusedActivity: ActivityRecord{50a4e0a u0 cn.wps.moffice_eng/cn.wps.moffice.presentation.multiactivity.Presentation1 t306}

還是截圖來(lái)看吧:

5.2.1-獲取棧頂wps.png

現(xiàn)在拿到這個(gè)Activity的名字了艾凯,我們?cè)賮?lái)看這個(gè)Activity在哪個(gè)進(jìn)程里面,這就需要通過(guò)AndroidManifest.xml了懂傀。

        <activity android:name="cn.wps.moffice.presentation.multiactivity.Presentation1"
            android:configChanges="fontScale|keyboard|keyboardHidden|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
            android:hardwareAccelerated="true" android:icon="@drawable/public_icon_activity_ppt"
            android:label="@string/activity_label_ppt" android:launchMode="singleTask"
            android:process=":presentation1" android:taskAffinity="cn.wps.moffice_eng.presentation1"
            android:theme="@style/PptTheme"
            android:windowSoftInputMode="adjustNothing|stateHidden" />

看到android:process的值了沒(méi)跃巡,就是這個(gè)Activity所在的進(jìn)程枣察。然后我們拿大這個(gè)進(jìn)程號(hào)就可以調(diào)試了笛粘。

命令行運(yùn)行adb shell ps | grep cn.wps.moffice_eng如下圖:

5.2.2-wps創(chuàng)建ppt的進(jìn)程信息.png

然后配置debug config

5.3-pptdebug配置.png

設(shè)置端口轉(zhuǎn)發(fā):
adb forward tcp:5006 jdwp:31333

然后運(yùn)行debug:

5.4-運(yùn)行ppt debug.png

運(yùn)行成功視圖:

5.5-運(yùn)行ppt debug結(jié)果.png

這是后在點(diǎn)擊創(chuàng)建一個(gè)ppt外臂,然后程序就會(huì)在斷點(diǎn)處暫停如下圖:

5.6-調(diào)試創(chuàng)建ppt成功示意圖.png

剩下的調(diào)試面板的使用和普通的Android調(diào)試一樣,前面給出的文章已經(jīng)有啦犀斋。通過(guò)這個(gè)調(diào)試面板可以跟蹤變量贝乎,查看調(diào)用堆棧,類之間的跳轉(zhuǎn)叽粹。等等非常有用览效。

最后一個(gè)bug處理

在修改完 wps的 AndroidManifest.xml 然后執(zhí)行apktool b WPSOffice_206的時(shí)候。apktool會(huì)拋出下面的錯(cuò)誤:

981B2FE0-3916-4AA3-B090-96E924A5A341.png

可以看到打了一大堆亂七八糟的log虫几,其實(shí)都沒(méi)用锤灿,只看第一行就行,說(shuō)在 AndroidManifest.xml 的第61行有個(gè)不能被識(shí)別的資源標(biāo)識(shí)符'resizeableActivity'辆脸,打開(kāi)AndroidManifest.xml 然后全局搜下這個(gè)字符串:

屏幕快照 2017-10-27 15.50.52.png

這玩意不知道有啥用但校,把這個(gè)屬性刪了就行,好像是為了簡(jiǎn)單組織重打包的一個(gè)混淆操作啡氢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末状囱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子倘是,更是在濱河造成了極大的恐慌亭枷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀崭,死亡現(xiàn)場(chǎng)離奇詭異叨粘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)门坷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門宣鄙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人默蚌,你說(shuō)我怎么就攤上這事冻晤。” “怎么了绸吸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵鼻弧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锦茁,道長(zhǎng)攘轩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任码俩,我火速辦了婚禮度帮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己笨篷,他們只是感情好瞳秽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著率翅,像睡著了一般练俐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冕臭,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天腺晾,我揣著相機(jī)與錄音,去河邊找鬼辜贵。 笑死悯蝉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的念颈。 我是一名探鬼主播泉粉,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榴芳!你這毒婦竟也來(lái)了嗡靡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窟感,失蹤者是張志新(化名)和其女友劉穎讨彼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柿祈,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哈误,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躏嚎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜自。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卢佣,靈堂內(nèi)的尸體忽然破棺而出重荠,到底是詐尸還是另有隱情,我是刑警寧澤虚茶,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布戈鲁,位于F島的核電站,受9級(jí)特大地震影響嘹叫,放射性物質(zhì)發(fā)生泄漏婆殿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一罩扇、第九天 我趴在偏房一處隱蔽的房頂上張望婆芦。 院中可真熱鬧,春花似錦、人聲如沸寞缝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荆陆。三九已至,卻和暖如春集侯,著一層夾襖步出監(jiān)牢的瞬間被啼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工棠枉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浓体,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓辈讶,卻偏偏與公主長(zhǎng)得像命浴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贱除,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容