前書き

私は普段、日常のアプリのハック要求を満たすために、脱獄版のiOSを使う習慣があります。例えば、以下のような用途があります:

  • YouTubeの広告除去&バックグラウンド再生の解除
  • アプリ起動時の広告削除
  • 本格的なバックグラウンド動作の実現

しかし、システムを脱獄すると一定のセキュリティリスクが伴い、一部のアプリは脱獄環境下での実行を阻止する場合があります。このような脱獄検出を回避する手法を「jailbreak bypass」と呼びます。

ここでは、ある銀行のアプリを例に挙げ、重要な関数を特定し、それをフックする基本的な方法を紹介します。

材料

  • Hopper Disassembler(ARMバイナリ解析ツール)
  • Theos(フック用ツール)

ポイント関数を探す

i. アプリ内での警告メッセージに基づき、Hopper Disassemblerでバイナリ実行ファイル内の該当文字列を検索します。

ii. 検索した文字列の参照先で、対応する仮想アドレスを特定します。例では、0000000103e264d8が該当します。

iii. 仮想アドレス0000000103e264d8を右クリックして、このアドレスに関連する参照アドレスを調べます。

すると、以下の参照が見つかります:

103fc5620     dq    ___CFConstantStringClassReference, 0x7d0, 0x103e264d8, 0xc ; u"检测到您的设备非安全设备"

上記のアセンブリコードを見ると、定数文字列クラスCFConstantStringClass内のARM命令dqが、この文字列のメモリ割り当てを完了していることが分かります。

iv. 重要な参照関数を特定し、Hopperの逆アセンブル機能を使用して疑似コードを確認します。

疑似コードを見ると、CIBDeviceSaveToolクラスの静的メソッド+(void)checkCibSaveEmvがこの文字列を参照していることが分かります。この関数が重要な役割を担っていると特定したら、この関数をフックして実行をスキップする準備を進めます。

フック

コードは非常にシンプルです:

// 詳細は http://iphonedevwiki.net/index.php/Logos を参照

#if TARGET_OS_SIMULATOR
#error シミュレータはサポートしていません。本物のiPhoneデバイスを使用してください。
#endif

#import <UIKit/UIKit.h>
%hook CIBDeviceSaveTool

+(void)checkCibSaveEmv {
// 何もせず、関数ロジックをスキップ
NSLog(@"checkCibSaveEmv がフックされました");
return;
}
%end

完成

フックが成功し、アプリに非安全デバイスの警告が表示されなくなりました。


生きて生きて生きて生きて生きて。