
目录
一,三种类型
二,Block level
三,Top level
四,Function level
五,实战练习
六,logify.pl
官方文档:http://iphonedevwiki.net/index.php/Logos
一,三种类型
1,Block level
:此类别中的指令会打开一个代码块,并且该代码块由%end
指令来关闭
2,Top level
:此类别中的指令是在代码块外使用的
3,Function level
:此类别中的指令是在函数中使用的
二,Block level
1,%hook
:指定想要hook的类
%hook ClassName // 想要hook的类名
// 想要hook的方法
- (void)instanceMethod {}
%end
2,%group
:用于代码管理或按条件初始化
%group iOS9
%hook iOS9Class
// iOS9以上hook此方法
- (void)iOS9Method {}
%end
%end
// 在_ungrouped分组中(默认分组)
%hook othersClass
// iOS9以下hook此方法
- (void)othersMethod {}
%end
3,%subclass
:定义一个子类
%subclass YJPerson : NSObject
// 属性
%property (nonatomic, copy) NSString *name;
// 方法
%new
- (void)run {}
%end
三,Top level
1,%ctor
:构造函数
%ctor {}
2,%dtor
:析构函数
%dtor {}
四,Function level
1,%init
:初始化某个分组
%ctor {
NSString *version = [UIDevice currentDevice].systemVersion;
if (version.doubleValue >= 9.0) {
%init(iOS9); // 初始化iOS9分组
} else {
%init; // 初始化_ungrouped分组
}
}
2,%c
:获取类对象或元类对象
%hook ClassName
- (void)instanceMethod {
id cls = %c(NSObject); // 类对象
id metaClass = %c(+NSObject); // 元类对象
}
%end
3,%orig
:调用方法原来的实现
%hook ClassName
- (void)instanceMethod:(id)arg1 {
%orig; // 省略了参数,等同于%orig(arg1)
%orig(@"111"); // 修改参数
}
%end
4,%log
:打印方法调用详细的信息
%hook ClassName
- (void)instanceMethod {
%log;
%log((NSString *)@"111", (NSNumber *)@(222)); // 追加打印其他信息
}
%end
五,实战练习
1,代码(微信发现页)
%group iOS9
@interface YJPerson
- (NSString *)name;
- (void)setName:(NSString *)name;
- (void)run;
@end
%hook FindFriendEntryViewController
- (void)updateViewWhenSelectTab:(_Bool)arg1 {
NSLog(@"class-----%p", %c(FindFriendEntryViewController));
NSLog(@"metaClass-----%p", %c(+FindFriendEntryViewController));
YJPerson *person = [[%c(YJPerson) alloc] init];
person.name = @"zhangsan";
NSLog(@"name-----%@", person.name);
[person run];
%orig;
%orig(NO);
}
%end
%subclass YJPerson : NSObject
%property (nonatomic, copy) NSString *name;
%new
- (void)run {
NSLog(@"run-----");
%log;
%log((NSString *)@"111", (NSNumber *)@(222));
NSLog(@"run-----");
}
%end
%end
%hook FindFriendEntryViewController
- (void)reloadData {
NSLog(@"reloadData-----");
}
%end
%ctor {
NSString *version = [UIDevice currentDevice].systemVersion;
if (version.doubleValue >= 9.0) {
%init(iOS9);
} else {
%init;
}
}
2,打印

六,logify.pl
1,位置

2,作用
- 将头文件转换为带有打印代码的
hook
文件
3,头文件(微信发现页)

4,转换

5,hook文件

6,解决编译报错
- 将
struct stEntryRow
替换为void


- 删除
.cxx_construct
和.cxx_destruct
方法


7,查看打印信息(将make package调整为debug模式)

网友评论