免越狱版 iOS 抢红包插件
又到年末,微信紅包又開始成為大家所關心的話題了,不管是公司年會,還是朋友聚會,似乎不發紅包就沒辦法繼續聊下去了。因此,值此新年來臨之際,我對我的iOS 微信搶紅包 tweak進行了一下改進。主要增加了插件開關,以及隨機延遲功能,讓你在新一輪紅包大戰中無往而不利。
但是,這畢竟是一個 tweak,只有少數有越獄機器的小伙伴才能使用這個插件,無疑門檻是太高了。到目前為止,已經有無數朋友在問到底有沒有免越獄版本的插件了。
今天,我們就要討論下如果制作免越獄版本的微信搶紅包插件。
注意:本篇文章只講我在自己摸索過程中的一點總結,并不深入講解原理。我對 iOS 逆向也只是初窺門徑,對很多原理也還未達到深入理解的程序,國內關于這方面的文章也是在少數,我也不希望我寫出語焉不詳的文章導致讀者被我誤導。同時,也不排除將來我研究得夠深入的時候,再回過頭來寫關于原理的文章。
原理
雖然這里并不深入講解,但是最基本的原理我們還是要理解的,因為后面所做的工作,都是基于這個原理來進行開發的。越獄機器之所以能使用 tweak,主要是因為在越獄的時候,手機里就安裝了 mobilesubstrate 這個庫,這個庫的作用就是能在程序運行的時候動態加載我們自己寫的 dylib 動態運行庫。而由于非越獄手機系統里面是沒有這個庫的,所以我們需要直接將這個庫打包進 ipa 當中,使用它的 API 實現注入。
關于注入的原理,可以參考這篇文章:移動App入侵與逆向破解技術-iOS篇。
好了,這就是目前為止我們所需要了解的東西。下面就可以開始動手了。
獲取砸殼版本的微信 ipa
因為在 AppStore 上面下載得到的應用都是經過加密的,可以執行文件上已經被加過一層殼,所以我們需要先拿到砸過殼版本的微信應用。
有兩種方法:
第一種方法沒什么好說的,這里主要講講第二種方法。
首先,將?Cluth?倉庫 clone 到本地:
$ git clone https://github.com/KJCracks/Clutch $ cd Clutch接著,使用 Xcode 進行構建,得到可執行文件:
$ xcodebuild -project Clutch.xcodeproj -configuration Release ARCHS="armv7 armv7s arm64" build生成出來的可執行文件就在 Clutch 目錄下,將其拷貝到手機上:
scp Clutch/clutch root@<your.device.ip>:/usr/bin/之后,就可以使用這個工具來進行砸殼了。
先 ssh 到越獄手機上,然后列出當前安裝的應用:
$ ssh root@ $ clutch -i # Installed apps: # 1: WeChat # 2: DingTalk # 3: 喜馬拉雅FM(聽書社區)電臺有聲小說相聲英語可以得到 clutch 把相應的包名也顯示出來了,這時我們就可以進行砸殼了:
$ clutch -d com.tencent.xin # com.tencent.xin contains watchOS 2 compatible application. It's not possible to dump watchOS 2 apps with Clutch 2.0.4 at this moment. # Zipping WeChat.app # Swapping architectures.. # ASLR slide: 0xb3000 # ... # writing new checksum # DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS7.0-(Clutch-2.0.4).ipa # Finished dumping com.tencent.xin in 76.9 seconds可以看到,clutch 將砸過后的 ipa 文件放到了?/private/var/mobile/Documents/Dumped/?目錄下。
我們將它改成一個比較簡單的名字,然后拷回電腦上:
$ mv /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS7.0-\(Clutch-2.0.4\).ipa /private/var/mobile/Documents/Dumped/wechat.ipa $ scp root@:/private/var/mobile/Documents/Dumped/wechat.ipa ~/Desktop這里,我把它拷到了電腦桌面上。之后就可以進行下一步操作了。
準備 dylib 動態鏈接庫
這步就很簡單了,直接到我的?WeChatRedEnvelop?上把源碼 clone 下來,然后執行?make?命令,就能拿到 dylib 文件了。
$ git clone https://github.com/buginux/WeChatRedEnvelop.git $ cd WeChatRedEnvelop $ make # > Making all for tweak WeChatRedEnvelop… # ==> Preprocessing Tweak.xm… # ==> Compiling Tweak.xm (armv7)… # ==> Compiling XGPayingViewController.m (armv7)… # ... # ==> Signing WeChatRedEnvelop… $ cp .theos/obj/debug/WeChatRedEnvelop.dylib ~/Desktop # 注意是 .theos 目錄,這是個隱藏目錄將生成的 dylib 文件拷貝到桌面,跟剛剛砸過殼的微信應用放到一個目錄層級。
檢查依賴項
因為這個代碼是我自己寫的,所以我知道這個 dylib 除了 mobilesustrate 外沒有依賴其它的庫。但是如果我們拿到的是別人的 dylib,就需要先進行一下依賴項檢查,以確保之后我們將所有的依賴庫都打包進 ipa 當中。
使用 macOS 自帶的 otool 工具就可以進行依賴項檢查:
$ otool -L WeChatRedEnvelop.dylib WeChatRedEnvelop.dylib (architecture armv7):/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)/usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) WeChatRedEnvelop.dylib (architecture arm64):/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)/usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)可以看到除了 substrate 庫,其它依賴的都是系統自帶的庫。我們將 libsubstrate.dylib 拷出,使用?install_name_tool?命令修改動態庫的路徑,指向 app 二進制文件的同級目錄。
如果你的系統中不是 /usr/lib/libsubstrate.dylib 而是 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 的話,解決方法可以參考?Github 上的 issue。
$ scp root@:/usr/lib/libsubstrate.dylib ~/Desktop $ install_name_tool -change /usr/lib/libsubstrate.dylib @loader_path/libsubstrate.dylib WeChatRedEnvelop.dylib $ otool -L WeChatRedEnvelop.dylib WeChatRedEnvelop.dylib (architecture armv7):/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) WeChatRedEnvelop.dylib (architecture arm64):/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)可以看到 libsubstrate.dylib 的路徑已經變更了。
將動態鏈接庫注入二進制文件中
接下來,就需要將我們的庫注入到微信的二進制文件中,可以使用開源的?optool 工具。
編譯安裝 optool 工具:
# 因為 optool 添加了 submodule,因為需要使用 --recuresive 選項,將子模塊全部 clone 下來 $ git clone --recursive https://github.com/alexzielenski/optool.git $ cd optool $ xcodebuild -project optool.xcodeproj -configuration Release ARCHS="i386 x86_64" build將砸殼過的 ipa 文件解壓,然后將 libsubstrate.dylib 與 WeChatRedEnvelop.dylib 拷貝到解壓后的 WeChat.app 目錄下。
$ cd ~/Desktop $ unzip wechat.ipa -d wechat $ cp libsubstrate.dylib WeChatRedEnvelop.dylib wechat/Payload/WeChat.app使用 optool 把 WeChatRedEnvelop.dylib 注入到二進制文件中:
$ /path/to/optool install -c load -p "@executable_path/WeChatRedEnvelop.dylib" -t wechat/Payload/WeChat.app/WeChat在開始打包之前,請先將 WeChat.app 里面的 Watch 目錄刪除,這個目錄是跟 Watch 有關的,如果不刪除的話,會導致后繼的安裝步驟出問題。出現?A WatchKit app within this app is not a valid bundle?的錯誤。
打包并重簽名
打包 ipa 與重簽名可以直接使用圖形化工具?ios-app-signer?來完成。
這個工具可以自動加載出本機的證書以及 Provisioning Profile 文件,使用起來十分方便,當然也可以手動選擇證書文件。
如果是使用個人開發者證書,需要先將設備的 UUID 加到 Provisioning Profile 中。
我這里是直接從一個 archive 過的應用中提取 embedded.mobileprovision 文件,并在 Provisioning Profile 一欄中選擇 Choose Custom File 使用這個文件。
點擊 start 后,指定保存路徑,iOS App Signer 就會幫你搞定所有事情。
安裝
在 iOS App Signer 完成打包與重簽名后,我們就可以進行安裝了。
安裝有兩種方法,一種是使用 iTool 工具安裝 ipa 文件。
另外一種是針對有 XCode 的同學,在菜單 - Window - Devices 中打開設置窗口。點擊 Installed Apps 欄下面的 + 號就可以選擇 ipa 文件進行安裝了。
效果
重簽名后的應用由于與原應用的 Bundle id 是不同的,所以可以同時安裝兩個應用。這也就是淘寶上所謂的微信多開的原理。
小結
我們最終得到了一個可以安裝在免越獄設備上的微信 ipa 文件,但是這些步驟對于有些來說,可能還是太過復雜了。他們需要的只是重簽名過的 ipa 文件,但是很可惜,由于我是使用的個人證書打包的,所以無法直接將 ipa 文件發出來。
如果有哪位好心的小伙伴可以貢獻一個企業證書的話,我就可以利用這個企業證書打個包,然后直接進行應用分發,這也許就是最方便快捷的方法了。
參考文章
- 移動App入侵與逆向破解技術-iOS篇5
- DingTalkNoJailTweak
贊賞
如果本篇文章對你有幫助,可以進行小額贊助,鼓勵作者寫出更好的文章。
總結
以上是生活随笔為你收集整理的免越狱版 iOS 抢红包插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java笔记06-Map集合
- 下一篇: mac svn工具_Cornerston