首先在奔溃日志中确定是在哪一条线程奔溃的,然后找到我们工程名所在的第一条日志地址。从图片中可以看出是第0个线程,然后地址是0x0000000100661168
然后查看ASLR的偏移地址
通过0x100630000与0x0000000100661168相减得出我们的奔溃函数在二进制中的偏移量0x31168
然后我们在IDA中找到我们程序的Page Zero(零页)地址
加上我们刚刚求出来的偏移量0x31168得出奔溃函数在二进制中的具体函数地址0x100031168
在IDA工具中点击“G”键,输入地址回车
但是由于在寄存器中下一条命令的地址是由上一条命令的寄存器存储的,所以我们实际上代码奔溃的地址是在0x100031164这一个地址所对应的代码。
我们在IDA工具中按“F5”将汇编转换成伪代码可以看到光标停留的位置,当我光标在0x100031164地址时,转换过来对应的是第40行代码,所以确定了该奔溃是出现在该行代码,再通过这个函数我们在工程中找到具体方法的实现,去修复bug。但这个转换的是伪代码,并不是我们自己实现的代码,很多情况下生成的伪代码跟我们实际上自己写的代码并不一定,所以最好的还是看汇编。
第二种查找地址的方法就是看第一张图最后面的“+201064”,这个是代码的偏移量,由于是10进制的,我们转换成16进制可以看到结果还是0x31168,跟我们第一种方法求的是一样的,为什么还需要第一种方法那么麻烦去减掉ASLR的偏移地址呢?是因为第一种方法求出的地址是最准确的。如果我们在调试别人的二进制的时候,极有可能最后面给出的10进制偏移地址是变化的,就会出现定位不准的问题。所以推荐使用第一种。
该文章只是记录使用IDA和苹果反馈的奔溃信息定位奔溃代码,方便自己日后查看,并没有详细的展开每一步,后面有时间再完善。大神勿喷,谢谢。