Dropbox iOSクライアント保護をバイパスする





ユーザーデータをdata索好きな目から隠すタスクに直面した場合、iOS開発者は最初に何をしますか? もちろん、パスワード保護画面を統合します。 特にunningな開発者はNSUserDefaultsにユーザー設定のパスワードを保存することさえしませんが、キーチェーンでそれを穏やかに隠します-この場合、彼と顧客の両方の目にあるアプリケーションはすぐに「超保護」カテゴリに転送されます。

パブリックドメインにキーを保存することの危険性については説明しません。このような保護を回避するもっと興味深い方法があります。



Cycriptは、実行中にMac OS XおよびiOSアプリケーションに接続できるコンソールユーティリティです。 JavascriptとObjective-C ++のハイブリッドを使用して、実行可能アプリケーションのコードを処理します。 このプロジェクトは2007年から始まっており、当初はJavascriptとObjective-Cの間の橋渡し役を務めていました。 まず第一に、Cycriptは興味深いものです。「内部」からアプリケーションを探索し、オブジェクトにメッセージを送信できるからです。 ところで、プロジェクトの作者はサウリク自身です。



注: Cycriptを使用するには脱獄が必要です(ただし、開発者はライブラリをプロジェクトに接続して、「クリーンな」デバイスでアプリケーションをテストできます)。


Cycriptのインストールは非常に簡単です-最新バージョンのパッケージをダウンロードし、 sftp経由でデバイスにアップロードします。

sftp>put cycript.deb
      
      





次に、sshを介して接続し、パッケージをインストールします。

 iPad:/tmp root# dpkg -i cycript.deb
      
      





テストオブジェクトとしてDropboxクライアントが選択されたため、アプリケーションを開くたびに表示されるパスワード保護画面を設定できます。 事前にパスワードリクエストオプションを有効にしてDropboxを起動します。





実行中のアプリケーションのプロセス識別子を見つけて、それに接続します。

 iPad:~ root# ps aux | grep Dropbox mobile 283 0.0 10.1 641388 52020 ?? Ss 5:41PM 0:19.15 /var/mobile/Containers/Bundle/Application/93E2B5E6-B7EC-4D18-9697-021D24429D29/Dropbox.app/Dropbox root 328 0.0 0.1 536256 440 s000 S+ 6:07PM 0:00.01 grep Dropbox iPad:~ root# cycript -p 283
      
      





実行中のアプリケーションのrootViewControllerを見てみましょう。

 cy# UIApp.keyWindow.rootViewController #"<DBSplitViewController: 0x16bc02a0>"
      
      





次に、現在画面に表示されているコントローラーを確認します。

 cy# UIApp.keyWindow.rootViewController.presentedViewController #"<PasscodeFullscreenController: 0x187c8b50>"
      
      





名前は励みになります:) Cycriptを使用する強みの1つに戻り、選択したクラスに固有のすべてのメソッドを表示する関数を定義します。

 function printMethods(className) { var count = new new Type("I"); var methods = class_copyMethodList(objc_getClass(className), count); var methodsArray = []; for(var i = 0; i < *count; i++) { var method = methods[i]; methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)}); } free(methods); free(count); return methodsArray; }
      
      





これで、この関数を使用してPasscodeFullscreenControllerの機能を確認できます。

 cy# printMethods(PasscodeFullscreenController)
      
      





 [{selector:@selector(initWithPasscodeViewController:),implementation:0xdf551},{selector:@selector(dealloc),implementation:0xe0131},{selector:@selector(shouldAutorotate),implementation:0xe0045},{selector:@selector(supportedInterfaceOrientations),implementation:0xe010d},{selector:@selector(viewDidLoad),implementation:0xdf5b1},{selector:@selector(.cxx_destruct),implementation:0xe0181}]
      
      





次に、このクラスの現在のインスタンスを含む変数を宣言し、その変数のリストを確認します。

 cy# var PasscodeFullscreenController = #0x187c8b50 #"<PasscodeFullscreenController: 0x187c8b50>" cy# *PasscodeFullscreenController
      
      





 {isa:#"PasscodeFullscreenController",_view:#"<UIView: 0x187c9870; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x187c9800>>",_tabBarItem:null,_navigationItem:null,_toolbarItems:null,_title:null,_nibName:null,_nibBundle:#"NSBundle </private/var/mobile/Containers/Bundle/Application/93E2B5E6-B7EC-4D18-9697-021D24429D29/Dropbox.app> (loaded)",_parentViewController:null,_childModalViewController:null,_parentModalViewController:#"<DBSplitViewController: 0x183c3ca0>",_previousRootViewController:null, ... _presentationSizeClassPair:{width:0,height:0},_navigationControllerContentInsetAdjustment:{top:0,left:0,bottom:0,right:0},_contentOverlayInsets:{top:20,left:20,bottom:0,right:20},__embeddedViewFrame:{origin:{x:0,y:0},size:{width:0,height:0}},_passcodeController:#"<PasscodeViewController: 0x187c8730>"}
      
      





どうやら、 PasscodeViewControllerで直接必要です:

 cy# printMethods(PasscodeViewController)
      
      





 [{selector:@selector(dismissPasscodeAnimated:),implementation:0xa933d},{selector:@selector(initWithPasscodeEntryMode:),implementation:0xa7801},{selector:@selector(presentPasscodeModalAnimated:),implementation:0xa91c5}, ... {selector:@selector(presentationControllerForPresentedViewController:presentingViewController:sourceViewController:),implementation:0xaba01},{selector:@selector(canCancel),implementation:0xa95b9},{selector:@selector(setCanCancel:),implementation:0xa9575}]
      
      





最初の方法は、まさに私たちが興味を持っていることをするようです。 チェック:

 cy# var PasscodeViewController = #0x187c8730 #"<PasscodeViewController: 0x187c8730>" cy# [PasscodeViewController dismissPasscodeAnimated:YES]
      
      





このメソッドが呼び出されると、パスワード画面が魔法のように非表示になり、ログインしているユーザーのファイルへのフルアクセスが取得されます。





それでも、毎回パスワードを入力するのは非常に面倒なので、最大の目標は完全に無効にすることです。 アプリケーション設定を確認します。





「パスコードロック」を選択すると、使い慣れたパスワード入力フォームが表示されます。 既に知っている方法を使用して、それを取り除きます。

 cy# var PasscodeController2 = #0x1992aab0 #"<PasscodeViewController: 0x1992aab0>" cy# [PasscodeController2 dismissPasscodeAnimated:YES]
      
      









しかし、今回は、パスワードメニューが表示されないため、フォームを単に非表示にしても問題は解決しません。 別の方法を探してみましょう。

PasscodeViewControllerが受信できるすべてのメッセージを見てみましょう(これには、親とカテゴリのメソッドも含まれます)。

 cy# PasscodeViewController.messages
      
      





数百の異なるセレクターの中で、次のことが重要です。

 db_handleVerifyModeCorrectPasscodeEntered:0xb1bd5
      
      





実際、彼の呼び出しはパスワード入力画面を閉じ、設定を開きます。 パスワードが無効になっていることを確認したら、同じことを繰り返します。





これで、アプリケーションを安全に閉じることができます-パスワードの入力は不要になりました。



Cycriptのすべての機能を考慮していませんでした-さらに、クラス、カテゴリの定義、ブロックの操作、追加のライブラリのインポート、メソッドのスウィズルの実行が可能です-つまり、これはあなた自身とサードパーティのアプリケーションの両方をテストするための非常に強力なツールです。



そして最後に、さらなる研究のためのリンクの小さなリスト:




All Articles