objective-C变量布局 我试图研究在我的代码中访问函数0代码中的地址>触发的恐慌消息> StLLUN ,它基本上是C++与Objy-C变量结合。p>

objective-C变量布局 我试图研究在我的代码中访问函数0代码中的地址>触发的恐慌消息> StLLUN ,它基本上是C++与Objy-C变量结合。p>,c++,objective-c,macos,layout,reverse-engineering,C++,Objective C,Macos,Layout,Reverse Engineering,产生恐慌的方法不是直接访问strlen,而是从ARC引擎访问,我试图找出strlen作为自动释放变量的一部分用于什么 根据从反汇编程序复制的下一个块,似乎[rax UTF8String]的输出生成了null而不是有效字符串,这最终导致了崩溃。也许任何人都可以告诉我,在自动释放变量后,objective-C的内部布局是什么,需要进行此检查 *(int8_t *)(r15 + rbx) = 0x0; std::__1::basic_string<char, std::__1::char_tra

产生恐慌的方法不是直接访问
strlen
,而是从ARC引擎访问,我试图找出
strlen
作为自动释放变量的一部分用于什么

根据从反汇编程序复制的下一个块,似乎
[rax UTF8String]
的输出生成了null而不是有效字符串,这最终导致了崩溃。也许任何人都可以告诉我,在
自动释放变量后,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);
}
*(int8_t*)(r15+rbx)=0x0;
std::uu1::基本字符串::运算符=(r13+0x198,&var_60);
rax=[var_98 orgName];
rax=[rax保留];
rax=对象保留释放(rax);
var_70=rax;
r14=[rax UTF8String];
var_90=固有的移动(var_90,0x0);
var_80=0x0;
r15=strlen(r14);
如果(r15>=0xFFFFFFFFFFF0)转到loc_10001267b;
如果(r15<0x17){
r12=&var_8F;
*(int8_t*)(r12-0x1)=r15+r15;
如果(r15!=0x0){
memcpy(r12、r14、r15);
}
}
否则{
r12=新运算符(r15+0x10和0xFFFFFFFFFFF0);
var_80=r12;
var|u 90=r15+0x10&0xFFFFFFFFFFF0 | 0x1;
memcpy(r12、r14、r15);
}

ARC仅插入
保留/释放/自动释放
说明。它不会插入任何类似于
UTF8String
strlen
的内容

retain
+
autorelease
的组合。操作并没有释放该值,而是将一个对象放入当前的“自动释放池”(类似于将对象标记为将来的描述)

在这段代码中,我假设
orgName
将一个NSString返回到
rax
,然后它使用
UTF8String
将这个
NSString
转换成一个C字符串,并放入
r14
。出于某种原因,该代码的作者决定(非常奇怪)不使用
orgName.length
,而是使用
strlen
。因此,这个字符串的长度
orgName
被放入
r15

如果
orgName.length
(在
r15
中)小于0x17,它会将C字符串复制到
var_8F
。 否则,它将分配一个新的缓冲区
r12
,并将
orgName
C字符串复制到那里


*(int8_t*)(r12-0x1)=r15+r15很奇怪。这就像var_8F在var_8F之前有一个字节大小字段,它将字符串长度的两倍放在那里(长度很小,所以适合,但为什么是两倍?)。

问题是什么?你不懂这里的哪一条说明?原始源代码在哪里?嗨,我不明白的是为什么ARC会将方法
objc_retainaurelease
的返回值转换为
UTF8String
,使用
strlen
检查它的长度,并将该值与constand
0x17
进行比较。。我希望ARC只是释放变量,就这样..你没有源代码吗?在代码的开头,var_98、var_90、var_8F中存储了什么?我怀疑ARC是否有UTF8String/strlen。ARC可能会插入objc_RetainUserRelease,但其余部分在我看来像是程序逻辑的一部分。很好的分析,但程序集有点陌生,它先执行
保留
,然后执行
保留
(第4行和第5行),这是一个双保留。。。
if(r15>=0xfffffffffffff0)
使用
new
保护缓冲区分配,它使用
r15+0x10&0xfffffffffff0
将大小舍入到下一个16字节边界(假设严格的从左到右的操作会发生在顺序指令中)。我注意到了双保留-确实很奇怪,但我觉得这对理解这首曲子没什么意义。感谢0xFFFFFFFFFFF0的解释,现在它有了意义,因为我看到“+”是首先计算的,如
(r15+0x10)&0xFFFFFFFFFFF0
中所示。