前面干了那么多准备工作,了解了那么多原理性的东西,你会发现想玩下别人的app,重签,代码注入之类的步骤实在太烦躁,难道就没有别人造好的轮子吗?答案是肯定的,比较常用的就是MonkeyDev了。当然在学习使用MonkeyDev之前,必须先了解Logos。
Hook
-
1,先新建一个Demo,SB拖两个button,连线代码如下准备如下
- (IBAction)clickRightBtn:(id)sender {
NSLog(@"点击右边");
}
- (IBAction)clickLeftBtn:(id)sender {
NSLog(@"点击左边");
}
-
2,新建monkeyAPP
将Demo.app放进
TargetApp
文件夹下。
-
3,hook
在xxxxxDylib.xm编写logos代码
#import <UIKit/UIKit.h>
@interface ViewController
+(void)test;
@end
%hook ViewController
- (void)clickRightBtn:(id)org {
%orig;//调用原始函数,可以有返回值,也可以有参数
NSLog(@"我用MonkeyDev hook到你了 😆😆😆");
%log;//打印参数信息self,_com,其他参数
}
- (void)clickLeftBtn:(id)org {
NSLog(@"我用MonkeyDev hook到你了 😆😆😆");
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//%c类似self.class 也类似NSClassFromString()
[%c(ViewController) test];
}
%new //添加新方法
+(void)test{
NSLog(@"这是Monkey添加的test方法");
}
%end
点击左边按钮打印:
2018-05-16 15:41:49.515561+0800 HelloMonkeyDemo[7253:1877026] 我用MonkeyDev hook到你了 😆😆😆
点击右边按钮打印:
2018-05-16 15:43:06.922295+0800 HelloMonkeyDemo[7253:1877026] 点击右边
2018-05-16 15:43:06.922501+0800 HelloMonkeyDemo[7253:1877026] 我用MonkeyDev hook到你了 😆😆😆
2018-05-16 15:43:06.923438+0800 HelloMonkeyDemo[7253:1877026] �[1;36m[MonkeyHookDylib] �[m�[0;36m/Users/ioskaifa/Desktop/Demo/OC/FishHook/MonkeyHook/MonkeyHookDylib/Logos/MonkeyHookDylib.xm:13�[m �[0;30;46mDEBUG:�[m -[<ViewController: 0x12dd22930> clickRightBtn:<UIButton: 0x12de08110; frame = (235 267; 108 64); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x1c40313c0>>]
点击屏幕打印:
2018-05-16 15:45:01.759503+0800 HelloMonkeyDemo[7258:1878347] 这是Monkey添加的test方法
根据上面结果,可以得知,monkeyDev已经帮我们hook成功了,方法流程也简单。这个时候你是否有疑问,如果想做个系统判定,Logos怎么实现呢?当然Logos也提供了相应的方法——%group.代码如下:
%group iOS11
%hook ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"这是iOS11及其以上的版本");
}
%end
%end
%group iOS10
%hook ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"这是iOS11以下的版本");
}
%end
%end
//构造函数constructor
%ctor{
NSLog(@"%f",[UIDevice currentDevice].systemVersion.floatValue);
if([UIDevice currentDevice].systemVersion.floatValue >= 11.0){
%init(iOS11);
}else{
%init(iOS10);
}
}
我的手机是iOS11的版本,点击屏幕,打印:
2018-05-16 16:00:13.627899+0800 HelloMonkeyDemo[7271:1883283] 这是iOS11及其以上的版本
以上就是用monkeyDev一些简单的hook。
这里强烈推荐一个神器FLEX