iOS逆教程のダイナミックデバッグ詳細解


前言
他の人のアプリの呼び出しの流れをもっと知りたい時は、アプリを実行する時に動的なデバッグが必要です。ダイナミックデバッグとは、プログラムを実行して、ブレークポイント、プリントなどの方法でパラメータ、戻り値、関数呼び出しフローなどを確認することです。
下の話は多くなくなりました。小編と一緒に詳しく紹介してみましょう。
Xcodeのダイナミックデバッグの原理
まず、Xcodeのコンパイルとモデレータの発展を理解してください。Xcodeの中のコンパイラの発展の過程:GCC->LLVM、モデレータの発展の過程:GDB->LLDB。
Xcodeのデバッグを携帯電話にインストールするアプリケーションの原理:XcodeはLLDBデバッグコマンドを通じて携帯電話にデバッグコマンドを送信し、debugserverは相応のAPPと相互作用してデバッグの効果を達成します。
debugserverは最初はMacのXcodeに保存されていました。パス:

/Applications/Xcode.app/Contents/Developer/Platforms
/iPhoneOS.platform/DeviceSupport
/9.1/DeveloperDiskImage.dmg
/usr/bin/debugserver
Xcodeが携帯機器を認識すると、Xcodeは自動的にdebugserverを携帯電話にインストールします。
Xcodeデバッグの制限:一般的にはXcodeでインストールされたAPPしかデバッグできません。他のAPPをデバッグすることができません。
debugserverに権限を与える
デフォルトの場合/Developer/usr/bin/debugserverは一定の権限がなく、XcodeでインストールされたAppを通じてデバッグするしかありません。他のAppをデバッグしたいなら、debugserverに再署名して、他のAppをデバッグする権限が必要です。
必要な二つの権限は、get-task-allowとtask_です。for_pid-allow
iPhone上の/Developerディレクトリは読み取り専用で、直接に対/Developer/usr/bin/debugserverファイルに署名することはできません。まずdebugserverをMacにコピーする必要があります。
IDDコマンドでファイルの前の署名権限をエクスポートします。

$ ldid -e debugserver > debugserver.entitlements
debugserver.entitlementsというファイルは実はplistファイルです。このファイルに上記の二つの権限を追加して、ldIDコマンドでファイルに再署名します。

$ ldid -Sdebugserver.entitlements debugserver
そして権限をすでに署名したdebugserverを/usr/binディレクトリに置いて、debugserverコマンドを見つけやすくなります。
debugserverは、あるAPPプロセスに追加されます。

$ debugserver *:    -a   
  • *:ポート番号:iPhoneのあるポートを使ってdebugserverサービスを開始する(予約ポートではない)
  • -aプロセス:APPのプロセス情報(プロセスIDまたはプロセス名)を入力する
  • Mac遠隔接続iPhone上のdebugserverサービス
    起動LLDB:
    
    //      
    $ lldb
    接続debugserverサービス
    
    (lldb) process connect connect://  IP  :debugserver     
    LLDBのcコマンドを使ってプログラムを先に運転させます。
    
    (lldb) c
    これで、遠隔的に他の人のアプリを調整できます。
    常用のLLDB指令
    View Controllerのtestメソッドにブレークポイントを設定します。
    
    breakpoint set -n "-[ViewController test]"
    コマンドを参照すると、ユーザーはhelpコマンドを使用します。help breakpointなど。
    プリントスレッドのスタック情報:thread backtrace
    多くのコマンドはここでは説明しません。http://lldb.llvm.org/lldb-gdb.htmlを参照してください。
    ASLR
    ASLRのオフセットを取得します。
    
    image list -o -f
    印刷結果の第二列の前の住所は私達が必要とするASLRのオフセット量offsetです。
    もし私たちがあるクラスのtestメソッドにブレークポイントを追加したいなら、Hooperツールを通じてこの方法の最初のメモリアドレスを見つけます。もし0 x 0101であれば、アドレスに加えて私たちが得たASLRのオフセット量はこの方法の実際のアドレスです。そして、このアドレスを通して方法にブレークポイントを与えます。
    
    breakpoint set -o 0x010101+offset
    この方法にブレークポイントを追加しました。その後、プログラムがこの方法を呼び出すと、ブレークポイントで停止します。
    おわりに
    lldbの各種コマンドを練習する時、Xcodeでいろいろな使い方を練習することをオススメします。ヒントと直感的な出力結果があるので、分かりやすいです。
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考となる学習価値を持っています。質問があれば、メッセージを書いて交流してください。ありがとうございます。