Logos
Logos语法其实是CydiaSubstruct框架提供的一组宏定义。便于开发者使用宏进行HOOK操作。语法简单,功能强大且稳定。
http://iphonedevwiki.net/index.php/Logos
- 文件
.x 说明源文件支持Logos和C语法
.xm 说明源文件支持Logos和 c/c++语法
编译文件时,一般会导入相关的头文件,便于编译
Logos语法分为三大类:
语法
- Block level
这一类型的指令会开辟一个代码块,以%end结束。
%group、%hook、% subclass 、 %end
- Top level
这个TopLevel指令不放在BlockLevel中。
%config、%hookf、%ctor、%dtor
-
Function level
这一块的指令就放在方法中。
%init、%class、 %c、 %orig、%log
EX
- Hook某个类的方法
%hook ClassName
- (void)method{
}
+ (void)classMethod{
}
%end
- 为某个类添加新方法
%hook ClassName
%new
+ (void)ClassMethod{
}
- (void)newMethod{
}
%end
- 组
%group
用来将代码分组。开发中hook代码会很多,这样方便管理Logos代码。
%group group1
%hook ClassName
- (void)method{
}
+ (void)classMethod{
}
%end
%end
- 组构造 构造函数 当有多个组的时候,必须在构造函数初始化
%ctor{
NSString * v = [UIDevice currentDevice].systemVersion;
if(v.doubleValue > 11.0){
%init(group1);
}else{
%init(group2);
}
}
%ctor(constructor)
构造函数,用于确定加载那个组。和%init结合用
%init
用来初始化某个组。
常用语法
-
%log
能够输出日志!! 输出方法调用的详细信息 (调用者 方法名,参数) -
%orig(original)
这个就是保持原有的方法实现,如果原来的方法有返回值,那么%orig 就有返回值的。 -
%new
给某个类添加方法,在%hook 和 %end 中使用。
@interface ViewController : UIViewController
+(void) New_classMethod;
@end
%new
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"点击了屏幕");
//调用类方法
[%c(ViewController) New_classMethod];//新添加的方法,调用时需要头文件申明
}
%new
+(void) New_classMethod{//新添加的方法,调用时需要头文件申明
NSLog(@"这是一个类方法");
}
- %c
类似getClass函数,获得一个类对象。一般用于调用类方法。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"点击了屏幕");
//调用类方法
[%c(ViewController) New_classMethod];
}
完整的例子
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
+(void)New_classMethod;
@end
%group group1
%hook ViewController
- (void)loginBtnClick:(id)sender{
%orig;
NSLog(@"chengg !");
}
%new
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"点击了屏幕");
//调用类方法
[%c(ViewController) New_classMethod];
}
%new
+(void) New_classMethod{
NSLog(@"这是一个类方法");
}
%end
%end
%group group2
%hook ViewController
- (void)loginBtnClick:(id)sender{
NSLog(@"哥么我第二组!");
}
%end
%end
//构造函数
%ctor{
NSString * v = [UIDevice currentDevice].systemVersion;
if(v.doubleValue > 11.0){
%init(group1);
}else{
%init(group2);
}
}
添加FLEX工具,手机端界面调试
- 越狱后直接安装插件使用
- 未越狱环境
1.利用pod集成当前项目
pod 'FLEX'
pod 导入FLEX框架
2.代码中引用
mokey中 Dylid.m文件中
引入 FlEX,然后显示FlEX工具
#import <FLEX/FLEX.h>
[[FLEXManager sharedManager] showExplorer];//显示FlEX工具
显示FLEX工具
界面调试
dump 导出头文件
cycript调试查看
- MSHookIvar 获取成员变量
UITableView * tableView = MSHookIvar <UITableView *>(self,"_tableView");//取出self的tableView成员变量
NSMutableArray *dataSection = MSHookIvar<NSMutableArray*>(self,"_arrSections");//取出self的arrSections成员变量
- nextResponder 获取上级响应者
nextResponder
- (long long)numberOfSectionsInTableView:(id)arg1{
UITableView * tableView = MSHookIvar <UITableView *>(self,"_tableView");
if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]){//定位到设置界面
//在原来基础上多搞一组
return %orig+1;
}else{
return %orig;
}
}
网友评论