ios逆向工程-動態分析


前回は静的なツールで応用を分析しました.
まず、なぜ応用を分析しますか?もしあなたが一つのiosアプリケーションから有益な情報を得たいなら、あるいはそのアプリケーションの機能を修正したいなら、もちろんそのアプリの論理と構造を先に知ることが前提です.
動的共有ツールが少ないです.まず簡単なものを分析します.
  • Cycript
  • 参考資料:http://www.cycript.org/
                  http://iphonedevwiki.net/index.php/Cycript
    cycriptはスクリプト言語で、Objective-JavaScriptとして見られると言われています.CycriptはCydiaのソースCydia/Telesphoreoの中にあります.インストールが終わったらsshでiosにログインします.
    ssh [email protected]
    分析するアプリケーションを駆動してPIDを確認してください.ここで自動起動のデスクトップSprigBoardを例にとってください.
    ps aux | grep SpringBoard
    mobile    1514   0.7 10.6   577300  54720   ??  Ss    3:46PM   1:19.28 /System/Library/CoreServices/SpringBoard.app/SpringBoard
    PID(1514)が見つかったら、Cycriptでチェックします. 
    cycript -p 1514 
    cycript -p SpringBoard
    上の二つは全部応用できます.チェックしてからは好き勝手にしてもいいです.まず窓を弾いてください.
    cy# var alert = [[UIAlertView alloc] initWithTitle:@"asd" message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
    #"<UIAlertView: 0x19c200f0; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x19c8e730>>"
    cy# [alert show]
    すべての割り当てられたデータはcycriptによって印刷されます.スクリーンを切ってください.スクリーンはどのように調整しますか?これも困りました.これでまず静的なツールのclass-dumpでヘッダファイルをエクスポートして、それからshotを探します.ハハ、出てきました.
    ios逆向工程-动态分析_第1张图片
    ios逆向工程-动态分析_第2张图片
    cy# var shot = [SBScreenShotter sharedInstance]
    #"<SBScreenShotter: 0x19ccda20>"
    cy# [shot saveScreenshot:YES]
    Ctrl+D終了 
    2.GDB
    cycriptは機能が強くて、文法はocに似ていて、とても使いやすいです.でも、致命的な欠点があります.つまり、断点ができなくて、具体的な位置で結果を見ることができません.この時にGDBが出ます.もちろんGDBは早く出てきました.GDBは強力なデバッグツールです.GDBでどうやってテストしますか?
    GDBフルネームthe GNU Project Debuggerはcydiaにあります.http://cydia.radare.org)で降りることができます.
  • GDBチェックを適用し、Cycriptと同様にPIDによっても、アプリケーション名
  • を使用することができます.
    gdb -p SpringBoard
    gdb -p 1514
      またはgdbを先に呼び出してから、atchを使ってアプリケーションにチェックを付けるのも同じです.チェックを外してdetachを使います.
      2.ブレークポイントbreak  
    b -[SpringBoard menuButtonDown:]
    b *(0xc41e)
    bブレークポイントは関数上で切れることができます.直接にメモリアドレスを切ってもいいです.関数のメモリアドレスはどうやって分かりますか?この時はIDAを確認してください.
    ASLRの原因で、一般的にIDAで取得したメモリアドレスは正確ではないです.プログラムを実行するたびにメモリアドレスが一定のずれがあり、GDBでinfo shを使ってオフセットアドレスを取得します.
    gdb$ info sh
    The DYLD shared library state has not yet been initialized.
                                Requested State Current State
    Num Basename  Type Address         Reason | | Source     
      | |            | |                    | | | |
    あなたの妹よ、何もない!!!!(OK、ここで打ち切ります)
    SpringBoardアプリケーションのディレクトリファイルを見つけました.fileコマンドで導入します.
    yuchenghaide-iPod:~ root# ps aux | grep SpringBorad
    root      1915   0.0  0.1   338564    520 s000  S+   11:02AM   0:00.01 grep SpringBorad
    yuchenghaide-iPod:~ root# ps aux | grep SpringBoard
    mobile    1514   0.0 11.3   588168  58320   ??  Ss    3:46PM   1:39.55 /System/Library/CoreServices/SpringBoard.app/SpringBoard
    root      1917   0.0  0.1   338608    512 s000  S+   11:02AM   0:00.01 grep SpringBoard
    root      1877   0.0  0.4   349304   2124 s000  S    10:18AM   0:00.29 cycript -p SpringBoard
    yuchenghaide-iPod:~ root# cd /System/Library/CoreServices/SpringBoard.app/
    yuchenghaide-iPod:/System/Library/CoreServices/SpringBoard.app root# gdb
    GNU gdb 6.3.50.20050815-cvs (Fri May 20 08:08:42 UTC 2011)
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "--host=arm-apple-darwin9 --target=".
    gdb$ file SpringBoard
    unable to read unknown load command 0x80000028
    Reading symbols for shared libraries .. done
    unable to read unknown load command 0x80000028
    gdb$ attach SpringBoard
    Attaching to program: `/System/Library/CoreServices/SpringBoard.app/SpringBoard', process 1514.
    0x3877aa58 in ?? ()
    Error while running hook_stop:
    Invalid type combination in equality test.
    gdb$ info sh
    The DYLD shared library state has been initialized from the executable's shared library information.  All symbols should be present, but the addresses of some symbols may move when the program is executed, as DYLD may relocate library load addresses if necessary.
                                               Requested State Current State
    Num Basename                 Type Address         Reason | | Source     
      | |                           | |                    | | | |          
      1 SpringBoard                 - -                 exec Y Y /System/Library/CoreServices/SpringBoard.app/SpringBoard (offset 0x0)
      2 dyld                        - -                 init Y Y /usr/lib/dyld at 0x2be00000 with prefix "__dyld_"
      3 StoreServices               F -                 init Y ! /System/Library/PrivateFrameworks/StoreServices.framework/StoreServices
      4 AirTraffic                  F -                 init Y ! /System/Library/PrivateFrameworks/AirTraffic.framework/AirTraffic
      5 IOSurface                   F -                 init Y ! /System/Library/PrivateFrameworks/IOSurface.framework/IOSurface
      6 MultitouchSupport           F -                 init Y ! /System/Library/PrivateFrameworks/MultitouchSupport.framework/MultitouchSupport
      7 MobileWiFi                  F -                 init Y ! /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi
      8 libIOAccessoryManager.dylib - -                 init Y ! /usr/lib/libIOAccessoryManager.dylib
      9 IOMobileFramebuffer         F -                 init Y ! /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer
     10 CoreSurface                 F -                 init Y ! /System/Library/PrivateFrameworks/CoreSurface.framework/CoreSurface
     11 BluetoothManager            F -                 init Y ! /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager
     12 CrashReporterSupport        F -                 init Y ! /System/Library/PrivateFrameworks/CrashReporterSupport.framework/CrashReporterSupport
     13 EAP8021X                    F -                 init Y ! /System/Library/PrivateFrameworks/EAP8021X.framework/EAP8021X
     14 libmis.dylib                - -                 init Y Y /usr/lib/libmis.dylib at 0xa3e000 (offset -0xff5c2000)
    ちくしょう!offset=0 x 0とはどういうことですか?難しいのは本当に0ですか?試してみました
    gdb$ b -[SpringBoard menuButtonDown:]
    Function "-[SpringBoard menuButtonDown:]" not defined.
    gdb$ b *(0xc41e)
    Breakpoint 1 at 0xc41e
    gdb$ info b
    Num Type           Disp Enb Address    What
    1   breakpoint     keep y   0x0000c41e <_mh_execute_header+46110>
    gdb$ c
      info bはすべてのブレークポイントをプリントアウトし、ブレークポイントを削除するにはdブレークポイント番号を使用することができます.
      cは継続プログラムを表し、ホームキーを押したところ、断点が全然切れませんでした.はい、まとめて、GDBの命令はみんなネットで自由に調べられます.
      「ios応用逆工程」の作者の一人であるスナケニーの解答を経て、やっとios 7.xの後にgdbが捨てられたかもしれないことが分かりました.代わりにlldbです.
      lldbの使用方法について: http://bbs.iosre.com/forum.php?mod=viewthread&tid=52
    まとめ:
    はい、今度はlldbの具体的な使用を共有します.もう一つの言及すべきはxcodeデバッグツールはlldbです.すべての学会はlldbを使うことが大切です.
    また、もし私たちが絶えず努力して欲しいロジックを見つけたら、どうやって攻撃したり修正したりすればいいですか?へへへ、やはり次回を待ってください.
    ゆっくりしてください少年よ!