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 *)touches withEvent:(UIEvent *)event{
    NSLog(@"点击了屏幕");
    //调用类方法
    [%c(ViewController) New_classMethod];//新添加的方法,调用时需要头文件申明
}

%new
+(void) New_classMethod{//新添加的方法,调用时需要头文件申明
    NSLog(@"这是一个类方法");
}
  • %c
    类似getClass函数,获得一个类对象。一般用于调用类方法。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"点击了屏幕");
    //调用类方法
    [%c(ViewController) New_classMethod];
}

完整的例子


#import 

@interface ViewController : UIViewController
    
+(void)New_classMethod;
    
@end

%group group1
%hook ViewController

- (void)loginBtnClick:(id)sender{
    %orig;
    NSLog(@"chengg !");
}

%new
-(void)touchesBegan:(NSSet *)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 

    [[FLEXManager sharedManager] showExplorer];//显示FlEX工具

iOS逆向与安全6.1:Logos_第1张图片
显示FLEX工具

界面调试

dump 导出头文件
cycript调试查看

  • MSHookIvar 获取成员变量
    UITableView * tableView = MSHookIvar (self,"_tableView");//取出self的tableView成员变量

    NSMutableArray *dataSection = MSHookIvar(self,"_arrSections");//取出self的arrSections成员变量
  • nextResponder 获取上级响应者
    nextResponder
- (long long)numberOfSectionsInTableView:(id)arg1{
    UITableView * tableView = MSHookIvar (self,"_tableView");
    
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]){//定位到设置界面
        //在原来基础上多搞一组
        return %orig+1;
        
    }else{
        return %orig;
    }
}

你可能感兴趣的:(iOS逆向与安全6.1:Logos)