文章目录
以%百分号开头的语句,是logos语法,可以在theos tweek里面使用
%hook
%hook 类名
方法1..
方法2..
%end
%hook 后面的类名,是要替换的类名, 里面的 self, 就是这个类
self 要使用的方法,如果报错找不到方法名,则要在前面声明这个类有这个方法,语法如下:
@interface 类名
声明的方法
@end
例如make时候报错如下:
Tweak.x:19:25: error: no visible @interface for 'FindFriendEntryViewController' declares the selector 'numberOfSectionsInTableView:'
if ( section == [self numberOfSectionsInTableView:tableView ] - 1 ){
~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~
解决方法:
声明self是什么类,在里面加上方法名,如下:
@interface FindFriendEntryViewController
- (long long)numberOfSectionsInTableView:(id)arg1;
@end
方法2:声明这个类,并且说明他遵守哪个协议,因为上面的numberOfSectionsInTableView是在协议UITableViewDataSource里定义的,所以声明self的类遵守了哪个协议,就代表里面有哪些方法.
@interface FindFriendEntryViewController<UITableViewDataSource>
@end
%new
%new
方法名1..
%new
方法名2..
- %new下面的方法,是自己添加的方法,不是之前类拥有的方法.自定义的方法都要加在 %new 里
- %new一定要写在%hook 和 %end之间,就是在%hook 类的里面,否则编译报错
- 自定义的%new方法要在%hook之前声明,格式如下,否则会报错找不到方法
error: no visible @interface for ‘类名’ declares the selector ‘方法名’
@interface 类名
方法名
@end
%orig
调用原来的方法,自动传入原来所有参数,例如原来方法参数是3个,就自动传入3个,不需要手动填写参数列表
%orig;
发布debug和release版本
在cydia中已安装可以查看 是debug版还是release版本
在make之后的mage package决定打包什么版本
debug版本 直接输入make package
make package
release版本 添加debug=0
make package debug=0
%c
下面2行代码等价%c() 等价于 NSClassFromString ,可以返回字符串表示的类对象
NSClassFromString(@"Student")
%c(Student)
%ctor
在动态库被加载的时候调用的方法,注意不要写在%hook和%end之间
%ctor{
NSLog(@"ctor执行-------------");
}
%dtor
在app被关闭的时候调用,注意不要写在%hook和%end之间
%dtor{
NSLog(@"dtor-------------");
}
获取原来app里的对象变量MSHookIvar
MSHookIvar<变量类型>(要获取的对象, "变量名");
例如下面代码 返回原理的self对象里面的age变量
unsigned int age = MSHookIvar<unsigned int>(self, "age");