Android逆向分析-通過(guò)UI定位邏輯代碼

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.JEB

3.Apktool

0x01 DDMS抓取界面,分析布局

我們每當(dāng)在微信中點(diǎn)擊聊天室點(diǎn)擊發(fā)送之后,代碼是怎么處理我們輸入的聊天內(nèi)容的呢?為了找到這核心代碼的實(shí)現(xiàn),我們把微信調(diào)整到對(duì)應(yīng)的界面,然后打開(kāi)ddms截取當(dāng)前的界面。

ddms中截取界面按鈕

點(diǎn)擊按鈕等幾秒鐘就會(huì)在ddms中展現(xiàn)屏幕中當(dāng)前的界面


當(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)鍵類(lèi)

使用apktool反編譯apk,并在res/value/public.xml中過(guò)濾出帶有a77關(guān)鍵字的資源id

grep找到button資源id

如上圖,找到了改button的資源id是0x7f1004e3后,我們?cè)谕ㄟ^(guò)adb shell dumpsys activity top命令dump出當(dāng)前界面的布局,并在輸出中搜索7f1004e3關(guān)鍵字就可以找到改控件所屬的類(lèi)了。(tips:在寫(xiě)這篇博客的時(shí)候,我發(fā)現(xiàn)可以在輸出中搜索“id/a77”,不用繞彎再去grep資源id了)

通過(guò)資源id追溯到對(duì)應(yīng)的類(lèi)

可以看到在控件出現(xiàn)的地方,他的上層布局是com.tencent.mm.pluginsdk.ui.chat.ChatFooter,現(xiàn)在只需要在jeb中找到這個(gè)類(lèi)就ok了。

0x03 JEB定位關(guān)鍵代碼位置

定位到關(guān)鍵類(lèi)之后,ctrl+f查找button的響應(yīng)事件方法“setOnClickListener”,會(huì)發(fā)現(xiàn)還是有那么幾個(gè)button讓自己分不清楚,不過(guò)觀察其中OnClick還是能過(guò)濾出來(lái)誰(shuí)是誰(shuí)的響應(yīng)

定位到button的響應(yīng)方法

分析代碼,發(fā)現(xiàn)ChatFooter.j(this.tfO).Bh(v0_2)這個(gè)方法應(yīng)該是處理我們聊天是輸入內(nèi)容的核心方法了。雙擊跟進(jìn)去


不知道怎么命名這張圖

但是發(fā)現(xiàn)這個(gè)類(lèi)是個(gè)接口類(lèi),只要找到其實(shí)現(xiàn)的類(lèi)就能定位到真正的核心代碼了,回歸到剛才Apktool反編譯出來(lái)的文件夾中,過(guò)濾“implements Lcom/tencent/mm/pluginsdk/ui/chat/b”發(fā)現(xiàn)有一個(gè)類(lèi)實(shí)現(xiàn)了這個(gè)接口,JEB跟進(jìn)這個(gè)類(lèi),定位到Bh()方法

grep出來(lái)的接口實(shí)現(xiàn)類(lèi)
接口實(shí)現(xiàn)類(lèi)

就這樣然后一步一跟進(jìn),就可以很清晰的了解點(diǎn)擊“發(fā)送”這個(gè)button之后的控制流程。

0x04 總結(jié)

小白剛接觸android逆向分析,很笨的方法,也繞了很多彎,有很多地方需要改進(jìn),下來(lái)先寫(xiě)個(gè)jeb插件來(lái)找父類(lèi)繼承和接口實(shí)現(xiàn)的類(lèi)(不知道jeb2.0有沒(méi)有這個(gè)功能),如果有志同道合的朋友有好的方法或想法可以分享出來(lái),我在這里先謝過(guò)老鐵。

0x05 新發(fā)現(xiàn)

寫(xiě)完之后沒(méi)事又晃了一圈。發(fā)現(xiàn)拿到了“id/a77”的資源id是0x7f1004e3之后,直接在R類(lèi)里過(guò)濾這個(gè)id值就能找到這個(gè)資源對(duì)應(yīng)的變量名,這里是bud

在R類(lèi)中對(duì)應(yīng)的變量名

然后直接在全文grep出“R$h;->bud”,就可以直接更準(zhǔn)確的定位到了這個(gè)控件正真定義的地方了

over
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,848評(píng)論 25 709
  • 一、前言 今天我們開(kāi)始apk破解的另外一種方式:動(dòng)態(tài)代碼調(diào)試破解,之前其實(shí)已經(jīng)在一篇文章中說(shuō)到如何破解apk了: ...
    JiangWei_App閱讀 3,896評(píng)論 2 29
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,527評(píng)論 19 139
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,311評(píng)論 0 17
  • 在雨季過(guò)后,九月迎來(lái)了一批新的朋友。 炎炎烈日,抵擋不了我的報(bào)國(guó)心。 回想6年前,我也一樣,提著行囊,帶著父母的希...
    翧_閱讀 473評(píng)論 1 0

友情鏈接更多精彩內(nèi)容