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