前言
相信大家在工作中会经常遇到需要 hook 的情况,比如写插件绕过越狱检测、微信自动抢红包等等。
今天我们就来分享三种 iOS 应用的 hook 方法。分别是 hook OC 方法,hook 有符号 C 函数、hook 无符号(sub_xxx) C 函数。
hook OC 方法
hook OC 方法可以选择 CaptainHook 或者 Logos 来 hook,下面以 CaptainHook 来举例。
实例:
1 | CHDeclareClass(WXJSCoreBridge) |
介绍:
CHDeclareClass 代表要 hook 的类。CHOptimizedMethod2 要 hook 的方法,数字 2 表示要 hook 的方法有两个参数。CHOptimizedClassMethod2 同上,不过这个是 hook 类方法时使用的,上面的是 hook 实例方法时使用的。
hook 有符号 C 方法
hook 有符号 C 方法可以使用 facebook 开源的 fishhook 框架。
实例:
1 | static void (*original_printf)(const char *, ...); |
介绍:
对于懒加载的符号表,程序会在第一次调用该函数的时候去链接动态库,然后绑定地址。fishhook 将指向系统方法的指针重新进行绑定指向内部自定义 C 函数,将内部函数的指针在动态链接时指向系统方法的地址,达到 hook 的目的。
hook 无符号(sub_xxx)C 函数
相比较以上两种,hook sub_xxx 函数需求会少见一些。下面是使用 MSHookFunction 来 hook sub_xxx 无符号 C 函数。
实例:
1 | void (*old_sub_10097B8A0)(const unsigned char *, unsigned char *, size_t, const void *, unsigned char* , void *); |
介绍:
MSHookFunction 可以用来 hook 带符号的 C 函数,也可以 hook 无符号 C 函数。
总结
在 iOS 应用逆向中学到这三种方法,以后无论对于 OC 还是 C 函数都可以轻松 hook。