Skip to content

LLDB

このページでは、lldb の使い方について詳しく説明します。(iOS デバイスのプロセスにアタッチするまでの手順は別ページで紹介します)

また、アセンブリが読めない方はARM アセンブリのページを先に学ぶことをオススメします。

この記事では

  • ある程度 ARM アセンブリについて理解している
  • lldb の基本的な使い方(ブレークポイントコマンド、ディスアセンブルコマンド等)は理解している
  • xia0LLDBプラグインがインストール済み

として進めていきます。

基本的な使い方はlldb cheat sheetで学ぶと良いでしょう。

また、わからないコマンドはhelpで詳しい情報を確認することが出来ます。

例えばregister readがわからなければ

help register read

とすることで詳しい情報を確認できます。

シチュエーション別コマンド集

$x8 == 10のときだけブレークしたい。

b 0x1111 # Breakpoint 1
br mod -c "$x8 == 10" 1

逆アセンブラで見つけたアドレスにブレークポイントを置きたい

image dump sections Twitter # "Twitter"の部分はアプリの実行ファイル名

以下のように出力されると思います。

https://kov4l3nko.github.io/blog/2016-04-27-debugging-ios-binaries-with-lldb/#aslrより引用

<__TEXT addressの始端> - <__PAGEZERO addressの終端>

を計算します。この場合以下のようにします。

p/x 0x0000000100058000-0x0000000100000000 # result: 0x0000000000058000

Hopper の示す関数のアドレスが0x1234の場合、0x1234+0x0000000000058000をすることで実際のアドレスを求めることが出来ます。

いちいちこんなことをしていては面倒なので素直にxia0LLDBxbrコマンドを使いましょう。

xbr 0x1234

とすれば、自動で計算をされた位置にブレークポイントを張ってくれます。

現在いるアドレスから任意のアドレスに移動したい

0x1212に移動したければ、

thread jump -a 0x1212

とすることで移動できます。

サブルーチンから呼び出し元にすぐに戻りたい

thread return

とすれば返り値無しで戻る事ができます。

返り値を設定したい場合は

thread return 1

といったようにすれば良いでしょう。

ブレークする度に任意の情報を表示したい

ブレークする度にレジスタを表示したいとします。その場合は

(lldb) target stop-hook add
Enter your stop hook command(s).  Type 'DONE' to end.
> register read
Stop hook #1 added.

このようにすればブレークする度にレジスタが表示されます。