iOS逆向與安全6.1:Logos

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;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容