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
  • 21300

iOS黑魔法-Method Swizzling(全局hook,行为统计)

转自:http://www.jianshu.com/p/ff19c04b34d0 需求 就拿我们公司项目来说吧,我们公司是做导航的,而且项目规模比较大,各个控制器功能都已经实现。突...
  • Jason_chen13
  • Jason_chen13
  • 2017年06月28日 11:56
  • 435

iOS越狱程序开发框架

开发越狱程序和日常开发的iOS程序很相似,不过,越狱程序能做更强大的事情。你的设备越狱之后,你就能够hook进Apple提供的几乎所有的class,来控制iPhone/iPad的功能。 @DHo...
  • jiajiayouba
  • jiajiayouba
  • 2016年03月15日 10:03
  • 2428

iOS攻防 - (九)将iOS应用注入dylib和hook后,重新签名并打包

iOS攻防 - (八)将iOS应用hook和注入dylib后,重新签名并打包1.下载微信,并解密WeChat.ipa我的本篇博客已经讲过,此处不再赘述 ;http://blog.csdn.net/u0...
  • u013538542
  • u013538542
  • 2017年05月27日 20:12
  • 2255

IOS逆向笔记之HOOK实现(非越狱)

HOOK是越狱的最终目标,目的是给应用添加功能如插件或者是更改应用的某个功能来满足我们的需求,如微信中添加抢红包插件。本文将以最近比较火的“快看”漫画为例子去除付费漫画中的收费弹窗,实现免费看漫画的功...
  • qq_22600319
  • qq_22600319
  • 2017年08月26日 22:55
  • 584

在iphone越狱机器中使用Hook

http://www.cnblogs.com/ydhliphonedev/archive/2011/12/01/2270020.html 由于有不少朋友需要该文章的Demo,一个个发送比较麻...
  • guojin08
  • guojin08
  • 2013年08月30日 17:53
  • 1140

IOS之如何把自己开发的App安装到越狱的手机

场景: 有开发者账号,可以把设备加到开发者账号中,真机调试。现在需要打包,安装到的越狱手机上(此越狱手机没有加到开发者账号中,另外公司的人)。 常识: 没有越狱的话,最大的问题就是设备...
  • xdrt81y
  • xdrt81y
  • 2014年06月18日 00:10
  • 9515

iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook

转:http://geek.csdn.net/news/detail/56195 作者简介:郑旻(花名蒸米),阿里巴巴移动安全部门资深安全工程师,香港中文大学移动安全(Android & i...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2016年05月15日 12:54
  • 1792

iOS限制此应用不可在越狱机上使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 先导入三方类库 JailBreakDetection.h JailBreakDetection.m ...
  • sevenquan
  • sevenquan
  • 2015年12月28日 10:36
  • 269

iOS HOOK 注入与重签名

起因是在虾神的公众号上看到一篇文章 《Pokemon Go 锁区破解》,正好周围几个小伙伴正在玩这游戏,便仔细研究了下所谓的破解锁区。这次锁区其实是 GPS 锁区,游戏开发商为了缩小初始运营范围,在中...
  • isaced
  • isaced
  • 2017年03月06日 13:02
  • 1326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发 - iOS的hook方案
举报原因:
原因补充:

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