手把手教你做iOS逆向分析,突破微信的羣發多選數量限制

語言: CN / TW / HK

前言

很久沒碰iOS開發了,最近都在web前端持續輸出,加了很多推文羣,每次羣發文章的時候都要受到這個最多隻能選擇9個聊天的限制。

image.png

很不爽,好歹我也曾是一名iOS開發者呀,弄它~

image.png

必備軟件

  • class-dump

class-dump是進行iOS逆向開發常用的一款工具,其主要作用是導出App的頭文件內容。根據這些頭文件可以大致分析出APP的結構和內容

  • MonkeyDev

MonkeyDev是一個極為方便的逆向調試平台,集眾家所長

一般來説我們要通過以下步驟,才可以在沒有源碼的情況下,更改一個APP的功能。

image.png

MonkeyDev把紅框中的三步都封裝了,非常簡單暴li。我們站在MonkeyDev的肩膀上,只需要準備一個砸殼後的ipa或者app文件即可,只需要去分析微信APP的頭文件,然後hook原方法即可。當然説起來很容易,我帶大家一起來看看這個過程

第一步:找到功能所在位置

首先根據MonkeyDev的説明,把砸殼後的ipa文件放到TargetApp目錄下

image.png

然後連接你的iOS設備,點擊運行。注意,只能運行到真機上

image.png

這時候如果你更改了bundleid,那麼你就已經得到了一個可以多開的微信了。但我們不只是想要多開這麼簡單,我們還需要加強微信的一些能力。

等APP在手機上打開後,我們就可以在XCode中使用debug view hierarchy功能來調試視圖

image.png

進入我們想要調查的轉發分享界面,然後開啟debug view hierarchy,我們就可以把當前所在界面的視圖層次結構看得一清二楚

image.png

顯然在我開篇提到的需求中,我是想更改多選功能的,那麼我們選中多選按鈕,可以看到這個按鈕綁定的方法叫onMutilSelect,該方法定義在SessionSelectController這個類中 image.png

先記住這兩個信息

  • 函數名叫onShowMutilSelct
  • 所在類名叫SessionSelectController

第二步:提取應用全部的頭文件

~~~shell class-dump -s -S -H /Users/ezshine/Work/Playgrounds/DKWechatHelper/dkhelper/dkhelper/TargetApp/WeChat.app -o ~/Downloads/wxheaders ~~~

安裝好class-dump並使用上述命令將應用中所有的頭文件都提取出來

image.png

我們可以看到,微信App的實現用到了2.3w個類,我們用sublime打開它,並且從已打開的文件及文件夾中搜索onMutilSelect

image.png

果不其然吧!被揪出來了!

SessionSelectController的頭文件中找到了onShowMutilSelect方法的定義,我們先給它上個hook,也就是當這個方法被執行時,不再執行原方法實現,而是執行我們自己的實現。

第三步:上鈎子改造它

image.png

MonkeyDev倉庫的Logos文件夾中,找到dkhelperDylib.xm文件,添加如下內容

~~~objective-c %hook SessionSelectController

  • (void)onShowMultiSelect:(id)arg1 { UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"我自己的彈窗" message:@"" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction action = [UIAlertAction actionWithTitle:@"你牛逼" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alert addAction:action]; [(UIViewController)self presentViewController:alert animated:true completion:nil]; }

%end ~~~

TADA!!!!完成,這個時候再點擊多選按鈕,竟然彈出了我們自己的彈窗。我們的實現替換掉了原來多選按鈕的功能!

2021-09-09 22_10_17.gif

結語

就這樣,我們魔改了微信的功能,把原本微信app中的功能替換成了我們自己的實現。似乎我們沒提到怎麼去掉多選限制呀?其實很簡單,如果你對iOS UIKit比較熟悉,就會知道,列表控制器實現的多選,每次選擇時會有一個回調函數叫- (_Bool)onShouldSelectContact:(id)arg1,這個函數是一個布爾類型的返回值,也就是它決定了還能不能繼續選擇,我猜測9這個數量判定也是在這個函數裏實現的,我們只需要替換掉它的實現,不對已選數量做判斷即可

~~~objective-c %hook SessionSelectController

  • (_Bool)onShouldSelectContact:(id)arg1 { return YES; }

%end ~~~

image.png

這是我在掘金的第一篇iOS相關的文章,還希望大家多多點贊鼓勵

逆向所使用的github倉庫地址:https://github.com/DKJone/DKWechatHelper

我是大帥,一個老程序猿


推薦閲讀(感謝掘友的鼓勵與支持🌹🌹🌹) - 🎑提前祝大家中秋快樂,跟我一起做一個【中秋花燈許願】💖的網站吧 62贊 - 華為主動找我合作,我放棄了!前端實現拍照識別垃圾分類最簡單的方法! 71贊 - 產品經理:你能不能用div給我畫條龍? 2371贊 - 三種前端實現VR全景看房的方案!説不定哪天就用得上! 2641贊