Gary's …Lasamia

Simject – 在 iOS Simulator 上也可以開發 Mobile Substrate Tweak

前陣子因為 iOS 10 越獄 Yalu 出了,將手機升級至 iOS 10 打算開發 iOS 10 的 tweak,
結果卻因為越獄限制問題,在開發過程中,無法使用 NSLog 及 printf 來顯示開發資訊的,在開發過程上頗為限制。

於是便想找替代方案,找到了 simject ,韓國美女 angelXwind 開發的一個 command-line tool 及 iOS dynamic library,提供開發者可以在 Xcode 內建的 iOS Simulator 上開發 Mobile Substrate Tweak。

優點呢,是你可以輕鬆單純地使用 Mac 電腦開發,不需要 iPhone,也解決了我目前在 iOS 10 越獄環境上不能 log 的問題
缺點的話,你只能開發例如 Springboard 這種內建 framework 或者內建 app 的相關插件,如果你是要 hook 額外的 app 或者使用另外的 Framework,在 Simulator上無法安裝的話,是無法使用的

安裝方法

首先,你需要最新版本的 Theos (安裝方法)

如果你還是舊版,在你的 tweak 開發資料夾內輸入:make update-theos

當然,你電腦內也有 Xcode 及 iOS Simulator,並裝好 xcode command line tools (正常有在使 Xcode 開發的人就裝好了)

螢幕快照 2017-01-05 下午6.15.09

再來就是下載 simject

到你要放置編譯資料夾的地方輸入以下指令:
$ git clone https://github.com/angelXwind/simject.git

然後移動至 simject 資料夾內:
$ cd simject/

就可以安裝了
$ make setup

註1:作者有提到,過程中會需要輸入密碼取得 sudo 的權限,所以出現要求密碼提示不要緊張
註2:編譯過程中,如果遇到以下錯誤:
/opt/theos/sdks/iPhoneOS9.2.sdk/usr/include/sys/cdefs.h:707:2: error: Unsupported architecture #error Unsupported architecture
要去調整你的 ~/.zshrc 將 Theos 你手動指定的 SDK version 先註解掉,例如
# export SYSROOT=/opt/theos/sdks/iPhoneOS9.2.sdk
# export SDKVERSION=9.2

讓 simject 自動抓﹑iOS 10 的 SDK 來編譯。

 

安裝完之後,記得將編譯完產生的 /simject/bin 底下的 respring_simulator 工具放置你電腦中的 /usr/bin
方便之後使用 $ respring_simulator 指令

螢幕快照 2017-01-05 下午5.29.10
註:respring_simulator 工具是在你的 simulator 重啟或 SpringBoard 崩潰時需要使用的

simject 的開發使用

安裝完成之後,放置你所寫的 dylib 至 /opt/simject 讓 iOS Simulator 使用,
另外不要刪除預設的 simject.plist 和 simject.dylib。

伴隨你的 TweakName.dylib,你需要放置的還有 TweakName.plist

開發流程

螢幕快照 2017-01-04 上午3.59.23
一般我們開發給 iPhone 等 device 的 makefile 是有下列設定
TARGET =: clang
ARCHS = arm64 armv7 armv7s

因為 iOS Simulator 是使用電腦的 Intel CPU,因此要將編譯的 dylib 改成 x86_64
TARGET = simulator:clang
ARCHS = x86_64 i386
註:如果有指定 iOS SDK 版本記得刪掉,simulator使用的不一樣

詳細的可以參照 simject 資料夾內的 simjectExampleTweak 編譯測試

而整個流程是這樣的:

  1. 開發 tweak
  2. Make 編譯成 dylib
  3. 將你的 dylib 及 plist 移動至 /opt/simject
  4. 透過 respring_simulator 命令列工具重啟 Simulator SpringBoard

螢幕快照 2017-01-05 下午6.15.42
而我有簡單的將這過程透過 make sync 簡化,在 makefile 底端加入以下就可:

 

而編譯時,就輸入 make sync 來編譯並完成指令就可!方便許多

 

而開發中如果你要看 Log 可以使用兩種方式:

    • 比較專業透過 Terminal 察看的方式:
      在終端機輸入,Simulator-hash 是根據不同版本和裝置的 Simulator 不同,可以從 Xcode -> Window -> Devices 察看 identifier
      tail -f ~/Library/Logs/CoreSimulator/<simulator-hash>/system.log
    • 另一種就是透過 Simulator 內建的程式:System Log,於 iOS Simulator > Menu Bar > Debug > Open System Log 開啟

螢幕快照 2017-01-05 下午6.16.20

螢幕快照 2017-01-05 下午6.15.29

過程中,我有遇到一個較莫名的問題,tweak 之中如果有使用 NSLog 來顯示 debug 資訊的話,直接將 dylib 編譯完放至 /opt/simject 會導致 Simulator 的 SpringBoard 崩潰。
於是我就去問了 angel ~ 原來是簽名問題,只要將你編譯完的 dylib 再次透過 ldid -S sign 過就會正常了

螢幕快照 2017-01-05 下午6.15.46
另外如果你還是遇到開啟 Simulator 結果 SpringBoard 直接崩潰,通常都是你的 code 的問題,例如使用到不包含的 framework 之類的..
simject 比較適合新寫一個 tweak 的人使用,如果要把舊的搬遷過來會遇到蠻多問題的..

發表迴響