現在、私は現在問題をデバッグしており、これがどのように起こる可能性があるか把握しようとしています。ここでこのアドレスが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 read
? 0x0000000100761138
。私はそれが(私たちはisa
プロパティを見ているので、期待されている)クラス名を出力po $r11
場合、それは0x6100001c2850
、+23
で間接参照からのオブジェクトの位置を持つことが期待され、もしいただろう私はポインタのメモリ内の場所を印刷します、それはregister read
のアドレスに一致しません、それは%rdi
(期待)のアドレスに一致します。 <+23>
後%r11
に対処
あなたは[reverseengineering.se]に参加したいと思うかもしれません。 – usr2564301
面白いですが、私がそこに見た質問の100%は、何が起こっているのか分かりません。私はそれがあれば適切に質問するのに十分な知識があるとは思わない。まだ物事を把握しようとしています。おかげでstackexchangeを心がけています^^ –
リバースエンジニアリングに参加してもいいですか、そうでない場合でも、この質問(とそのようなもの)は完全にスタックオーバーフローのトピックになっています。もしあなたが好きなら、ここで彼らに依頼してください。(しかし、おそらく、両方のサイトに同じ質問を投稿しないことをお勧めします。ユーザの重複があり、情報が断片化されることは望ましくありません!) –