Posted at

Cycript入門 〜アプリをハックしてデバッグしてみよう〜

More than 3 years have passed since last update.


はじめに

この記事は、

僕が主宰する 『スマートデバイス向けアプリのマネタイズ研究と実践開発』ゼミ

活動記録です。


ゼミについて

株式会社サイバーエージェント アドテク本部 アドテクスタジオ内の活動です。

詳しくは、ゼミ『スマートデバイス向けアプリのマネタイズ研究と実践開発』まとめをご参照ください。


用意するもの


  • ジェイルブレイク済みのiOS端末

  • Cydiaがインストールされている

下記のドキュメントはCydiaを前提としています。


目的

Cycriptは、既存のアプリにコードを突っ込むことができるので、リリース後のアプリに対してもデバックに使えるかなと思っています。

このツールは、Objective-CとJavaScriptのハイブリッドのツールらしく、ターミナルにObjective-Cのコードを入力するだけでそのアプリ内で実行することができるらしい。


目標

参加者全員が 適当なアプリのボタンやラベルの内容を外から変更する を達成する


Cycript入門

以下の操作について、ジェイルブレイク前提であり、自己責任でお願いします。


参考になったサイト


主なオペレーション


  • Cydiaを使う


    • Cycriptをインストールする

    • OpenSSHをインストールする



  • iPhoneにMacからSSHでログインする

  • Cycriptでアプリを操作する


    • Process Injection

    • アプリの画面構成をハックする

    • ボタンの色やテキストをハックする

    • ボタンイベントをハックする




Cydiaを使う

CycriptやOpenSSHをインストールするのに使用します。僕の脱獄方法の場合です。

IMG_0001.PNG


Cycriptをインストールする

今回のお題でもあるこいつをインスールします。

IMG_0016.PNG


OpenSSHをインストールする

ついでにOpenSSHもインスールします。

IMG_0004.PNG


iPhoneにSSHでログインする

自分のMacのターミナルから、iPhoneのIPアドレスを指定してsshログインします。初期パスワードは、alpine です。

$ ssh root@[IPアドレス]

root@IPアドレス password:[alpine]
root#


Cycriptでアプリを操作する

操作したいアプリのプロセスをチェックし、cycriptで指定して起動する。

下記では、UBER を題材にすすめます。

重要 下記作業前にUBERをインストール&起動しておきます。


起動直後の画面はこんな感じ。

IMG_0011.PNG


Process Injection

cycript -pを使って、プロセスにアタッチします。

root# ps aux | grep UberClient

mobile 1660 0.0 4.4 815456 90912 ?? Us 6:49PM 0:02.64 /var/containers/Bundle/Application/E3330-CBE5-40AC-8365-66E075C6C04C/UberClient.app/UberClient
root# cycript -p 1660
cy#


アプリの画面構成をハックする

cy# UIApp.keyWindow.recursiveDescription()

@"....現在表示中の画面構成を再帰的に表示されます、結果はキャプチャのみで"

ダーッとでます

スクリーンショット 2016-09-20 23.17.40.png


中央の UBER 画像をハックする

こんな感じで、オブジェクトを取得するには、画面構成からIDを探してインスタンスを生成したります。

cy# var imageView = new Instance(0x151101f30);

cy# var droidUrl = [NSURL URLWithString:@"https://andropp.jp/webapp/wp-content/uploads/2014/11/android-wallpaper5_2560x1600_1.jpg"];
cy# var droidData = [NSData dataWithContentsOfURL:droidUrl];
cy# var droidImage = [UIImage imageWithData:droidData];
cy# imageView.image = droidImage;


UBERアイコン画像が消えて、droidくんになってもーたw

IMG_0012.PNG


登録ボタンをハックする

var signupButton = new Instance(0x14fe47730);

[signupButton setTitle:@"hogeeee" forState:UIControlStateNormal];




と入力すると 登録 という文字が....

IMG_0013.PNG

....hogeeee になってるw

ちなみに、登録ボタンを端末に触らずに押しちゃうには....

cy# [signupButton sendActionsForControlEvents:UIControlEventTouchUpInside];

これで、起動!

IMG_0016.PNG


まとめ

iOS端末をジェイルブレイクしないといけないので、少し敷居が高い。

Cycriptを使ったハックは、既存アプリの研究を目的とした活用に向いてそう。

また、アプリ側にバックドアを意識した仕掛けを用意しておけば、強力なデバッグができそう(そんな仕掛け、怖くてアレだけど)。