MASTG-TOOL-0046 Cycript

Cycript は Jay Freeman (別名 Saurik) が開発したスクリプト言語です。これは実行中のプロセスに JavaScriptCore 仮想マシンを注入します。Cycript の対話型コンソールを使用して、ユーザーは Objective-C++ と JavaScript のハイブリッド構文でプロセスを操作できます。実行中のプロセス内の Objective-C クラスにアクセスすることやインスタンス化することがサポートされています。iOS 上で Cydia Substrate Extensions として知られる Cydia ランタイムパッチを開発するための標準フレームワークである Cydia Substrate を使用して、デバッガと同様に Cycript を実行中のプロセスに注入できます。Cycript には、コード注入をサポートするツールである Cynject を含みます。

Cycript をインストールするには、まず SDK をダウンロードし、展開して、インストールします。

#on iphone
$ wget https://cydia.saurik.com/api/latest/3 -O cycript.zip && unzip cycript.zip
$ sudo cp -a Cycript.lib/*.dylib /usr/lib
$ sudo cp -a Cycript.lib/cycript-apl /usr/bin/cycript

対話型 Cycript シェルを起動するには、"./cycript"、または Cycript がパス上にある場合は "cycript" を実行します。

$ cycript
cy#

実行中のプロセスに注入するには、まずプロセス ID (PID) を見つける必要があります。アプリケーションを実行し、アプリケーションがフォアグラウンドにあることを確認します。cycript -p <PID> を実行すると、プロセスに Cycript を注入します。例として、SpringBoard (常に実行されています) に注入してみます。

$ ps -ef | grep SpringBoard
501 78 1 0 0:00.00 ?? 0:10.57 /System/Library/CoreServices/SpringBoard.app/SpringBoard
$ ./cycript -p 78
cy#

最初に試してみることの一つは、アプリケーションインスタンス (UIApplication) を取得することです。これは Objective-C 構文を使用できます。

cy# [UIApplication sharedApplication]
cy# var a = [UIApplication sharedApplication]

ここでこの変数を使用して、アプリケーションのデリゲートクラスを取得します。

cy# a.delegate

Cycript で SpringBoard のアラートメッセージをトリガーしてみましょう。

cy# alertView = [[UIAlertView alloc] initWithTitle:@"OWASP MASTG" message:@"Mobile Application Security Testing Guide"  delegate:nil cancelButtonitle:@"OK" otherButtonTitles:nil]
#"<UIAlertView: 0x1645c550; frame = (0 0; 0 0); layer = <CALayer: 0x164df160>>"
cy# [alertView show]
cy# [alertView release]

Cycript でアプリのドキュメントディレクトリを見つけます。

cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/A8AE15EE-DC8B-4F1C-91A5-1FED35212DF/Documents/"

コマンド [[UIApp keyWindow] recursiveDescription].toString()keyWindow のビュー階層を返します。keyWindow のすべてのサブビューとサブサブビューの説明が表示されます。インデントスペースはビュー間の関係を反映しています。たとえば、UILabelUITextFieldUIButtonUIView のサブビューです。

cy# [[UIApp keyWindow] recursiveDescription].toString()
`<UIWindow: 0x16e82190; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x16e80ac0>; layer = <UIWindowLayer: 0x16e63ce0>>
  | <UIView: 0x16e935f0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x16e93680>>
  |    | <UILabel: 0x16e8f840; frame = (0 40; 82 20.5); text = 'i am groot!'; hidden = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x16e8f920>>
  |    | <UILabel: 0x16e8e030; frame = (0 110.5; 320 20.5); text = 'A Secret Is Found In The ...'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x16e8e290>>
  |    | <UITextField: 0x16e8fbd0; frame = (8 141; 304 30); text = ''; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x16e94550>; layer = <CALayer: 0x16e8fea0>>
  |    |    | <_UITextFieldRoundedRectBackgroundViewNeue: 0x16e92770; frame = (0 0; 304 30); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x16e92990>>
  |    | <UIButton: 0x16d901e0; frame = (8 191; 304 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x16d90490>>
  |    |    | <UIButtonLabel: 0x16e72b70; frame = (133 6; 38 18); text = 'Verify'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x16e974b0>>
  |    | <_UILayoutGuide: 0x16d92a00; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x16e936b0>>
  |    | <_UILayoutGuide: 0x16d92c10; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x16d92cb0>>`

また、指定された Objective-C クラスのインスタンスをヒープから検索する choose などの Cycript の組み込み関数を使用することもできます。

cy# choose(SBIconModel)
[#"<SBIconModel: 0x1590c8430>"]

詳しくは Cycript マニュアル をご覧ください。

Last updated

Was this helpful?