交叉引用cross reference是指 这个地址的 数据或代码 引用了哪个地址 以及 被哪些地址的代码所引用。引用了哪个地址,在反汇编就能看出来,一行汇编代码自然只会引用一个地址。但被引用是一对多的关系,正如一个函数可以被很多函数在内部调用。查看“被引用”是静态分析中得到堆栈的方法,当然,因为一对多的关系,还需要猜。这主要是看分析的目的是什么,与运行时动态分析相比各有好处,静态分析能得到完整的调用关系图。
在IDA里,cross reference也会缩写成XREF。
XREF主要是两种,数据引用和代码引用,只要看见有分号注释的 XREF 的地方,把鼠标悬停上去,都能看到部分交叉引用的代码。如果被引用的地方有很多,还可以通过快捷键Ctrl+X或菜单,得到更完整的交叉引用信息。例如在图中的Data XREF右键单击,弹出菜单:
选择Jump to cross reference,弹出对话框:
可以看到它被9个位置的代码引用。选中其中一条点击ok,即会跳转到那个地址。
由于Objective-C是一种弱类型语言,各种函数和成员变量都可以用字符串获取得到,开发者以实际为字符串的selector来调用函数,会令静态分析的引用分析变得复杂。下面做一个演示。
通过class-dump或xdb,可以知道UIView有这样一个私有API。
- (void)_addSubview:(id)arg1 positioned:(int)arg2 relativeTo:(id)arg3现在去IDA里搜索,由于category的可能存在,一般搜索一个类的具体某个函数时,关键字是不带类名的,这个函数在IDA中的表示是
__UIView_Internal___addSubview_positioned_relativeTo__
如果搜索
__UIView__addSubview_positioned_relativeTo__
那肯定搜不到,所以用关键字
addSubview_positioned_relativeTo
来搜索,有重复的就search again,直到找到是UIView的函数。它的反汇编代码头部信息为:
__text:00059DAC ; =============== S U B R O U T I N E ======================================= __text:00059DAC __text:00059DAC ; Attributes: bp-based frame __text:00059DAC __text:00059DAC __UIView_Internal___addSubview_positioned_relativeTo__ proc near __text:00059DAC ; DATA XREF: __objc_const:0075DBE4