Quantumleap
1359 words
7 minutes
未脱獄でもバイナリ解析をしよう

Objection#

通常、アプリを動的解析するのであればデバイスが脱獄されている必要があります。

ですがアプリ自体にバイナリを同梱することで未脱獄状態でも解析ができます。

めちゃくちゃ頑張っていたのですが、以下の作業は全て無になりました。

必要なもの#

FridaGadget.dylibはダウンロードしたものを展開してファイル名を変えてください。変えなくても問題ないかもですが、なんとなく変えました。

Sideload#

復号したIPAファイルを用意したらSideloadlyに突っ込みます。

Tweak Injectionがあるので+dylib/deb/bundleからFridaGadget.dylibを突っ込みます。

下に三つチェックを入れるところがありますが、全て外します。未脱獄ではCydia SubstrateもSubstituteも入っていないので動きません。

Sideload Spooferだけはよく分からなかったのですが、チェックを入れたらMobile Substrateのチェックみたいなのが入って動きませんでした。なので全部外します。

Anisette AuthenticationはLocal、Signing ModeはApple Id SideloadにしてStartを押します。

インストールができます。

解析#

このパッチが当てられたアプリは通常起動はできません。

解析するにあたってコンソールを二つ開く必要があります。ひょっとしたら一つでもできるかもしれないのですが、わかりません。

コンソール1#

frida -Uf com.nintendo.znca
     ____
    / _  |   Frida 16.1.7 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to iPhone (id=921686d2cdbb7e8c7ea972d61652a0370b1e994e)
Spawning `com.nintendo.znca`...
Spawned `com.nintendo.znca`. Resuming main thread!                  
[iPhone::com.nintendo.znca ]->

一つ目を起動しただけだと無限にフリーズするので二つ目のコンソールからObjectionを実行します。

コンソール2#

objection explore

Using USB device `iPhone`
Agent injected and responds ok!

     _   _         _   _
 ___| |_|_|___ ___| |_|_|___ ___
| . | . | | -_|  _|  _| | . |   |
|___|___| |___|___|_| |_|___|_|_|
      |___|(object)inject(ion) v1.11.0

     Runtime Mobile Exploration
        by: @leonjza from @sensepost

すると普通に起動します。

ここから解析を進めると良いです。

記事は以上(以下の内容は存在しません、そのうち消します)

これより下は作業の証#

空のプロジェクトの作成#

署名に必要なMobile Provisionを取得します。Certificates, Identifiers & Profilesから発行しても良いのですが、めんどくさいのでXcodeからやる方が楽です。

適当にBundle Identifierを指定してiOS向けアプリを作成します。

Signing & CapabilitiesからAutomatically manage signingを有効化します。

するとちょっと下の方にSigning Certificat Apple Development: XXXXXX (YYYYYYYYYY)と表示されます。されたらファイルは作成されたのでこれを抜きます。

ここのYYYYYYYYYYの値は少しの間覚えておいてください。

適当にProduct>Archiveを押します。

出力されたアーカイブの上で右クリックを押してShow in Finderを押します。

出力されたファイルはそのまま開くとXcodeが開いてしまうので、右クリックでShow Package Contentsを押します。

XXXXXX.xcarchive/
├── Info.plist
├── dSYMs/
└── Products/
    └── Applications/
        └── XXXXXX/
            ├── XXXXXX
            ├── embedded.mobileprovision
            ├── PkgInfo
            ├── _CodeSIgnature/
            └── Frameworks/

こうなっているのでembedded.mobileprovisionを取り出しておきます。

証明書の確認#

security find-identity -p codesigning -v

とすればデバイスに保存されている証明書が見れます。

security find-identity -p codesigning -v                                                                         
  1) C1AC4EFE2714E89EXXXXXXXXXXXXXXXXXXXXXXXX "Apple Development: Devonly (XXXXXXXXXX)"
  2) 850E2342E18F291EXXXXXXXXXXXXXXXXXXXXXXXX "Apple Distribution: Devonly (YYYYYYYYYY)"
     2 valid identities found

こんな感じで見つかります。ちなみにApple DevelopmentでもApple Distributionのどちらもで良いみたいです。先程覚えたYYYYYYYYYYに対応するIdentityの値をコピーします。

insert_dylib#

バイナリがFridaGadget.dylibを読み込めるようにパッチを当てます。

git clone https://github.com/Tyilo/insert_dylib
cd insert_dylib
xcodebuild
sudo cp build/Release/insert_dylib /usr/local/bin/insert_dylib

元々のコードでは最後のコマンドにsudoはついていなかったのですが、これがないとパーミッションエラーで怒られたので入れておきます。

ちなみにこれは一回やれば二回目以降は不要です。

ios-deploy & applesign#

yarn global add ios-deploy applesign

署名とかアプリのインストールに必要なツールをインストールします。

FridaGadget.dylib#

ReleasesからFrida GadgetのiOS向けのdylibをダウンロードします。

最新のFrida Gadgetは16.1.7なのですがまだバイナリがないので16.1.6で代用します。

frida-gadget-16.1.6-ios-universal.dylib.gzをダウンロードして展開し、ファイル名をFridaGadget.dylibに変更します。

手順#

此処から先は集めたファイルを使います。

com.nintendo.znca.ipa
FridaGadget.dylib
embedded.mobileprovision

IPAのビルド#

Objectionのpatchipaでもできるみたいなことが書いてあるのですが、自分の環境だと何度やっても署名が正しくできなくて詰みました。

労力としては一緒なのでMakefileで実行できるようにしました。

PHONY: patch
patch:
	unzip -o ${BUNDLE_IDENTIFIER}.ipa
	cp FridaGadget.dylib Payload/${BINARY_TARGET}.app/Frameworks
	insert_dylib --strip-codesig --inplace '@executable_path/Frameworks/FridaGadget.dylib' Payload/${BINARY_TARGET}.app/${BINARY_TARGET}
	codesign -f -v -s ${HASH_IDENTITY} Payload/${BINARY_TARGET}.app/Frameworks/FridaGadget.dylib
	zip -qry ${BUNDLE_IDENTIFIER}.patched.ipa Payload
	applesign -i ${HASH_IDENTITY} -m embedded.mobileprovision -o ${BUNDLE_IDENTIFIER}.signed.ipa ${BUNDLE_IDENTIFIER}.patched.ipa
	unzip -o ${BUNDLE_IDENTIFIER}.signed.ipa
	rm ${BUNDLE_IDENTIFIER}.patched.ipa 

PHONY: install
install:
	ios-deploy --bundle Payload/${BINARY_TARGET}.app --debug -W

必要なパラメータは三つで、それらは.envに書きます。

BUNDLE_IDENTIFIER=com.nintendo.znca
HASH_IDENTITY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
BINARY_TARGET=Coral

HASH_IDENTITYは上の方でコピーした超長い文字列です。

のような出力がでてきます。

com.nintendo.znca-frida-codesigned.ipa

みたいなのが出力されます。

未脱獄でもバイナリ解析をしよう
https://fuwari.vercel.app/posts/2023/11/frida/
Author
tkgling
Published at
2023-11-26