逆アセンブラを使用した iOS アプリのリバースエンジニアリング

ipaファイルとして提供されているアプリや、ソースコードが公開されていないフレームワークについて深く調査したい場合、逆アセンブラを活用できます。ADEPの規約違反で削除されたアプリに対して「なぜこのアプリを App Storeで配布できなかったのか」という疑問を持ちましたが、アプリを逆アセンブルすることでその理由が見えてくるかもしれません。

この記事では逆アセンブラツール「Hopper」を使用して iOS アプリをリバースエンジニアリングする方法について説明します。

ipa ファイルを展開する

最初に、調査する対象の ipa ファイルを展開します。 ipa ファイルは zip 形式の圧縮ファイルなので、unzip コマンドなどで展開することができます。

unzip <ipaファイル>

ファイルを展開すると、Payload というフォルダが出力されます。この Payload フォルダにはアプリが含まれています。

f:id:watanabetoshinori:20180920231832p:plain:w480

アプリを右クリックしてパッケージの中身を表示すると、アプリの使用している画像や実行ファイルを確認することができます。

f:id:watanabetoshinori:20180920232134p:plain:w480

また、Framework フォルダにはアプリが使用しているフレームワークが格納されています。

f:id:watanabetoshinori:20180920232235p:plain:w480

今回調査に使用したアプリは SIM カードを操作する機能がありますが、Framework フォルダにある slimduetSimKit フレームワークが SIM 操作を行うためのフレームワークと推測されます。slimduet という名称で検索すると類似のサービスが見つかることから、このアプリは同サービスの OEM または技術協力等を受けているのかもしれません。

アプリを逆アセンブルする

Mac には otool や strings などアプリの中身を調査するためのツールが用意されていますが、より細かい調査を行いたい場合は逆アセンブルを行います。ここでは、逆アセンブラツールとして Hopper を使用します。

https://www.hopperapp.com

逆アセンブルするには、アプリの実行ファイルやフレームワークを Hopper へドラッグ & ドロップします。 ファイルが複数のアーキテクチャを含む場合はどのアーキテクチャを解析するか選択します。

f:id:watanabetoshinori:20180920234947p:plain:w480

アーキテクチャを選択するとコードが逆アセンブルされ、アセンブラコードが表示されます。

f:id:watanabetoshinori:20180920235002p:plain:w480

Hopper ではコードの表示方法としてを以下の4種類をサポートしています。

  • Assembly
  • Control Flow Graph(グラフ)
  • Pseudo-Code(擬似コード)
  • Hexadecimal

画面分割と併用すると、これら複数の表示を同時に確認することができるため、アセンブラに詳しくなくても処理を追うことができます。

f:id:watanabetoshinori:20180921000014p:plain:w480

今回調査に使用したアプリでは、slimduetSimKit フレームワーク内でいくつかのプライベートAPIを呼び出しているらしき箇所が確認できました。アプリが SIM を操作する際にはこのフレームワークを経由して行なうようなので、このフレームワークの存在が App Store にアプリを申請できず、規約違反後にアプリの機能修正も行えなかった理由に関係しているのではないかと推測されます。

その他の活用方法

Hopper を使用すると、逆アセンブルしたコードを修正し、再度アプリの実行ファイルを出力することが可能です。 特定の処理をスキップする程度であれば比較的簡単にできますので、再署名と組み合わせれば配布されているアプリやフレームワークの挙動を一部修正して使用するといったことも可能です。*1

*1:App Store で配布されているアプリは DRM で保護されているため、逆アセンブルする際には DRM の解除が必要になります。