iOS逆向開發(5):微信強制升級的突破 | 多開 | 微信5.0

接下來的幾篇文章,小程以微信爲例,實戰地演示一下:如何注入iOS的APP。其中使用到的知識,基本在前面的文章中都有介紹到。

小白:小程,我想用回舊版本的微信!

小程:爲什麼要用舊版本微信呢?

小白:你不知道,我裝一箇舊版本的可共存的微信,再裝一個最新版本的微信,我就可以同時登陸兩個賬號, 然後就可以在羣裏面互粉裝逼了。但微信5.0版本提示我版本太低,不給用,要升級!你有沒有辦法騙過服務器呢?

本文解決一個問題:讓低版本的微信可以使用。

(1)安裝與運行

在網上搜索微信的歷史版本,下載一個兼容多開的版本(實際上是bundleID不一樣),比如5.0版本。當然也可以通charles等,在AppStore上下載微信舊版本,再重簽名。

通過pp助手之類的工具,把舊版本微信安裝到手機。

啓動微信,登陸賬號,遇到這樣的提示:
微信版本過低

版本過低,無法使用。

問題出現了,那怎麼解決呢?

小程很自然地猜測,客戶端有一個邏輯,是把當前的版本號與服務器返回的版本號作對比,如果發現當前的版本號過低,就提示升級。那麼,當前的版本號是怎麼獲取到的呢,它是不是從一個函數返回的呢?如果小程把這個值改掉會怎麼樣呢?

(2)突破限制

同樣,先要通過classdump拿到微信的所有類的聲明。

然後搜索"version"關鍵字,對可能是返回版本值的函數進行注入,觀察各個地方的輸出。

注入的辦法,用小程上一篇介紹的iOSOpenDev來做即可,而觀察輸出則使用之前介紹的socat。

這裏給出部分注入的代碼的截圖:
注入版本號返回函數

最終可以確認,CUtility::GetVersion就是目標函數,通過一個公共類來返回版本值,這在設計上是很合理的事情了。

運行微信時,可以在系統日誌中看到這樣的輸出:

Oct 18 15:14:46 yeah MicroMessenger[2506] <Warning>: -------CUtility::GetVersion in

Oct 18 15:14:46 yeah MicroMessenger[2506] <Warning>: -------CUtility::GetVersion out, ret=352321792

Oct 18 15:14:46 yeah MicroMessenger[2506] <Warning>: -------MicroMessengerAppDelegate::didFinishLaunchingWithOptions in

其中,352321792就是當前的版本值。

對CUtility::GetVersion這個函數的返回值作修改,嘗試返回452321792(這個值是簡單地把最高位加1而來):
修改版本返回值

再次運行微信,低版本的限制消失了,看到這樣的界面:
正常驗證

身份驗證之後,進入到陳舊的5.0界面:
5.0界面
5.0界面

bundleID是一個APP的唯一標識,比如微信6.x版本的bundleID是這樣的:
微信的bundleID

因爲微信6.x的bundleID與5.0版本的不一樣,這就意味着,同時安裝5.0版本與6.x版本的微信是可行的,比如小程就安裝了兩個(微信多開),運行起來的效果是這樣的(錄製時的幀率有點低,實際上是兩個APP在切換):
微信多開

總結一下,通過classdump拿到類的信息,然後進行猜測與跟蹤注入,用socat觀察輸出,最終鎖定目標函數並完成注入修改,這個過程就是一般的hook過程。重點在於跟蹤與iOSOpenDev注入的使用。


:-)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章