简介
Logos本是Theos的一个组件,Monkey将里面libsubstrate.dylib移植出来,所以在Monkey工程下也可以使用Logos进行Hook代码
常用到的一些语法
- HOOK 某个类里面的某个方法
%hook 类名- (void)方法名:(id)arg1 ....{}%end复制代码
- 为某个类添加新的方法
%hook class_name// 添加一个响应事件%new-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES];}// 添加一个类方法%new+(void) new_func_name { NSLog(@"这是一个类方法!");}%end复制代码
- 构造函数和析构函数
%ctor 构造函数%dtor 析构函数复制代码
- 组的概念
%group group1%hook class_name- (void)func_name:(id)arg1 ....{ //修改替换成的内容}%end%end%group group2%hook class_name- (void)func_name:(id)arg1 ....{ //修改替换成的内容}%end%end// 定义了组就必须对其初始化%ctor{NSString * version = [UIDevice currentDevice].systemVersion;if(version.doubleValue >= 10){// 当iOS版本大于10则使用组2的Logos代码,否则使用组1的 %init(group2) }else{ %init(group1)}}复制代码
- 常用的宏
%log 打印原始方法的所有参数信息%orig 执行原始的方法[%c(ViewController) click]; %c获取类复制代码
案例
本案例在Monkey工厂下,利用Logos语法实现与 中案例一模一样的功能。
- 首先新建一个Monkey工程
- 把App放到TargetApp目录下
- 打开_6_HOOK_LogosDylib.xm文件,在文件上面进行开发
先删除掉运行的内容,开始写Logos语法进行HOOK
%hook WCAccountLoginControlLogic- (void) onFirstViewLogin { UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"你想登录??" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertVC addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil]]; [[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:alertVC animated:true completion:nil];}%end复制代码
通过这段简单的代码,就完成我们之前一系列复杂的HOOK,Logos是不是很强大呢? 来看看效果