Sideloadで可能性を感じたかった話

Sideloadとは

簡単に言うと脱獄していないデバイスでもアプリ内にdylibをつっこんで、dylibごとIPAにして自己署名でインストールしてしまおうという企み。

自己署名はSideloadが流行りすぎて90日から7日に有効期限が減らされてしまったので、これがまあどの程度有効なのかは難しいところ。

まあAdHocで配布しておけば365日有効だろうけれど…

ちなみに執筆にあたって以下の記事をかなり参考にさせていただきました。

必要なもの

実際にやってみた

バージョンが上がったのでだいぶ手順が変わっていました。

特にIPAの解凍とからやらなくてよかったのは好都合でしたね。

Theos-Jailed

まずはtheosの方の環境を整えます。

なんというか、最新のTheos-Jailedはtheosのオマケみたいな立ち位置らしい。

やることはCloneしてきてインストールを実行するだけなんだけど、なかなかこの方法を見つけられなくて悪戦苦闘したから環境おかしくなってるかもしれない。

git clone --recursive https://github.com/kabiroberai/theos-jailed.git
cd theos-jailed
./install

このインストールコマンドを打ち込んだら従来のtheosからjailed版もビルドできるようになります。

ios-deploy

ios-deployというものをインストールすれば非脱獄デバイスでもコマンドからUSB経由でインストールできそうなのだが、あいにくどうやってもios-deployを導入できなかった。

より具体的には、以下のコマンドでエラーが発生してコケてしまう。

npm install -g ios-deploy

一応同様のエラーに悩んでいる人もいるようでissueもあがっているのだが、実行しても何も変わりませんでした、残念。

まあ、これなくてもなんとかなるのでセーフ。

ios-deploy解決策

brew install ios-deploy

homebrewは最強なんだなあって思いました。

アップデート

me@me-2 % make update-theos
> Updating Theos…
Fetching origin
Already up to date.

==> Notice: Visit https://github.com/theos/theos/releases to see the changelog.
> Updating theos-jailed…
Already up to date.
Current branch master is up to date.
Successfully installed module.
Successfully installed template.

make update-theosでアップデートできました。

プロジェクト作成

以下のコマンドで実行できる。

me@me-2 ~ % $THEOS/bin/nic.pl -t iphone/jailed 
NIC 2.0 - New Instance Creator
------------------------------
Project Name (required): ikaWidget
Package Name [com.yourcompany.ikawidget]: work.tkgstrator
[iphone/jailed] Path to .ipa: ikawidget.ipa
Instantiating iphone/jailed in ikawidget/...
Done.

-t iphone/jailedっていうのがコツみたい。

今回はikaWidgetを弄ってみたかったのでこんな感じで実装してみました。

するとディレクトリができているはずなのでそこに移動してみます。

MakefileとTweak.xmができていたら成功です。

コーディング

MakefileとTweak.xmを弄ります。

なお、どちらもObjective-Cで書かなきゃいけないのでめんどくさい。何のためにSwift勉強してるんだよっていう話ですよね。

Makefile

MODULES = jailed
include $(THEOS)/makefiles/common.mk

ARCHS = armv7 arm64
TWEAK_NAME = ikaWidget
DISPLAY_NAME = ikaWidget
BUNDLE_ID = work.tkgstrator

ikaWidget_FILES = Tweak.xm
ikaWidget_IPA = /Users/me/ikawidget.ipa

include $(THEOS_MAKE_PATH)/tweak.mk

デフォルトで問題ないけれど、ARCHSは追加してあげてもいいかも

Tweak.xm

特に何も考えず、昔書いたゴミコードを移植。

@interface GADBannerView 
@property (nonatomic, assign, readwrite, getter=isHidden) BOOL hidden;
@end

@interface UIViewControllerWrapperView 
@property (nonatomic, assign, readwrite) CGRect frame;
@end

%hook UIView
- (void) layoutSubviews
{
    %orig;
    if(self.frame.size.height == 50){
        self.hidden = YES;
    }
}
%end

%hook UIViewControllerWrapperView
- (void) layoutSubviews
{
    if(self.frame.size.height == 568){
        CGRect rect = CGRectMake(0,0,320,618);
        self.frame = rect;
    }
}
%end

%hook GADBannerView 
- (void) layoutSubviews
{
    self.hidden = YES;
}

mobileprovision

IPAに署名をするための仕組み。

make info

と入力するとプロビジョニングプロファイル作成のためのチュートリアルが英語で説明されます。英語を読むのがめんどくさい君たちのために翻訳してあげます!!

覚えておかないとダメなのは三行目のProduct NameとOrganization Identifierです。

今回の場合はProduct NameはtkgstratorでOrganizationはID-8B817DE4.workですね。

まず、XcodeをひらいてSingle View Appを選択します。

先ほど覚えたProduct NameとOrganization Identifierを入力します。

どうせ使わないのでCreate Git repository on my Macのチェックは外しておきましょう。

Targetでインストールしたいデバイスのバージョンと合わせるのを忘れないようにしましょう。

署名のところはAutomatically manage signingにチェックを入れておいて大丈夫です。

チェックを入れて問題がなければ左上のCapabilityをクリックします。

押したらApp Groupをクリックしましょう。

ここまでできたらインストールしたいデバイスをMacにつないでアプリをインストールします。

これは左上の「▷」ボタンを押すだけなので多分問題ないはず。一度インストールすればデバイスにプロファイルがインストールされます。

わけのわからない真っ白なアイコンがホーム画面に表示されますが、消してしまって大丈夫です。

というか、消さないとエラーがでました。

make

いろいろコマンドがあるらしいのだが、使い方がいまいちわからないので一応見つけたやつを全部のせておきます。

make package install FOR_RELEASE=1 CODESIGN_IPA=0
  • FOR_RELEASE=1
    • DEBUGではなくRELEASEでビルド
    • 実行動作が多分多少速くなるが、ビルドが遅くなる
  • CODESIGN_IPA=0
    • IPAに署名をせずにビルドする
    • そのままではインストールできないIPAができる
    • なのでCydia ImpactorやiOS App Signerが必要になる
  • PROFILE=…
    • 署名してIPAをビルド
    • 言うまでもなくCODESIGN_IPA=0とは併用できない
  • TARGET=iphone:11.2:10.0
    • iOS SDK11.2, clang10.0でビルドするという意味
    • なくても困らないがSDKエラーがでたときにどうぞ

PROFILE=… の形式でmobileprovisionかbundleidentifierを渡せば署名付きでビルドできるらしいのだが、何度やってもCode Signing Errorがでたので諦めました。

上手くいった人がいたら教えてください。

ld: warning

ld: warning: building for iOS, but linking in .tbd file (/Users/me/theos/vendor/lib/CydiaSubstrate.framework/CydiaSubstrate.tbd) built for iOS Simulator

CydiaSubstrate.frameworkがiOS Simulator用だと文句を言ってきます。

ちょっと調べたけど消し方がわからないので誰かなんとかして。

Debug Symbol

warning: no debug symbols in executable (-arch arm64e)

アーキテクチャ用のデバッグシンボルが実行ファイル内にないといってくる。

よくわからんのでヨシ。

インストール

署名をしていない場合はそのままではインストールがでいない。

理想的な方法はAdHocでいつでもインストールできるようにしておくことだが、なんだかそれもめんどくさい。

XcodeでビルドしてないアプリをTestFlightすることってできましたっけ?

Cydia Impactorでインストールできるはずなのだが、何故かiPhone6Sでは弾かれてしまった。

謎のエラー発生

何故かiPhone8, 1(iPhone6S)はサポートされていないとでてくる。

そしてサポートされていると表示されているのがiPhone8と7だけという不思議。まったくもって意味がわからない。

CrackerXI+の設定からRemove UISupportedDevicesをオンにしておかないとCrackしたデバイスと同じ種類のデバイスでしかインストールできなくなってしまいます。

実行してみた

iPhone8にインストールして実行してみました。

広告が消えた!!

確かに広告は消えたのだが、何故か画像読み込みがとてつもなく遅い。

これはぼくの古いコードがクソすぎるだけの可能性も十分あります。

どうもTheos-Jailed側の問題のようだ。

まとめ

今のところはとりあえず成功したとは言えつつも、こんなに実行速度遅くて利用価値があるのかというのは微妙なところですが、未脱獄デバイスで自作コードが動くのは結構面白いですね。

まあTheos−Jailedの本領はこんなところではなくて、いろんなスクリプトを埋め込めるところにあるんですけど、それまで書いているとあまりに長くなるので今回はここで筆を置こうと思います。