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值修改符号达到防护错方法的目的,破坏掉防护。