名称load方法钩挂Hook的特殊分析*
什么时机Hook?
上文中解决分析了元类、load的调用顺序等问题,失败了?是不是Hook时机晚了呢?先来了解下名称load方法的调用原理,在ClassA类涉及的load方法调用处打个执行断点,看调用栈:
动态链接器dyld完成对二进制文件(动态库,可执行文件)的初始化后将通过回调函数_dyld_objc_notify_register调用load_images和call_load_methods实现名称load方法的方法实例调用:
void
load_images(const char *path __unused, const struct mach_header *mh)
{
// Return without taking locks if there are no +load methods here.
if (!hasLoadMethods((const headerType *)mh)) return;
recursive_mutex_locker_t lock(loadMethodLock);
// Discover load methods
{
mutex_locker_t lock2(runtimeLock);
prepare_load_methods((const headerType *)mh);
}
// Call +load methods (without runtimeLock - re-entrant)
call_load_methods();
}
load_images中先通过预准备加载方法prepare_load_methods将所有类下的load方法先加入到待加载列表list中:
void prepare_load_methods(const headerType *mhdr)
{
size_t count, i;
runtimeLock.assertLocked();
classref_t const *classlist =
_getObjc2NonlazyClassList(mhdr, &count);
for (i = 0; i < cou