Logos语法简单记录

514 阅读2分钟

logos文件后缀是x表示支持logos语法和C,xm表示支持logos、C、C++。

hool类的方法

%hook ViewController
-(void)postUserName:(NSString *)name pwd:(NSString *)pwd{
    NSLog(@"hook到了");
}
%end

分组

一般用于条件判断

%group group1
%hook ViewController
-(void)postUserName:(NSString *)name pwd:(NSString *)pwd{
    NSLog(@"第一组hook到了");
}
%end
%end

%group group2
%hook ViewController
-(void)postUserName:(NSString *)name pwd:(NSString *)pwd{
    NSLog(@"第二组hook到了");
}
%end
%end

构造函数

可以指定加载哪一组,加载logos文件时会首先进入到ctor函数,以下写法group2会覆盖group1.

%ctor{
    %init(group1)
    %init(group2)
}

group应该这样使用

%ctor{
    NSString *v = [UIDevice currentDevice].systemVersion;
    if(v.doubleValue >= 11.0){
        %init(group1)
    }else{
        %init(group2)
    }
}

logos默认会有一个构造函数,里面初始化隐式组_ungrouped

%ctor{
    %init(_ungroup)
}

析构函数

%dtor

%log函数

打印调用者对象地址和方法名以及参数数据

%log;

保持原有调用

%orig包含参数和返回值,也可以修改参数和返回值

%orig;
%orig(@"Jimmy",@"1234");
return %orig + 1;

%new添加方法

动态给类添加方法,写在类与end之间

//此处定义类和方法声明为了编译通过
@interface ViewController
-(void)methodAdd;
@end

%hook ViewController

%new
-(void)methodAdd{
    NSLog(@"methodAdd调用了");
}

%new
+(void)methodAdd2{
    NSLog(@"类方法methodAdd2调用了");
}
//hook的方法
-(void)postUserName:(NSString *)name pwd:(NSString *)pwd{
    %log;
    %orig(@"Jimmy",@"1234");
    [self methodAdd];
    //调用类方法
    [self.class methodAdd2];
    //也可使用以下方式 %c %class
    [%c(ViewController) methodAdd2];    
}
%end

不声明类和方法,也可以通过导入class-dump获取的头文件导入来提高效率

关于防护logos

Logos使用的是getIMP和setIMP,所以一般防护通过hook系统method_exchange方法没用,应该是hook setIMP和getIMP才能防护Logos。(注意:防护代码必须写在新建的framework中,因为自己的framework中的防护代码会比攻击的logos代码先执行,顺序问题可以看DYLD加载镜像顺序) 但是由于machO文件中的TEXT段中内存只读,二进制可读写,所以又可以通过MachOView修改二进制数据来修改getIMP和setIMP的Ascii值修改符号达到防护错方法的目的,破坏掉防护。