10.代码注入

[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];
}

你可能感兴趣的:(10.代码注入)