Android"掛逼"修練之行--微信小程式逆向輔助外掛工具開發詳解

編碼美麗發表於2018-05-08
一、前言

之前一篇文章已經詳細介紹了:微信小程式包的格式解析,在之前文章中也瞭解到小程式包存放在沙盒目錄,但是微信為了讓小程式包安全就對檔名做了一個處理,導致我們很難找到對應的小程式對應的包檔案,所以本文就來開發一個輔助外掛,可以檢視微信小程式的appid以及快速找到對應的小程式包檔案,然後利用之前的解析工具直接本地解析程式包即可,下面就開始我們的表演吧!


二、新增小程式選單

首先第一步還是國際慣例,我們如果想暫時小程式的一些資訊包括appid,版本號,本地存放路徑檔名等,那麼如何在微信頁面中展示呢?首先來看一下小程式的頁面:

640?wx_fmt=png

然後我們就開始找到這個佈局選單,新增我們想要的選單資訊了,這個找入口有很多方式,比如可以通過字串資訊反編譯之後去找對應的id值,或者是利用ui工具直接檢視id資訊,這裡我就用這種方式:

640?wx_fmt=png

看到了id是c8p,然後去反編譯微信之後在values/public.xml中查詢這個值,記得是type=id,name=c8p這一項哦:

640?wx_fmt=png

找到之後,把id值轉化成十進位制,然後去Jadx中搜尋吧,這裡要注意的是:微信做了拆包操作,而且微信包很大,直接用Jadx開啟微信會卡死的,所以需要解壓依次開啟它的所有dex檔案即可,然後就是挨個dex中搜這個值即可

640?wx_fmt=png

然後繼續查詢:

640?wx_fmt=png

檢視引用的地方:

640?wx_fmt=png

點選進去檢視定義:

640?wx_fmt=png

然後就來到這個類,用的是RecyclerView控制元件了,這個類應該就是操作初始化底部選單的地方了,我們需要找到這個控制元件的adapter,檢視如何新增選單的,因為拆包導致這個類被分的很開,而這個類有很多內部類,所以我們依次在每個dex中查詢這個包下的這個類以及他的內部類,最終在這個地方看到:

640?wx_fmt=png

這裡就要對android應用開發有點熟練了,應用開發都用過RecyclerView控制元件,他的adapter編寫格式都是統一的,這裡看到及時混淆了,一看大致邏輯就清楚了。不過可惜的是,這個地方有個很大的坑,害得我浪費很多時間:

640?wx_fmt=png

我一直在g類中找a這個方法,但是找了好幾遍都沒找到,結果在smali程式碼中找到了:

640?wx_fmt=png

所以說沒有一個工具是萬能的,千萬別相信任何一個工具。被坑殘了。然後我們看到返回值其實是g類的區域性變數qWf,型別是com.tencent.mm.ui.base.n可以直接搜這個類看看:

640?wx_fmt=png

看到這裡就明白了,這個是微信內部的統一選單類,有一個選單子選項的列表,然後繼續回去看g類的那個變數qWf:

640?wx_fmt=png

看看他在哪裡初始化的:

640?wx_fmt=png

點選進行檢視:

640?wx_fmt=png

好了,在這裡初始化的,所以我們就可以進行hook操作了:

640?wx_fmt=png

hook操作就不多解釋了,很簡單了結合反射即可:

640?wx_fmt=png


注意這裡的選單內容先不要關心,後面會介紹如何獲取小程式的appid和版本號以及儲存路徑的,然後執行模組,檢視新增的選單資訊:

640?wx_fmt=png

到這裡我們就把這三個選單新增好了,第一個選單是為了檢視小程式的appid和版本號資訊,點選可以複製,第二選單是小程式包的儲存路徑資訊,點選可以複製路徑。第三個是解析小程式包原始碼。主要藉助之前介紹的解析小程式包工具。


三、獲取小程式的相關資訊

那麼下面繼續來看如何獲取小程式包的appid,版本號資訊,以及本地儲存的檔案路徑,突破口也很容易獲取,用ui工具檢視當前佈局即可,不過這裡我在介紹新的技巧就是用adb shell dumpsys activity top命令檢視view結構:

640?wx_fmt=png

我們知道WX內部的所有WebView都是自己開發的x5核心,而小程式載入肯定得用WebView的,所以從這找到突破口,然後去Jadx找這個u類,而且在之前分析過了,微信小程式的功能都在com.tencent.mm.plugin.appbrand這個包下面的:

640?wx_fmt=png

看到這個類果然是繼承微信的內部統一WebView,然後無意中發現這個類中有appid欄位了,為什麼我們會按照這思路去找appid呢?因為小程式入口在webview載入的,那麼肯定在這個地方用到了appid了,所以我們的思路沒有問題的,繼續檢視這個欄位的使用:

640?wx_fmt=png

看到這個地方在構造一個webview需要載入的url資訊,看到appid參與其中了,還有一個欄位,其實這個就是小程式的版本號,後面我們會看到。我們可以先hook這個方法看看appid是否能獲取到:

640?wx_fmt=png

這裡做了一個處理,就是把appid分離出來以及版本號,然後儲存到全域性變數中,用於選單顯示使用,我們執行模組,看看執行結果:

640?wx_fmt=png

我們知道小程式的appid都是wx開頭的,這裡可以看到的確拿到了appid值,那麼第二個到底是不是版本號呢?後面會說,先來看看如何獲取小程式包路徑資訊,這裡我們這麼操作,因為我們在之前已經知道了小程式包都是放在這個目錄下:

/data/data/com.tencent.mm/MicroMsg/4d0238658a35658e7bc9597a2de4d49e/appbrand/pkg/

640?wx_fmt=png


我們全域性搜尋wxapkg,看看這個檔名是如何定義的:

640?wx_fmt=png

找到這個地方發現格式和上面看到的檔名很類似,這樣我們直接hook這個方法,看看返回值路徑是什麼,以及傳入的引數是啥:

640?wx_fmt=png

執行模組檢視結果:

640?wx_fmt=png

這裡發現第一個引數就是小程式appid,第二個引數很有可能就是版本號,返回的路徑也是上面我們知道的,那麼有的同學就好奇了,這裡直接hook然後儲存一下路徑不就可以了嗎?其實我們在hook發現,這個方法只有首次載入程式包會呼叫。但是我們想要的效果是每次開啟小程式點選選單都可以看到。如果儲存很不方便。所以這裡我們直接用appid和版本號進行構造,構造方式如下:

640?wx_fmt=png

小程式appid字串的hashCode值和版本號即可。有了之前的固定路徑那麼就可以了。下面再來看一下這個引數到底是不是版本號呢?檢視這個ae方法的呼叫地方:

640?wx_fmt=png


這裡通過欄位名稱就可以看到就是版本號了。所以到這裡我們就把小程式的appid,版本號,路徑構造方法獲取到了,下面操作就簡單了。需要hook上面繼承webview類的u類的aeN方法即可,然後通過分解獲取到appid和版本號,上面已經執行有結果了,這裡不在演示了:

640?wx_fmt=png

看到這個方法是每次開啟小程式都會被呼叫,我們只要做個簡單判斷,有appid和版本號就儲存到全域性變數。然後在開啟選單的時候,把這兩個資訊放到選單中,然後在利用這兩個欄位構造出本地小程式包的路徑放在第二選單中。最後一個選單就是解析小程式了。這裡我們的操作很簡單了,先把沙盒中的wxapkg拷貝到SD卡下的指定目錄,然後在藉助之前寫的解析小程式包工具直接解析即可。


四、新增選單點選事件

下面還有一個問題就是選單的點選事件,這個我們還是要回到之前的g類中以及內部類中進行檢視,最終找到這個類,因為g類和內部類不是很多,按個找dex很快就定位到了:

640?wx_fmt=png

然後我們攔截這個onItemClick方法,處理0,1,2這三個我們新增的選單點選事件即可:

640?wx_fmt=png

這樣我們就處理了三個選單選項的點選事件了,選單名稱使用之前hook成功的appid值和版本號,路徑構造是appid值和版本號,主要說一下最後的解析工作:

640?wx_fmt=png

先把wxapkg包從沙盒中拷貝到SD卡的指定目錄中,然後傳入路徑,開始執行我之前寫的解析小程式包的工具即可。


嚴重說明

本文的意圖只有一個,就是通過分析app學習更多的逆向技術,如果有人利用本文知識和技術進行非法操作進行牟利,帶來的任何法律責任都將由操作者本人承擔和本文作者無任何關係,最終還是希望大家能夠秉著學習的心態閱讀此文。鑑於安全問題,樣本和原始碼都去編碼美麗小密圈自取!點選立即進入小密圈


五、總結

好了到這裡,我們就把整個工具外掛寫完了,我們主要分為三部分:

  • 第一部分:新增選單用於展示小程式的資訊,包括appid,版本號,本地程式包路徑

  • 第二部分:通過分析獲取到小程式的appid,版本號資訊儲存用於第一步的選單內容展示

  • 第三部分:新增子選單的點選事件,路徑和appid點選就是賦值資訊。解析小程式包直接呼叫之前的工具即可

而在這三部分的突破口都是利用介面View分析獲取到的,有兩種方式:一種是藉助UI分析工具,一種是利用adb命令;兩種方式都是可以操作使用的。下面來看看我們操作的效果吧:


640?wx_fmt=gif

複製路徑和appid值


640?wx_fmt=gif

解析程式包到本地


到這裡我們就完成了本次操作,大家可以看到這個外掛對於小白使用者沒啥用途,但是對於我們後續的逆向操作非常有用的,我們如果想逆向哪個小程式,直接解壓看原始碼即可。也可以拷貝到電腦上進行分析更方便了。其實每次寫微信外掛都很費勁的,原因就在於微信包太大了,導致電腦非常的卡頓。所以寫個外掛不容易,喜歡的就點個贊分享吧!


手機檢視文章不方便,可以網頁看

http://www.520monkey.com



《Android應用安全防護和逆向分析》 

360創始人周鴻禕、CSDN創始人蔣濤、看雪創始人段鋼聯袂推薦! 點選檢視圖書詳情

640?wx_fmt=jpeg

長按下面

相關文章