代码注入(11)

2021-04-21  本文已影响0人  为了自由的白菜

代码注入(11)

framework注入

假工程里写代码不会走,是因为APP(MachO)文件整个都被替换了

Tips

流程

yololib使用

需要修改MachO -> ./yololib WeChat framework路径

dylib也可以

添加lib -> 更改配置
用脚本yololib
yololib
shell脚本

./yololib "$TARGET_APP_PATH/$APP_BINARY" "framework路径"

appSign

Method Swizzle

framework注入
破坏微信, 窃取密码 -> 界面事件相应链,慢慢找
静态分析!!! -> class-dump (获取类,方法列表)

./class-dump -H WeChat -o ./headers/

class-dump
Sublime Text -> onNext没有参数(self, _cmd)

第一种Hook

Method Swizzle 方法交互修正

//第一种
/**
+(void)load{
    //原始的Method
    Method onNext = class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(onNext));
    
    //添加新方法!
    class_addMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(new_onNext), new_onNext, "v@:");
    //交换
    method_exchangeImplementations(onNext, class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(new_onNext)));
}

//新的IMP
void new_onNext(id self,SEL _cmd){
    UITextField * pwd = (UITextField *)[[self valueForKey:@"_textFieldUserPwdItem"] valueForKey:@"m_textField"];

    NSLog(@"密码是:%@",pwd.text);
    //调用回原来的逻辑!!
    //调用原来的方法!
    [self performSelector:@selector(new_onNext)];
}

隐患: 回不去了!!!(没法调用原来的实现!, 因为不是在该类的分类去交换的)

第二种

class_replaceMethod

/*
+(void)load{
    //原始的Method
    Method onNext = class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(onNext));
    old_onNext = class_replaceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(onNext), new_onNext, "v@:");
   
}
//原来的IMP
IMP (*old_onNext)(id self,SEL _cmd);
//新的IMP
void new_onNext(id self,SEL _cmd){
    UITextField * pwd = (UITextField *)[[self valueForKey:@"_textFieldUserPwdItem"] valueForKey:@"m_textField"];

    NSLog(@"密码是:%@",pwd.text);
    //调用回原来的逻辑!!
    //调用原来的方法!
    old_onNext(self,_cmd);
    //objc_msgSend();
    
}

第三种, 最好的, 推荐

大部分HOOK框架
method_getImplementation
method_setImplementation

+(void)load{
    //原始的Method
    old_onNext = method_getImplementation(class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(onNext)));
    method_setImplementation(class_getInstanceMethod(objc_getClass("WCAccountMainLoginViewController"), @selector(onNext)), new_onNext);
   
}
//原来的IMP
IMP (*old_onNext)(id self,SEL _cmd);
//新的IMP
void new_onNext(id self,SEL _cmd){
    UITextField * pwd = (UITextField *)[[self valueForKey:@"_textFieldUserPwdItem"] valueForKey:@"m_textField"];

    NSLog(@"密码是:%@",pwd.text);
    //调用回原来的逻辑!!
    //调用原来的方法!
    old_onNext(self,_cmd);
}
上一篇下一篇

猜你喜欢

热点阅读