【发布时间】:2018-11-19 20:07:04
【问题描述】:
我正在尝试调查我在代码中访问函数 strlen 中的地址 0 时触发的恐慌消息,该代码基本上是 C++ 并结合了 Objective-C 变量。
产生恐慌的方法不是直接访问strlen,而是从ARC引擎访问,我试图弄清楚strlen是用来作为自动释放变量的一部分的。
根据从反汇编程序复制的下一个块,[rax UTF8String] 的输出似乎产生了 null 而不是有效字符串,这最终导致了崩溃。也许任何人都可以告诉我在 autoreleasing 变量之后需要检查的 Objective-C 的内部布局是什么。
*(int8_t *)(r15 + rbx) = 0x0;
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(r13 + 0x198, &var_60);
rax = [var_98 orgName];
rax = [rax retain];
rax = objc_retainAutorelease(rax);
var_70 = rax;
r14 = [rax UTF8String];
var_90 = intrinsic_movaps(var_90, 0x0);
var_80 = 0x0;
r15 = strlen(r14);
if (r15 >= 0xfffffffffffffff0) goto loc_10001267b;
if (r15 < 0x17) {
r12 = &var_8F;
*(int8_t *)(r12 - 0x1) = r15 + r15;
if (r15 != 0x0) {
memcpy(r12, r14, r15);
}
}
else {
r12 = operator new(r15 + 0x10 & 0xfffffffffffffff0);
var_80 = r12;
var_90 = r15 + 0x10 & 0xfffffffffffffff0 | 0x1;
memcpy(r12, r14, r15);
}
【问题讨论】:
-
问题是什么?你不明白这里的哪条指令?原始源代码在哪里?
-
嗨,我不明白为什么 ARC 将方法
objc_retainAutorelease的返回值转换为UTF8String,使用strlen检查它的长度并将这个值与constand0x17.. 我希望 ARC 只是释放变量,仅此而已.. -
你没有来源?在代码的开头,var_98、var_90、var_8F 中存储了什么?我怀疑 ARC 是否执行 UTF8String/strlen。 ARC 可能会插入 objc_retainAutorelease,但其余部分对我来说似乎是程序逻辑的一部分。
标签: c++ objective-c macos layout reverse-engineering