1

我正在调试一个我没有源代码的 ios 应用程序,它是一个剥离的二进制文件,所以没有我可以使用的符号。因此,我在 IDA 和 class-dump 的帮助下使用地址来设置 bps。我遇到过我无法真正理解特定方法的返回值或参数的情况。我知道参数应该在 $r2 寄存器上,并且方法的返回值在 $r0 上。

让我们采用返回 NSData* 指针的 subDataWithRange 方法。当然,我不能做“po pointer_addr”,因为我没有符号,因此 gdb 失败。所以,我正在尝试自己检查内容。尽管我很确定应该返回的字节,但我确实检索了一个指针,但是当我执行“x/20x $r0”之类的操作来检查其内容时,我看不到有意义的字节。

因此,我想询问 NSData* 对象和其他 ios 对象(如 NSString)的结构,因为它们会出现在内存中的原始字节中。结构是什么样的?结构内部是否有一个指针我无法找到,它实际上指向返回的字节?

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就是这些对象之一。我不确定这会产生什么影响。

我不羡慕你的任务。

于 2013-06-03T09:05:39.257 回答