本文为看雪论坛优秀文章
看雪论坛作者ID:LeoW丨
hook objc_msgSend
简说objc_msgSend方法
① 获取传入的target的class。
② 找到class对应方法的缓存。
③ 尝试在缓存bukets中找到方法的具体实现。如果没有在cache中找到,则进入消息转发,深层查找,找到后,将方法和对应的IMP写入cache中。
④ 直接调用方法的实现。
想法1 视为普通C函数hook
id _Nullable objc_msgSend(id _Nullable self, SEL _Nonnull op, ...)
想法2 利用fish Hook+汇编 hook
"stp x8, x9, [sp, #-16]!n"
想法3 利用inline hook + 汇编hook
得到objc_msgSend的参数
// 打印调用的OC方法的对象和方法名,和最多两个参数。
void printSpecificParam_fish(id self, SEL _cmd, uintptr_t param1, uintptr_t param2,uintptr_t lr)
{
// 此方法中暂只能使用C方法,使用OC方法可能会导致寄存器异常导致崩溃,经测试,发生在相同方法调用相同方法时崩溃
// NSlog可以用
const char * className = object_getClassName(self);
const char * selector = sel_getName(_cmd);
//NSLog(@"class : %s, methodname : %s",className,selector);
if ( strcmp( selector, "fileExistsAtPath:" ) == 0) {
NSLog(@"class : %s, methodname : %s, param1 : %@",className,selector,param1);
}else {
NSLog(@"class : %s, methodname : %s",className,selector);
}
}
void printSpecificParam_fish( SEL _cmd, uintptr_t param1, uintptr_t param2,uintptr_t lr)
{
const char * selector = sel_getName(_cmd);
NSLog(@"methodname : %s",selector);
}
最后
看雪ID:LeoW丨
https://bbs.pediy.com/user-home-889798.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
原文始发于微信公众号(看雪学苑):hook objc_msgSend方法以获取OC方法入参