[TOC]
Framework注入
- yololib,修改macho文件的工具,存储在usr/local/bin
- 需要对目标framework进行引用:在
build parse
中添加copy file
将目标framework引用进去; - 指令:
yololib WeChat Frameworks/JackHookFramework.framework/JackHookFramework
,需要注意的是framework的路径是相对于执行文件的路径。 - 在注入时首先对原始IPA中的可执行文件进行修改,修改后在放入ORG_APP目录下,避免编译后被覆盖;
- 如果macho的
Load Commands
中存在对库的引用,而对应的库却不存在,在运行时app会crash并报错:Reason: image not found
。并且如果指定的路径上不是framework的可执行文件会报错:Reason: no suitable image found
。
dylib注入
dylib是macOS下的,iOS是framework;
创建时默认是动态库;
创建时需要对库进行签名;
build后生成的路径时和iOS的路径不一致:dylib:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
,framework:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
直接修改baseSDK位iOS
MethodSwizzle
对象的class,而class的class的获取方法:
通过getInstanceMethod获取到类方法的方案:对object_getClass(对象.class),将得到的结果传入getInstanceMethod中。
Hook微信注册方法
使用LLDB查看UI触发的事件目标方法,如查看某个button的点击事件、button的类型等。
通过class-dump查看方法的类型,是类方法还是对象方法;
object_getClass—传入ID
objc_getClass —传入字符串
通过在load方法中使用method_exchangeImplementations
方法对原始方法和自定义方法进行交换已达到目标;
[TOC]
Framework注入
- yololib,修改macho文件的工具,存储在usr/local/bin
- 需要对目标framework进行引用:在
build parse
中添加copy file
将目标framework引用进去; - 指令:
yololib WeChat Frameworks/JackHookFramework.framework/JackHookFramework
,需要注意的是framework的路径是相对于执行文件的路径。 - 在注入时首先对原始IPA中的可执行文件进行修改,修改后在放入ORG_APP目录下,避免编译后被覆盖;
- 如果macho的
Load Commands
中存在对库的引用,而对应的库却不存在,在运行时app会crash并报错:Reason: image not found
。并且如果指定的路径上不是framework的可执行文件会报错:Reason: no suitable image found
。
dylib注入
dylib是macOS下的,iOS是framework;
创建时默认是动态库;
创建时需要对库进行签名;
build后生成的路径时和iOS的路径不一致:dylib:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
,framework:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
直接修改baseSDK位iOS
MethodSwizzle
对象的class,而class的class的获取方法:
通过getInstanceMethod获取到类方法的方案:对object_getClass(对象.class),将得到的结果传入getInstanceMethod中。
Hook微信注册方法
使用LLDB查看UI触发的事件目标方法,如查看某个button的点击事件、button的类型等。
通过class-dump查看方法的类型,是类方法还是对象方法;
object_getClass—传入ID
objc_getClass —传入字符串
通过在load方法中使用method_exchangeImplementations
方法对原始方法和自定义方法进行交换已达到目标;
非category方式添加交互方法
一般情况在正向开发中,需要给某一个无源码但可以继承或直接引用的类添加方法逻辑时,可以通过添加分类,在分类中使用swizzle方式重写原方法。
而要在不能引用的情况下对原类进行添加和修改(更新原始方法到新方法方法后,执行完新方法内容后继续执行原方法内容)时,需要先对原类进行方法注入,然后再在对注入后的类进行方法交换。eg:
+ (void)load {
Class orgClass = NSClassFromString(@"WCAccountLoginControlLogic");
SEL tarSel = @selector(hook_loginAccount:data:);
Method tarMethod = class_getInstanceMethod(self, tarSel);
class_addMethod(orgClass, tarSel, method_getImplementation(tarMethod), method_getTypeEncoding(tarMethod));
Method orgLogin = class_getInstanceMethod(orgClass, @selector(loginAccount:data:));
Method newLogin = class_getInstanceMethod(orgClass, tarSel);
method_exchangeImplementations(orgLogin, newLogin);
}
- (void)hook_loginAccount:(_Bool)arg1 data:(id)arg2 {
[self hook_loginAccount:arg1 data:arg2];
}