問:我想用回舊版本的微信!
答:為什麼要用舊版本微信呢?
問:你不知道,我裝一個舊版本的可共存的微信,再裝一個最新版本的微信,我就可以同時登陸兩個賬号, 然後就可以在群裡面互粉裝逼了。但微信5.0版本提示我版本太低,不給用,要升級!有沒有辦法騙過微信的服務器呢?
本文解決一個問題:讓低版本的微信可以使用。
(1)安裝與運行
在網上搜索微信的曆史版本,下載一個兼容多開的版本(實際上是bundleID不一樣),比如5.0版本。當然也可以通charles等,在AppStore上下載微信舊版本,再重簽名。
通過pp助手之類的工具,把舊版本微信安裝到手機。
啟動微信,登陸賬号,遇到這樣的提示:
版本過低,無法使用。
問題出現了,那怎麼解決呢?
小程很自然地猜測,客戶端有一個邏輯,是把當前的版本号與服務器返回的版本号作對比,如果發現當前的版本号過低,就提示升級。那麼,當前的版本号是怎麼獲取到的呢,它是不是從一個函數返回的呢?如果小程把這個值改掉會怎麼樣呢?
(2)突破限制
同樣,先要通過classdump拿到微信的所有類的聲明。
然後搜索"version"關鍵字,對可能是返回版本值的函數進行注入,觀察各個地方的輸出。
注入的辦法,用小程上一篇介紹的iOSOpenDev來做即可,而觀察輸出則使用之前介紹的socat。
這裡給出部分注入的代碼的截圖:
最終可以确認,CUtility::GetVersion就是目标函數,通過一個公共類來返回版本值,這在設計上是很合理的事情了。
運行微信時,可以在系統日志中看到這樣的輸出:
Oct 18 15:14:46 yeah MicroMessenger[2506] : -------CUtility::GetVersion in
Oct 18 15:14:46 yeah MicroMessenger[2506] : -------CUtility::GetVersion out, ret=352321792
Oct 18 15:14:46 yeah MicroMessenger[2506] : -------MicroMessengerAppDelegate::didFinishLaunchingWithOptions in
其中,352321792就是當前的版本值。
對CUtility::GetVersion這個函數的返回值作修改,嘗試返回452321792(這個值是簡單地把最高位加1而來):
再次運行微信,低版本的限制消失了,看到這樣的界面:
身份驗證之後,進入到陳舊的5.0界面:
bundleID是一個APP的唯一标識,比如微信6.x版本的bundleID是這樣的:
因為微信6.x的bundleID與5.0版本的不一樣,這就意味着,同時安裝5.0版本與6.x版本的微信是可行的,比如小程就安裝了兩個(微信多開),運行起來的效果是這樣的(錄制時的幀率有點低,實際上是兩個APP在切換):
總結一下,通過classdump拿到類的信息,然後進行猜測與跟蹤注入,用socat觀察輸出,最終鎖定目标函數并完成注入修改,這個過程就是一般的hook過程。重點在于跟蹤與iOSOpenDev注入的使用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!