iOS开发 - iOS的hook方案

原创 2015年07月08日 11:38:00

在没有一个类的实现源码的情况下,我们如果想改变其中一个方法的实现,有哪些方法可以实现呢?

一、继承重写

这种方式,并不是严格意义上的hook,但是也可以达到改变方法实现的目的。但它在使用时,需要通过继承类这个对象来操作,限制比较大。对于不知道你的继承类存在的调用方来说,就毫无意义。


二、借助类别重名方法

这种方式的话,是覆盖原有的实现,只会保留重写的功能。因为原有的功能


三、Method Swizzling


Method Swizzling 原理


在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。



我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,

我们可以利用 class_replaceMethod 来修改类,

我们可以利用 method_setImplementation 来直接设置某个方法的IMP,
……

归根结底,都是偷换了selector的IMP,如下图所示:




Method Swizzling 实践



举个例子好了,我想钩一下NSArray的lastObject 方法,只需两个步骤。

第一步:给NSArray加一个我自己的lastObject



乍一看,这不递归了么?原因后面阐述。

第二步:调换IMP


控制台输出Log:


现在我们来分析上面提到的递归的问题。
由于交换了方法的实现  @selector(lastObject) 对应 IMP(myLastObject), @selector(myLastObject) 对应 IMP(lastObject)
所以执行 NSString *string [array lastObject]; 时,实际是去调用myLastObject, 函数myLastObject里的代码id ret [self myLastObject]; 将会执行真的 [self lastObject] 。

这里就多亏了OC的动态机制以及消息特性如果不执行IMP的交换操作,调用[array myLastObject]; 就会陷入死循环。


 四、delegate的hook

四、fishhook

版权声明:本文为博主原创文章,未经博主允许不得转载。

利用Objective-C运行时hook函数的三种方法

方法一,hook已有公开头文件的类: 首先写一个Utility函数: #import inline void exchangeMethod(Class aClass, SEL oldSEL, SEL...
  • hursing
  • hursing
  • 2013年03月18日 20:30
  • 20070

Objective-C的hook方案(一): Method Swizzling

Objective-C的hook方案(一):  Method Swizzling在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力抢先之外,还有更加灵活的...

iOS运行时以及HOOK的理解:runtime和method swizzling

iOS运行时以及HOOK的理解:runtime和method swizzling

class-dump获取iOS私有api

获取各类iOS私有api 安装工具class-dump 资源地址http://download.csdn.net/detail/map625/8191343 运行class-dump并编...
  • map625
  • map625
  • 2014年11月24日 09:49
  • 1535

Xcode7发布版本遇到的问题

1. Xcode7 真机调试 遇到 no identity found 如何解决 > 把那个 bundle identity 改掉 ,Xcode 这里就会出现一个警告,然后点击下面的FIx issue...
  • amoslyc
  • amoslyc
  • 2016年08月13日 10:08
  • 1098

IOS开发-在广告机项目实现屏保功能时使用到的Hook函数,分享些关于hook函数的资料

废话不多说。直接上代码。 #import @interface HookObject : NSObject //单位分钟 @property (nonatomic)NSIntege...

iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景。当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的...

iOS开发趋势:Native与H5+JS 解决方案

支付宝红包火了,微信红包火了,作为开发者,敏感的就发现之前并不被看好的H5已经悄悄渗透进来,在原生(Native)代码中部分功能采用动态网页(HTML5+JavaScript)来实现,即保证了整体Ap...
  • mapboo
  • mapboo
  • 2015年07月31日 16:00
  • 5370

iOS开发屏幕适配问题解决方案

屏幕适配问题共有四种解决方案:(1)根据屏幕宽高写控件frame(下策);(2)Autoresizing的使用(中策);(3)AutoLayout的使用(上策);(4)sizeClasses+Auto...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发 - iOS的hook方案
举报原因:
原因补充:

(最多只允许输入30个字)