代码注入(11)

简介: 代码注入(11)

代码注入(11)


framework注入


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


  • 通过Xcode新建Framwork,将库安装进入APP包
  • 通过yololib注入Framwork库路径。命令:$yololib(空格)MachO文件路径(空格)库路径


  • 所有的Framwork加载都是由DYLD加载进入内存被执行的
  • 注入成功的库路径会写入到MachO文件的LC_LOAD_DYLIB字段中


Tips


  • 注意: MachView(烂苹果) -> 拖拽打不开,右键打开文件可解决
  • MachOView


流程


  • 可执行文件 -> dyld加载 -> Load Commands -> LC_MAIN ->  LC_LOAD_DYLIB加载动态库 (通过路径加载) -> 将自己的代码, 包装在一个动态库里面, 再让IPA加载 (以动态库的形式注入)
  • framework里面的代码也要加载, framework里面也是可执行文件


yololib使用


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


dylib也可以


  • 通过Xcode新建Dylib库(注意:Dylib属于MacOS所以需要修改属性)
  • 添加Target依赖,让Xcode将自定义Dylib文件打包进入APP包。
  • 利用yololib进行注入。


添加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);
}



目录
相关文章
|
6月前
|
XML 安全 数据库
24、显错注入(updatexml和extractvalue)
24、显错注入(updatexml和extractvalue)
53 0
|
6月前
|
Java 开发者 Spring
Spring中获取Bean对象的三种注入方式和两种注入方法
Spring中获取Bean对象的三种注入方式和两种注入方法
|
1月前
|
SQL 安全 关系型数据库
beescms注入
通过 SQL 注入、弱口令爆破和文件上传三种方式对系统进行安全测试的过程。首先,通过手动注入和报错注入获取数据库信息,接着利用弱口令爆破工具尝试登录,最后通过修改 MIME 类型绕过文件上传限制,成功获取 shell。
beescms注入
|
13天前
|
SQL 关系型数据库 MySQL
注入
【11月更文挑战第17天】
20 4
|
6月前
|
数据库
报错注入
报错注入
36 1
|
6月前
|
数据库
13、报错注入(Get)
13、报错注入(Get)
31 0
|
XML Java 数据格式
案例03 基于xml配置的setter方法注入案例
通过setter方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现StudentService调用StudentDao的saveStudent操作。
91 0
|
XML Java 数据格式
案例02 基于xml配置的构造方法注入案例
通过构造方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现Student输出学生姓名和年龄。
65 0
|
容器
什么是依赖注入?有哪些注入方式?
什么是依赖注入?有哪些注入方式?
153 0
|
XML Java 数据格式
SpringXML实现注入
SpringXML实现注入
SpringXML实现注入