読者です 読者をやめる 読者になる 読者になる

@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

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

はじめに

この記事は、 僕が主宰する スマートデバイス向けアプリのマネタイズ研究と実践開発』ゼミの 活動記録です。

ゼミについて

株式会社サイバーエージェント アドテク本部 アドテクスタジオ内の活動です。
詳しくは、ゼミ『スマートデバイス向けアプリのマネタイズ研究と実践開発』まとめをご参照ください。

用意するもの

  • ジェイルブレイク済みのiOS端末
  • Cydiaがインストールされている

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

目的

Cycriptは、既存のアプリにコードを突っ込むことができるので、リリース後のアプリに対してもデバックに使えるかなと思っています。
このツールは、Objective-CJavaScriptのハイブリッドのツールらしく、ターミナルにObjective-Cのコードを入力するだけでそのアプリ内で実行することができるらしい。

目標

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

Cycript入門

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

参考になったサイト

主なオペレーション

  • Cydiaを使う
  • Cycriptをインストールする
  • OpenSSHをインストールする
  • iPhoneMacからSSHでログインする
  • Cycriptでアプリを操作する
  • Process Injection
  • アプリの画面構成をハックする
  • ボタンの色やテキストをハックする
  • ボタンイベントをハックする

Cydiaを使う

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

Cycriptをインストールする

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

OpenSSHをインストールする

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

iPhoneSSHでログインする

自分のMacのターミナルから、iPhoneIPアドレスを指定して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を使ったハックは、既存アプリの研究を目的とした活用に向いてそう。
また、アプリ側にバックドアを意識した仕掛けを用意しておけば、強力なデバッグができそう(そんな仕掛け、怖くてアレだけど)。