iOS逆向微信實現(xiàn)偽裝定位

前言

此文為逆向微信二進制文件,實現(xiàn)偽裝定位,查看附近的人的教程,手把手教你玩轉(zhuǎn)微信!學會之后再去逆向微信其他功能易如反掌。
在實踐之前,需要準備好一部越獄的手機,涉及到的開發(fā)工具有cycript,LLDB與debugserver,OpenSSH,IDA,Reveal,theos,CydiaSubstrate,dumpdecrypted,class-dump等,具體安裝過程請參考iOS應(yīng)用逆向工程(第2版)書籍。
當前微信版本號為6.5.18。

git地址 https://github.com/zhaochengxiang/iOSWeChatFakeLocation

需求

自定義用戶當前所在的位置,從而查看附近的人。

實現(xiàn)界面

WechatIMG7.jpeg

WechatIMG10.jpeg

WechatIMG9.jpeg

對需求進行分析

1.查看附近的人。
我們在微信的附近的人界面,是怎么實現(xiàn)獲取附近的人功能的呢?我想的話,大家一定很容易就知道,微信肯定是通過用戶所在位置的經(jīng)緯度來判斷的,那我們?nèi)绻茉诟浇娜私缑妫业绞褂媒?jīng)緯度的函數(shù),在里面使用我們之前保存在本地的經(jīng)緯度等信息,我們的需求就能實現(xiàn)了。

2.自定義用戶當前所在的位置。
我們在微信的聊天界面中有個發(fā)送位置的界面,可以從界面中的地圖上選取地點,也可以搜索地點,點擊右上角的發(fā)送,即可發(fā)送選中的位置,那如果發(fā)送的數(shù)據(jù)里面能獲取到用戶的經(jīng)緯度等信息,再將這些信息保存在本地,我們的偽裝定位功能就能實現(xiàn)了。

3.如何跳轉(zhuǎn)到發(fā)送位置界面。
這里跳轉(zhuǎn),可以參考下從聊天界面跳轉(zhuǎn)到發(fā)送位置界面的實現(xiàn)過程。

OK,需求分析到此結(jié)束,是時候來看看具體的操作了。

找到附近的人界面使用經(jīng)緯度的函數(shù)

1.通過Reveal以及cycript,找到微信附近的人界面。
微信進入附近的人界面,連接Reveal,可以發(fā)現(xiàn)這個界面使用了一個名為MMTableView的控件。接下來我們通過這個控件,來一步一步找到附近的人界面的ViewController。
使用USB連接到iOS,具體操作請參考iOS應(yīng)用逆向工程(第二版)中usbmuxd的介紹。
接下來使用cycript來找到這個ViewController。

10438EFF-6F34-4E45-9394-32688C81BC02.png

我們在終端搜索MMTableView,找到這個類的地址。通過這個地址找到ViewController。


240BBD7E-2B89-49D9-A0A5-48BD55325A64.png

找到PeopleNearByListViewController,設(shè)置它的右側(cè)導(dǎo)航控件為空,發(fā)現(xiàn)界面沒反應(yīng),這個PeopleNearByListViewController可能不是我們要找的目標,通過PeopleNearByListViewController繼續(xù)往上找。


DCF5C09C-953D-4577-828B-AB6A04EF79DE.png

找到SeePeopleNearbyViewController,設(shè)置它的右側(cè)導(dǎo)航控件為空,發(fā)現(xiàn)界面右上角控件消失,可以肯定,這個SeePeopleNearbyViewController就是我們要找的。
我們打開SeePeopleNearbyViewController.h文件,大致瀏覽一下,發(fā)現(xiàn)該類未找到使用用戶地址相關(guān)的接口,但是在里面發(fā)現(xiàn)了SeePeopleNearByLogicController類,微信通常將ViewController中使用的邏輯放在LogicController中進行處理,看一下SeePeopleNearByLogicController.h文件,能夠看到很多與地址有關(guān)的數(shù)據(jù)以及接口,這個類并不復(fù)雜,我相信大家很快就能確定- (void)onRetrieveLocationOK:(id)arg1這個接口,可能就是我們需要的接口,arg1可能就是用戶當前的經(jīng)緯度等信息。如果真是我們分析的這樣,讓我們直接在這里使用我們偽裝后的位置,就能達到我們的目的。
那怎么確定這個接口就是我們要找的呢?

有兩種方法,第一種方法是通過LLDB與debugserver。首先在IDA中打開微信的二進制文件,找到上述接口。


D417B802-80D2-429D-A740-A818E204CAE2.png

符號所在模塊的ASLR偏移為0x1016e8250
7E6932A7-A5D2-464B-A0D9-718C9E54D4D4.png

偏移前符號基地址為0x2c000
偏移后符號基地址為 0x1016e8250+ 0x2c000=0x101714250

48FB08A3-61B5-49D8-9D0F-89D41A046501.png

設(shè)置斷點,重新進入附近的人界面。

4974711F-95B5-40A9-8877-90D1051074C2.png

輸出arg1的值。


DB74A67E-B19B-40FD-8B8D-CE0B1382F6F6.png

可以看到,這是用戶當前的經(jīng)緯度信息。

第二種方法是通過Tweek,直接hook上述接口,打印arg1參數(shù)即可,這種比較簡單,在這里就不做介紹了。

在發(fā)送位置界面截獲經(jīng)緯度等信息

1.通過Reveal以及cycript,找到發(fā)送位置的界面。這里就就具體介紹了,參考上面的過程。相信大家很快就能找到MMPickLocationViewController。那右上角的發(fā)送按鈕是如何設(shè)置的呢?右上角的按鈕一般是UIBarButtonItem通過initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action來初始化,如果我們找到了設(shè)置按鈕的地方,也就找到了事件響應(yīng)的地方,里面一定有我們所需要的位置的經(jīng)緯度等信息。帶著問題,我們看看MMPickLocationViewController.h,發(fā)現(xiàn)未找到與右上角相關(guān)的接口信息,但是我們發(fā)現(xiàn)了MMPickLocationViewControllerDelegate,我們看看代理中的方法,發(fā)現(xiàn)了- (UIBarButtonItem *)onGetRightBarButton,原來是在上層界面中進行的設(shè)置。在微信頭文件搜索MMPickLocationViewControllerDelegate,能找到BaseMsgContentLogicController.h,該類是用來處理聊天界面中的邏輯,使用IDA看看BaseMsgContentLogicController中onGetRightBarButton的具體實現(xiàn)。


026BBA19-4AE5-40B9-9D3C-FC7B499E953B.png

分析匯編,能判斷出發(fā)送按鈕的響應(yīng)函數(shù)為onFinishSelectedLocation,使用IDA分析這個函數(shù)實現(xiàn)。

0011E1D9-C8A5-459B-BCB1-FC39E171D798.png

上面只截取了部分信息。分析匯編,首先[m_pickLocationViewController DismissMyselfAnimated:YES] 來返回聊天界面,接著使用[m_pickLocationViewController getCurrentPOIInfo]獲取POIInfo信息,最后調(diào)用[m_pickLocationViewController reportOnDone]徹底釋放發(fā)送位置界面。打開POIInfo.h,能很快發(fā)現(xiàn)@property(nonatomic) struct CLLocationCoordinate2D coordinate,這就是我們要找的位置信息,將它保存在本地即可。

如何跳轉(zhuǎn)到發(fā)送位置界面

這里我們參考聊天界面跳轉(zhuǎn)到發(fā)送位置界面的過程,如果能找到相關(guān)函數(shù),分析里面的實現(xiàn),那我們這個問題就能得到解決。
那我們打開聊天界面的邏輯控制器BaseMsgContentLogicController,觀察該頭文件,發(fā)現(xiàn)兩個可疑的接口:

- (void)ViewLocation:(id)arg1;
- (void)SelectLocation:(_Bool)arg;

首先通過IDA來分析ViewLocation實現(xiàn)。

0FFD7CBC-4A73-406C-A530-4932E453063F.png

分析匯編,很容易知道,這是個彈出提示,用來提示是發(fā)送位置還是共享實時位置。

接著來分析SelectLocation實現(xiàn)。

FE6CAF78-BE2A-409B-A3FE-A3E5CB6B60FC.png
B77B581F-5539-4C81-A9BE-700D61E73911.png
03A94041-C5ED-4AF8-9FE7-E07AEA075BBF.png

分析匯編,首先MMPickLocationViewController通過- (id)initWithScene:(unsigned int)arg1 OnlyUseUserLocation:(_Bool)arg2來進行初始化,然后[[MMUINavigationController alloc] initWithRootViewController: m_pickLocationViewController]來初始化NavigationController,這里假設(shè)該NavigationController命名為nc,最后使用[self PresentModalViewController:nc animated:YES]來進行跳轉(zhuǎn)。
(initWithScene:OnlyUseUserLocation:的參數(shù)請參考之前介紹的調(diào)適方法來獲取值,這里就不重復(fù)介紹了)。

OK,分析完畢,開始寫tweek吧。

后期我將繼續(xù)微信的一些小插件開發(fā),請關(guān)注一下我,謝謝!
如果覺得我的文章不錯,請我喝杯熱茶吧

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

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

  • LeonLei的博客 歡迎來訪! 前言 此文為逆向微信二進制文件,實現(xiàn)朋友圈小視頻轉(zhuǎn)發(fā)的教程,從最開始的匯編代...
    LeonLei閱讀 13,094評論 7 26
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,825評論 25 709
  • 這幾天一直在研究iOS的安全,也動手搞了一下iOS的逆向工程微信。有兩個成果吧。一個是攔截了信息;另外一個就是攔截...
    FlyOceanFish閱讀 1,970評論 3 1
  • 經(jīng)年未見 歲月可曾改變誰人 那時同窗他坐你旁邊 做幼稚的動作,說粗魯?shù)脑捳Z 那年你偷偷隱藏著什么 又偷偷喜歡著什么...
    嵐七海汐閱讀 187評論 1 0
  • 今天會要死要活地喜歡你,明天就會以同樣的程度喜歡上別人,年輕的心并不會被束縛,那時候丁點大的事都會以為天塌下...
    我愛文博閱讀 160評論 0 0

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