2016-12-06 8 views
1

現在、私は現在問題をデバッグしており、これがどのように起こる可能性があるか把握しようとしています。ここでこのアドレスが64ビットMacOSアプリケーションのどこから来るかを調べる方法

がobj-Cランタイムでメソッドの集合体である、私はレジスタとアドレスを表示するためにXcodeののlldbを使用していobjc_msgsend()

libobjc.A.dylib`objc_msgSend: 
    0x7fff9084a0c0 <+0>: testq %rdi, %rdi 
    0x7fff9084a0c3 <+3>: je  0x7fff9084a140   ; <+128> 
    0x7fff9084a0c6 <+6>: testb $0x1, %dil 
    0x7fff9084a0ca <+10>: jne 0x7fff9084a14b   ; <+139> 
    0x7fff9084a0cd <+13>: movabsq $0x7ffffffffff8, %r11 
    0x7fff9084a0d7 <+23>: andq (%rdi), %r11 
    0x7fff9084a0da <+26>: movq %rsi, %r10 
    0x7fff9084a0dd <+29>: andl 0x18(%r11), %r10d 

と呼ばれます。 +13(を期待)オフセット後

(lldb) register read 
r11 = 0x00007fff74a940f0 (void *)0x00007fff74a94118: NSObject 

:ここ

は面白い、私が最初に0( を期待)オフセットでレジスタをチェックアウト私が得る出力、ある

(lldb) register read 
r11 = 0x00007ffffffffff8 

オフセット後+23(予想外):

(lldb) register read 
r11 = 0x0000000100761138 (void *)0x0000000100761160: GTMOAuth2WindowController 

そして、私はこの時点でレジスタをpo場合:私は失われたよどこだからここ

(lldb) po $rdi 
<GTMOAuth2WindowController: 0x6100001c2850> 

(lldb) po &$rdi 
0x000000010bc2b3b8 

(lldb) po $r11 
GTMOAuth2WindowController 

(lldb) po &$r11 
0x000000010bc2b3b8 

です。オフセット+23の後、私はregister read0x0000000100761138。私はそれが(私たちはisaプロパティを見ているので、期待されている)クラス名を出力po $r11場合、それは0x6100001c2850+23

で間接参照からのオブジェクトの位置を持つことが期待され、もしいただろう私はポインタのメモリ内の場所を印刷します、それはregister readのアドレスに一致しません、それは%rdi(期待)のアドレスに一致します。 <+23>%r11に対処

+1

あなたは[reverseengineering.se]に参加したいと思うかもしれません。 – usr2564301

+0

面白いですが、私がそこに見た質問の100%は、何が起こっているのか分かりません。私はそれがあれば適切に質問するのに十分な知識があるとは思わない。まだ物事を把握しようとしています。おかげでstackexchangeを心がけています^^ –

+1

リバースエンジニアリングに参加してもいいですか、そうでない場合でも、この質問(とそのようなもの)は完全にスタックオーバーフローのトピックになっています。もしあなたが好きなら、ここで彼らに依頼してください。(しかし、おそらく、両方のサイトに同じ質問を投稿しないことをお勧めします。ユーザの重複があり、情報が断片化されることは望ましくありません!) –

答えて

2

0x0000000100761138は、あなたのGTMOAuth2WindowControllerクラスを表すクラスオブジェクトのアドレスです。

コンパイル時にクラスを定義すると(@interface@implementation)、実行時にクラスを表す特別なオブジェクトがあります。実際、それは「クラスオブジェクト」と呼ばれ、作成したすべてのオブジェクトと同じように実際のオブジェクトです。これは、クラスオブジェクト自体がメッセージに応答できることを意味します。 <+23>の後にpo %r11と言ったとき、デバッガはメッセージをクラスオブジェクトに送りました。クラスオブジェクトのdescriptionメソッドは、クラスの名前をNSStringとして返します。そのため、デバッガはクラス名を出力します。

You can learn more about class objects here。そのページの画像リンクはChromeで壊れていますが、クリックするとPDFが表示されます。

+0

意味が分かります。私はそれを得たと思う。だから最後のフォローアップの質問は、私はクラス( 'po&$ r11')へのポインタの位置を表示すると、それは私にインスタンスへのポインタの位置を返したのですか? '0x000000010bc2b3b8'と**ではなく**クラスへのポインタの位置? '0x0000000100761138' –

+0

' $ r11'のようなレジスタにはアドレスがないので、 '&$ r11'の印字は意味を持ちません。私はそれが本当の意味を持っているとは思わない。それはlldbの実装方法の成果物に過ぎません。 –

+0

haha​​ duh。脳のおなら。良い呼び声 –

関連する問題