1

ソースコードを持っていないiOSアプリケーションをデバッグしていますが、それは削除されたバイナリであるため、使用できるシンボルがありません。したがって、IDA とクラスダンプを利用して、アドレスを使用して bps を設定します。特定のメソッドの戻り値またはパラメーターを本当に理解できない状況に陥りました。パラメーターは $r2 レジスター上にあるはずであり、メソッドの戻り値は $r0 にあることを知っています。

NSData* ポインターを返す subDataWithRange メソッドを見てみましょう。もちろん、「po pointer_addr」を実行することはできません。シンボルがないため、gdb が失敗するからです。というわけで、自分なりに内容を調べてみました。取得する必要があるバイトについてはかなり確信がありますが、ポインターを取得しますが、「x/20x $r0」などを実行してその内容を調べると、意味のあるバイトが表示されません。

したがって、メモリ内の生のバイトに表示される NSData* オブジェクトと NSString などの他の ios オブジェクトの構造についてお尋ねしたいと思います。構造はどのようなものですか?私が見つけられなかった構造内のどこかに、返されたバイトを実際に指しているポインタがありますか?

4

1 に答える 1

0

運が良ければ、 Apple の Open Source CFLite リリースから実装を垣間見ることができます。ここで、CFDataは次のように定義されています。

struct __CFData {
    CFRuntimeBase _base;
    CFIndex _length;    /* number of bytes */
    CFIndex _capacity;  /* maximum number of bytes */
    CFAllocatorRef _bytesDeallocator;   /* used only for immutable; if NULL, no deallocation */
    uint8_t *_bytes;    /* compaction: direct access to _bytes is only valid when data is not inline */
};

これにより、オブジェクトがメモリにどのように配置されているかの手がかりが得られますが、多くのフレームワークのソース コードは非公開であり、それらがどのように配置されているかを理解するには、試行錯誤に頼る必要があります。実装されました。

混乱を助長するために、多くのNSオブジェクトはそれらのCF同等物に無料でブリッジされており、NSData/CFDataはそれらのオブジェクトの 1 つです。これが与える影響については確信が持てません。

私はあなたの仕事をうらやましく思いません。

于 2013-06-03T09:05:39.257 に答える