1

iPhone のデバッグ サーバーに接続し、GDB シリアル プロトコルパケットを送信できます。ブレークポイントを設定して、到達するまで待つことができます。既知のパラメーターを使用して objc_msgSend を呼び出したい場合は、出力を取得して実行を続けます。今のところ、xcode と lldb でプロセスをシミュレートしているため、'call objc_msgSend(object, _cmd)' だけを使用することはできません。

私がやること:

  • コードにブレークポイントを設定する
  • register read pc // 次の操作アドレスを読み取る
  • register write lr 0x0x0000253a // 実行を継続するための戻りアドレスを設定 (pc 値)
  • register write pc 0x30300c88 // 私の objc_msgSend アドレス
  • register write r0 0x16ed30 // オブジェクトのアドレス
  • register write r1 0x3161 // 私のセレクタアドレス
  • ブレークポイント セット -a 0x0x0000253a
  • 継続する

そのため、メソッドを呼び出しましたが、アプリがクラッシュし、「リターンアドレス」0x0x0000253a に到達しません。また、戻り値で r0 を書き換えるので、私のメソッドは完全に不完全です。私がしていることは、以前の値を保存および復元せずにハードコアなレジスターの上書きであることを理解しているので、助けてください。レジスタの状態を保存/復元するにはどうすればよいですか、間違っていること、または実行していない必要なことは何ですか?

また、「objc_msgSend の呼び出し」中に xcode のデバッガーが何を行っているかをトレースすることも非常に役立ちます。このコードとfruitstrapを使用してdtrussを使用し、その出力を調査しようとしました-何千ものメモリ読み取りとブレークポイントセットがあり、役に立たなかった.

注: GDB シリアル プロトコルのみを使用できます。

4

0 に答える 0