Objective-C Hook所有+load方法示例
Hook 所有类的+load
方法这件事,听起来挺硬核,其实也没那么玄。在 Objective-C 里,+load
方法是系统在加载类或 Category 时最早调用的东西,多全局初始化、埋点逻辑都喜欢藏这儿。要想知道哪些类偷偷做了啥,Hook 它就完事了。
这个叫LoadRuler的动态库还蛮有意思,专门用来监控这些+load
方法的执行情况。动态库嘛,启动时就跟着应用一起进来了,搭个便车也挺自然。重点是,它可以在背后记录谁先谁后进场,谁执行得慢,这些信息对优化启动性能还挺有用的。
怎么做到的?主要靠两个武器:MachO 解析 和 Method Swizzling。先用objc/runtime.h
搞清楚所有类和 Category 的位置,再用method_exchangeImplementations
把+load
的原始实现给“调包”了。你的自定义函数先执行,再调用原来的,数据记录也就顺便搞定。
不过哦,Category 的+load
就有点小坑,它的调用顺序不一定稳定,在类之前,也之后。Hook 的时候要注意别漏掉。顺带提一句,+load
是个挺敏感的操作,搞不好直接让程序崩了,所以真的要懂点 Objective-C 运行时机制再下手。
整个流程其实挺清晰:LoadRuler
动态库加载 -> 解析 MachO -> 遍历类和 Category -> Hook 每个+load
-> 记录执行信息 -> 调用原始实现。想监控启动流程、调试类加载问题,这个套路还蛮靠谱的。如果你在搞启动性能优化,或者就是想看看哪些类在偷跑,这篇示例值得一读。
189.95KB
文件大小:
评论区