关闭

IDA反汇编/反编译静态分析iOS模拟器程序(六)交叉引用

标签: IDA Pro静态分析反汇编反编译iOS模拟器程序交叉引用
16212人阅读 评论(3) 收藏 举报
分类:

交叉引用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:0075DBE4o

想知道哪些函数会调用这个函数,很自然想到在上面的DATA XREF处查看。可是,00059DAC这个位置实际只是Objective-C运行时实现中的IMP,即函数实现地址(具体请查看xcode文档)。开发者通过selector的方式调用函数,直接引用的是selector,而不会直接引用到IMP。 编译过程中,selector本身的字符串会被一个method对应,method再对应IMP,反编译的搜索过程就是它的反过程。

在00059DAC处查看XREF,得到:


跳转后,发现一堆的字符串:


这三行其实Method结构体的所有成员。

00000000 __objc2_meth    struc ; (sizeof=0xC)    ; XREF: __objc_const:000050C0r
00000000                                         ; __objc_const:000050CCr ...
00000000 name            DCD ?                   ; offset
00000004 types           DCD ?                   ; offset
00000008 imp             DCD ?                   ; offset
0000000C __objc2_meth    ends

第一行是字符串的起始地址,name,即源码中以@selector()括起来的字符串。第二行是对selector中参数类型的描述,Type encode请参考《利用Objective-C运行时hook函数的三种方法》,class-dump估计就是靠这些types信息确定各个selector的参数类型。第三行是IMP,所以上面的XREF会jump到这里来。

因为是selector对应字符串,所以要在0075DBDC处继续查看XREF。这是个字符串指针,所以是操作数,与函数的交叉引用稍有不同,右键单击,弹出菜单:


选择Jump to xref to operand。这里也有提示,快捷键是X,不是函数交叉引用的Ctrl+X,他们的区别是后者弹出来的是非模态对话框,X弹出来的是模态的:


这里会发现有三个引用,前两个是普通的引用,最后一个,可以看到IDA分析出是 __objc_selrefs,即有selector对此字符串做引用,所以需要选择__objc_selrefs处的引用,跳转过去:


如果做重命名多了,会发现这个地方的代码格式很熟悉,因为这里就是程序selector的放置区域,双击反汇编代码中默认命名的selector如off_XXXX就会来到这。

在DATA XREF上查看:


会发现非常多的引用,这些引用才是会最终调用到00059DAC的函数。

从上表也可看出,UIView的addSubview:,insertSubview:atIndex:,insertSubview:aboveSubview:等许多公开接口实际都会调用这个私有API。

上一篇:IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

下一篇:IDA反汇编/反编译静态分析iOS模拟器程序(七)识别类的信息

本文请勿转载。

5
3
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

iOS 破壳 反编译 黑客技术大揭秘

分享内容简介: 在黑客的世界里,没有坚不可破的防护系统,也没有无往不胜、所向披靡的入侵利器,有时候看似简单的问题,破解起来也许花上好几天、好几个月,有时候看似很 low 的工具往往能解决大问题;我们...
  • qq_26341621
  • qq_26341621
  • 2017-01-06 17:04
  • 6548

Mac的反编译工具一:otool (objdump工具的OSX对应工具)。

objdump的选项-S、-l十分方便。如果二进制文件中带有调试信息,可以将源代码、文件名和行号与汇编代码对应显示。 在OSX上,对应的工具是otool。与“objdump -Sl”能力接近的命令是o...
  • x32sky
  • x32sky
  • 2015-04-17 17:44
  • 14906

Objective-C基本分析法 反编译

以Hello World程序为例: 代码: #import @interface SaySomething :NSObject- (void) sayNSString *)phrase;@end@i...
  • mr_liu_easy_ios
  • mr_liu_easy_ios
  • 2017-08-23 21:15
  • 400

14.IDA-XREF(交叉引用)概述

XREF分类 CODE XREF:代码交叉引用 DATA XREF:数据交叉引用 XREF描述含义 这是个代码交叉引用 sub401000是被引用者,main+2A是引用者(引用sub401...
  • hgy413
  • hgy413
  • 2016-01-27 16:35
  • 3595

IDA PRO新手使用教程

本人也是菜鸡一枚,此教程仅针对新手,大佬请自行略过,失误之处请多指正。 先给大家分享一下IDA pro的链接;链接:https://pan.baidu.com/s/1miiSkzQ 密码:a2mm。里...
  • re_psyche
  • re_psyche
  • 2017-12-13 22:38
  • 745

IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。反编译的快捷键是F5,菜单位置在 顶部菜单Vie...
  • hursing
  • hursing
  • 2013-05-16 17:20
  • 16748

IDA反汇编/反编译静态分析iOS模拟器程序

转载自:http://blog.csdn.net/hursing (一)利用IDA和LLDB探索WebCore的C++类的继承关系 开刀的类名叫 PluginWidgetIOS,利用lld...
  • zkdemon
  • zkdemon
  • 2016-06-24 15:22
  • 4906

基于 ida 的反汇编转换 Obj 的可行性 笔记(2)

前面一章讲述了一个简单的 exe 智能反汇编引擎推导实现方法,但是实际操作要比上文要困难的多, 其中涉及很多烦琐的细节, 这里不进行进一步的讨论。 现在公认静态分析比较强的工具是 ida, 它有的...
  • liujiayu2
  • liujiayu2
  • 2016-06-21 16:51
  • 390

iOS反编译

上架至App Store的app,被apple加密了。想要反编译要麻烦许多。但是在debug下产生的ipa或者是release下的ipa包或者是渠道包都能直接反编译。 首先介绍针对Xcode导出的ip...
  • SandyLoo
  • SandyLoo
  • 2017-02-14 20:56
  • 921

15.IDA-查看XREF列表

查看XREF列表在某个位置显示的交叉引用注释的数量由ida.cfg控制,其默认设置为2,当然你可以改变它SHOW_XREFS = 2 // Show 2 cross-references (th...
  • hgy413
  • hgy413
  • 2016-01-27 18:09
  • 1039
    个人资料
    • 访问:1084676次
    • 积分:9812
    • 等级:
    • 排名:第2077名
    • 原创:128篇
    • 转载:0篇
    • 译文:0篇
    • 评论:437条
    联系方式
    微信:hursing

    前阿里巴巴技术专家。现参与互联网金融创业,广招程序员~
    博客专栏
    最新评论