自定義微信

2021-01-14 Cydia

原理

雖然這裡並不深入講解,但是最基本的原理我們還是要理解的,因為後面所做的工作,都是基於這個原理來進行開發的。越獄機器之所以能使用 tweak,主要是因為在越獄的時候,手機裡就安裝了 mobilesubstrate 這個庫,這個庫的作用就是能在程序運行的時候動態加載我們自己寫的 dylib 動態運行庫。


而由於非越獄手機系統裡面是沒有這個庫的,所以我們需要直接將這個庫打包進 ipa 當中,使用它的 API 實現注入。

獲取砸殼版本的微信 ipa

因為在 AppStore 上面下載得到的應用都是經過加密的,可以執行文件上已經被加過一層殼,所以我們需要先拿到砸過殼版本的微信應用。

有兩種方法:

直接在 PP 助手下載

使用 Clutch 對越獄手機上應用進行砸殼

第一種方法沒什麼好說的,這裡主要講講第二種方法。

首先,將 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@<your.device.ip>
$ clutch -i

# Installed apps:
# 1: WeChat <com.tencent.xin>
# 2: DingTalk <com.laiwang.DingTalk>
# 3: 喜馬拉雅FM(聽書社區)電臺有聲小說相聲英語 <com.gemd.iting>

可以得到 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@<your.device.ip>:/private/var/mobile/Documents/Dumped/wechat.ipa ~/Desktop

這裡,我把它拷到了電腦桌面上。之後就可以進行下一步操作了。

準備 dylib 動態連結庫

這步就很簡單了,直接到我的 WeChatRedEnvelop 147 上把源碼 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 二進位文件的同級目錄。

$ scp root@<your.device.ip>:/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

打包並重籤名

打包 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 文件進行安裝了。

相關焦點

  • 問答:微信朋友圈如何自定義位置?
    用微信發朋友圈時可以選擇位置,有些位置在位置列表裡不存在,或者你想要更個性的位置,這時就需要自定義位置。下面我就來告訴大家如何給自己的朋友圈自定義位置。工具/原料微信、手機接入WIFI或行動網路方法/步驟進入微信主界面,點擊下面的「發現」。
  • 手機軟體圖標自定義,可以設置個性化微信logo!簡單又好看!
    扣肉發現微信的logo可以自定義,可以切換成你喜歡的圖標樣式,連名字都可以更改。超簡單,一鍵設置。別人在也找不到我的微信入口了,哈哈哈~- 操作流程 -安卓手機設置方式小貼士:工具的獲取方式在文章末尾處
  • 手機秒變諾基亞,微信餘額自定義,你還有多少不知道的隱藏技能
    技能: 手機秒變諾基亞壁紙 ,微信餘額自定義,照片一鍵生成漫畫頭像 難度係數:1顆星大家都知道我最喜歡的都是研究一些有趣的技能,趁著周末,我也不敢偷懶,趕緊給大家整理除了3個我最近經常玩的。感興趣的小夥伴和我一起來看看吧。
  • Unity3D 自定義公告牌
    就這樣,一個自定義公告牌就製作完成方式一如果鏡頭縮放鏡頭設置的是鏡頭的fieldOfView值using UnityEngine;public class後記自定義公告牌暫時先記錄到這,後續再進行補充聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。
  • 支持創建自定義時鐘界面 Moto360獲升級
    例如說,可以自定義選擇時鐘背景圖案、時鐘顯示模式以及不同的刻度樣式、日期顯示模式等等。Moto360智能手錶    例如說,可以自定義選擇時鐘背景圖案、時鐘顯示模式以及不同的刻度樣式、日期顯示模式等等。
  • 《迷你世界》自定義模型攻略 讓我來告訴你自定義模型怎麼做
    川北在線核心提示:原標題:《迷你世界》自定義模型攻略 讓我來告訴你自定義模型怎麼做 《迷你世界》是一款高度自由的休閒類3D沙盒遊戲,有著非常方便快捷的多人聯機模式,在這裡,你能夠隨心所欲創造一切,那麼《迷你世界》自定義模型怎麼做?
  • 《迷你世界》自定義模型製作器如何獲得 自定義模型製作器作用介紹
    導 讀 迷你世界自定義模型製作器怎麼做?自定義模型製作器合成方法。
  • 《怪物獵人世界》武器怎樣自定義升級 武器自定義升級系統詳解
    導 讀 怪物獵人世界武器自定義升級系統怎麼用?
  • 使用vlookup解決自定義排序的問題,原來自定義排序竟如此簡單
    Hello,大家好,今天跟大家分享下如何自定義排序,實現想怎麼排序就怎麼排序,工作中我們可能會遇到這樣的問題,就是要根據給定的數據位置進行排序,如果我們直接使用排序excel會根據默認的排序規則進行排序,而不能達到我們想要的結果,解決這樣的問題,跟大家分享2種方法,一種是使用自定義排序,一種是使用
  • 企業微信2020年度大會召開,壁壘定義私域平臺新標準
    12月23日下午14:30,企業微信2020年度大會在廣州如期召開,本次大會企業微信從產品更新、行業覆蓋、生態合作等方面透露出來的信號,為數位化營銷領域指出了清晰的發展方向。北京慧博科技有限公司受邀出席此次大會。
  • 程式設計師的樂趣,生成自定義二維碼,5行Python代碼就搞定
    那麼有沒有辦法實現自定義生成二維碼呢?近日,一位熱衷於終身學習的工程師兼攝影師 Arindom Bhattacharjee 撰寫了一篇自定義生成二維碼的方法,並且整個生成過程只需要 5 行 Python 代碼即可完成。感興趣的讀者可以自己實現下。
  • 如何在Keras中創建自定義損失函數?
    什麼是自定義損失函數?對於不同的損失函數,計算損失的公式有不同的定義。在某些情況下,我們可能需要使用 Keras 沒有提供的損失計算公式。在這種情況下,我們可以考慮定義和使用我們自己的損失函數。這種用戶定義的損失函數稱為自定義損失函數。
  • 1602自定義字符顯示攝氏度符號
    例如,欲寫入數據i到DDRAM:void WDR(uchar i){ CheckBusy();//檢忙 LCD_RS=1; LCD_RW=0; LCD_EN=0; Delay(); LCD_DATA=i;//數據輸出到定義埠 Delay(); LCD_EN
  • 電腦微信文件夾儲存在什麼位置,微信PC版如何自定義文件存放位置
    摘要:電腦微信文件夾存儲會在微信安裝之後存放一個默認位置,默認位置在C盤,文件存儲位置可以自由設置其他路徑。我們都知道微信只要安裝完就可以使用,在平時辦公的時候經常會用到電腦版本的微信,那麼就不可避免的會接收發文件、圖片等。
  • 微信4.0
    4.0簡介 微信搶紅包神器哪裡找?微信搜索 趣玩app,回復『紅包』告訴你解決方法!微信4.0安卓版是一款手機通信軟體,支持通過手機網絡發送語音簡訊、視頻、圖片和文字,微信4.0安卓版可以單聊及群聊,還能根據地理位置找到附近的人,帶給朋友們全新的移動溝通體驗,支持ios、Android、塞班等多種平臺手機。微信,不只是個聊天工具!
  • GraphPad Prism統計教程 - 自定義方程的添加與管理
    www.graphpad-prism.cnPrism允許用戶添加自定義方程,並保存在【用戶自定義方程】列表中。如果用戶希望與其它同事共享這些自定義方程,可以直接從Prism自帶方程列表的下方找到。如何添加自定義方程?打開新的Prism項目。
  • VBA在Excel中實現自定義的Sum函數
    下面,討論如何實現一個自定義的具有合計功能的函數,由於Sum函數系統已經內置,我們要實現的函數不妨命名為udSum。 相關精彩文章    首先,想到的應該使用VBA,毫無疑問,最直接的針對Excel功能的擴展來源於VBA。
  • 騰訊新出了一個「自定義託管」功能,聊聊怎麼用吧~
    騰訊廣告官方最近出了一個「自定義託管」功能,就可以幫我們實現這一目標,接下來我們就聊聊這個功能。 一、「自定義託管」功能是什麼?(目前後臺的名字叫「自定義盯盤」,後面會改成「自定義託管」,所以現在就統一這麼叫啦!)
  • 如何讓手機桌面的圖標自定義
    先來看一下我自己的圖標,這樣自己改的圖標看到了很多圖標都是和系統圖標不一樣的,而且圖標的標籤,也就是app的名字,也是可以自定義的,比如我自己改的那個吃雞,大家也看到了,今天教大家如何去自定義自己的桌面圖標。
  • CAXA CAPP教程:用戶自定義知識庫
    之前跟大家介紹了CAXA工藝圖表的工藝知識庫分為系統知識庫和用戶自定義知識庫,在這一講中,我們將詳細介紹用戶自定義知識庫的常用操作。使用自定義知識庫,可以更加靈活的定義所需的各類知識庫,右擊自定義資料庫中的某個節點,彈出右鍵菜單,如圖一所示,利用快捷菜單中的命令,可以方便地完成自定義資料庫結構的創建。