原副标题:iOS反向 ---- Hook方式及基本原理OC篇
👇👇高度关注后申明 “医声” ,拉你进流程员沟通交流群👇👇
译者丨跳跃的不将就
作者丨提前布局
镜像:
一、Hook概要
Hook英语原意为钳子,简而言之就是像钳子那样出现改变流程旧有的运转业务流程。
比如说几段流程的继续执行业务流程是 A --> B --> C,现在他们在 A 和 B 间填入几段标识符或是间接出现改变 B ,这样流程旧有的继续执行业务流程就出现了出现改变。如下表右图图右图:
Hook的此种价值观在平常的iOS合作开发中也有较为多的应用领域情景,比如说在他们同时实现埋点机能时,时常会加进的 Aspects 库。那时,他们就来积极探索呵呵对OC方式中的Hook或其基本原理。
二、方式互换基本原理
iOS反向中,如果他们期望对两个OC方式进行Hook,主要就应用领域了OC的运转时优点,在流程运转时静态出现改变方式的同时实现。
在OC中,用作同时实现运转时优点的是两套如前所述C/C++和编订的API,即他们常说的Runtime。
而他们Hook操作过程中加进的主要就是呵呵两个方式:
1、方式互换 OBJC_EXPORT void method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2) OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);2、代替方式OBJC_EXPORT IMP _Nullableclass_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,const char * _Nullable types)OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
3、setIMP & getIMPOBJC_EXPORT IMP _Nonnullmethod_setImplementation(Method _Nonnull m, IMP _Nonnull imp)OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
OBJC_EXPORT IMP _Nullableclass_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name)OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
在平常的合作开发中,他们也会加进这两个方式,但它是是不是同时实现方式互换/代替的呢?
检视这两个方式的模块,他们辨认出主要就有 Class、SEL、IMP、Method 这三种类别,他们依次上看呵呵
1、Class 两个 objc_class 类别的内部结构体操作符,用作表明第一类是别的类;
2、Method 两个 objc_method 类别的内部结构体操作符,用作表述两个方式,在objc源标识符中表述如下表右图:
3、SEL 可以辨认出在 Method 的表述中,也能看到SEL。他们瞧瞧在苹果公司非官方文件格式中怎样表述此种类别
4、IMP 同样在 Method 的表述中也能看到,在苹果公司非官方文件格式的表述如下表右图:
他们辨认出其实上诉方式都包含 SEL 和 IMP 这两种类别的信息。
根据上文中苹果公司文件格式中的介绍他们可以辨认出
SEL: Method selectors are used to represent the name of a method at runtime. A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime.
IMP: This data type is a pointer to the start of the function that implements the method. This function uses standard C calling conventions as implemented for the current CPU architecture. The first argument is a pointer to self (that is, the memory for the particular instance of this class, or, for a class method, a pointer to the metaclass). The second argument is the method selector. The method arguments follow.
SEL是两个C String,用作表示两个方式的名称,IMP是两个方式同时实现首地址,默认有两个模块 self 和 _cmd。其实SEL和IMP的关系他们可以类比一本书的目录,SEL就是目录中的内容副标题,IMP是后面的页码。
两个方式调用时,通过SEL找到对应的IMP,进而找到方式的同时实现。如下表右图图:
他们在Hook两个OC方式时,只需要出现改变其SEL所指向的IMP时,就可以同时实现方式的互换的目的,或是使用class_replaceMethod 和 method_setImplementation 出现改变两个类旧有方式的同时实现,基本原理如下表右图图:
三、总结
反向中,Hook两个OC方式其实就是出现改变其SEL所指向的IMP,从而找到另两个同时实现地址,继续执行另两个方式同时实现。
但此种方式的局限在于,其只能针对OC方式进行Hook,对于C函数则无法Hook。
在后续的文章中,他们将积极探索怎样Hook两个C函数和fishhook库的使用及基本原理,请持续高度关注。
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是流程员面试必备! 所有资料都整理到网盘了,欢迎下载!
面试题】即可获取
在看点这里好文分享给更多人↓↓ 返回搜狐,查看更多
责任撰稿:
- 上一篇:微信键盘iOS版iPA更新,最新安装方法及下载!(原创)旧ipad怎么装微信,
- 下一篇:iPhone系统数据占用过大怎么清理 iOS清理系统数据方法(快来看)其他系统数据太大怎么清理 iphone,
请立即点击咨询我们或拨打咨询热线: ,我们会详细为你一一解答你心中的疑难。项目经理在线