0x00 前言
在逆向分析apk的某項(xiàng)功能的時(shí)候畴蒲,最關(guān)鍵的就是在反編譯工具中定位它的邏輯代碼。通常,我是通過(guò)應(yīng)用暴露出來(lái)的一些字符串(dialog提示烦粒、http\https中的url)去grep 反編譯出來(lái)的smali或者使用jeb工具的字符串搜索功能,不過(guò)這樣過(guò)濾下來(lái)通常還是離核心代碼有時(shí)很遠(yuǎn)有時(shí)很近代赁,經(jīng)常需要花時(shí)間再回溯上去扰她。隨著對(duì)業(yè)務(wù)功能的近一步分析,這樣的方法有點(diǎn)捉襟見(jiàn)肘芭碍,所以想找一個(gè)更直觀的方法去定位核心代碼位置徒役。
這里通過(guò)分析微信的聊天功能來(lái)記錄這個(gè)方法。需要用到的工具有:
1. Android Studio(ddms)
2.apktool
3.Apktool
0x01 DDMS抓取界面窖壕,分析布局
Mac下新版 Android Studio 打開(kāi) DDMS 方式
// Users/wu/Library/Android/sdk 表示 android sdk安裝路徑
cd /Users/wu/Library/Android/sdk/tools
./monitor
我們每當(dāng)在微信中點(diǎn)擊聊天室點(diǎn)擊發(fā)送之后忧勿,代碼是怎么處理我們輸入的聊天內(nèi)容的呢杉女?為了找到這核心代碼的實(shí)現(xiàn),我們把微信調(diào)整到對(duì)應(yīng)的界面鸳吸,然后打開(kāi)ddms截取當(dāng)前的界面熏挎。
點(diǎn)擊按鈕等幾秒鐘就會(huì)在ddms中展現(xiàn)屏幕中當(dāng)前的界面
拿到了當(dāng)前界面的布局解析之后,定位發(fā)送按鈕晌砾,在右側(cè)表格中可以看到該button的resource-id是com.tencet.mm:id/a77坎拐。接下來(lái),我們可以通過(guò)這個(gè)button的響應(yīng)事件來(lái)跟蹤微信是如何處理我們要發(fā)送的消息的养匈。
0x02 Apktool+adb 定位關(guān)鍵類
使用apktool反編譯apk哼勇,并在res/value/public.xml中過(guò)濾出帶有a77關(guān)鍵字的資源id
如上圖,找到了改button的資源id是0x7f1004e3后呕乎,我們?cè)谕ㄟ^(guò)adb shell dumpsys activity top命令dump出當(dāng)前界面的布局,并在輸出中搜索7f1004e3關(guān)鍵字就可以找到改控件所屬的類了积担。(tips:在寫(xiě)這篇博客的時(shí)候,我發(fā)現(xiàn)可以在輸出中搜索“id/a77”楣嘁,不用繞彎再去grep資源id了)
可以看到在控件出現(xiàn)的地方磅轻,他的上層布局是com.tencent.mm.pluginsdk.ui.chat.ChatFooter,現(xiàn)在只需要在jeb中找到這個(gè)類就ok了逐虚。
0x03 JEB定位關(guān)鍵代碼位置
定位到關(guān)鍵類之后聋溜,ctrl+f查找button的響應(yīng)事件方法“setOnClickListener”,會(huì)發(fā)現(xiàn)還是有那么幾個(gè)button讓自己分不清楚,不過(guò)觀察其中OnClick還是能過(guò)濾出來(lái)誰(shuí)是誰(shuí)的響應(yīng)
分析代碼叭爱,發(fā)現(xiàn)ChatFooter.j(this.tfO).Bh(v0_2)這個(gè)方法應(yīng)該是處理我們聊天是輸入內(nèi)容的核心方法了撮躁。雙擊跟進(jìn)去
但是發(fā)現(xiàn)這個(gè)類是個(gè)接口類,只要找到其實(shí)現(xiàn)的類就能定位到真正的核心代碼了买雾,回歸到剛才Apktool反編譯出來(lái)的文件夾中把曼,過(guò)濾“implements Lcom/tencent/mm/pluginsdk/ui/chat/b”發(fā)現(xiàn)有一個(gè)類實(shí)現(xiàn)了這個(gè)接口,JEB跟進(jìn)這個(gè)類漓穿,定位到Bh()方法
就這樣然后一步一跟進(jìn)嗤军,就可以很清晰的了解點(diǎn)擊“發(fā)送”這個(gè)button之后的控制流程。
0x04 總結(jié)
小白剛接觸android逆向分析晃危,很笨的方法叙赚,也繞了很多彎,有很多地方需要改進(jìn)僚饭,下來(lái)先寫(xiě)個(gè)jeb插件來(lái)找父類繼承和接口實(shí)現(xiàn)的類(不知道jeb2.0有沒(méi)有這個(gè)功能)震叮,如果有志同道合的朋友有好的方法或想法可以分享出來(lái),我在這里先謝過(guò)老鐵鳍鸵。
0x05 新發(fā)現(xiàn)
寫(xiě)完之后沒(méi)事又晃了一圈苇瓣。發(fā)現(xiàn)拿到了“id/a77”的資源id是0x7f1004e3之后,直接在R類里過(guò)濾這個(gè)id值就能找到這個(gè)資源對(duì)應(yīng)的變量名偿乖,這里是bud
然后直接在全文grep出“R$h;->bud”击罪,就可以直接更準(zhǔn)確的定位到了這個(gè)控件正真定義的地方了
作者:老江_
鏈接:http://www.reibang.com/p/ea45509e2e24