一、Hook的实现:自己工程中交换 实例方法、类方法
1.新建一个项目工程
2.创建一个类HookMgr,用来实现方法交换的
-
HookMgr 类
#import <Foundation/Foundation.h>
@interface HookMgr : NSObject
//Hook方法
+ (void)hookClass:(Class)class oldMethod:(SEL)oldMethod newMethod:(SEL)newMethod;
@end
#import "HookMgr.h"
#import <objc/message.h>
@implementation HookMgr
/** Hook方法
SEL IMP
字符串(char*) --> 函数指针
方法指针交换 --> 方法交换
*/
+ (void)hookClass:(Class)class oldMethod:(SEL)oldMethod newMethod:(SEL)newMethod {
// 获得实例方法
Method old = class_getInstanceMethod(class, oldMethod);
Method new = class_getInstanceMethod(class, newMethod);
// 方法交换:交换IMP
method_exchangeImplementations(old, new);
}
-
ViewController 类
#import "ViewController.h"
#import "HookMgr.h"
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/** 方法的交换
*/
//交换实例方法
[HookMgr hookClass:self.class oldMethod:@selector(oldMethod) newMethod:@selector(newMethod)];
[HookMgr hookClass:self.class oldMethod:@selector(btnClick:) newMethod:@selector(newClick:)];
//交换类方法
[HookMgr hookClass:object_getClass(self.class) oldMethod:@selector(oldClassMethod) newMethod:@selector(newClassMethod)];
}
- (IBAction)btnClick:(id)sender {
NSLog(@"btnClick: 按钮点击!! ");
}
- (void)newClick:(id)sender {
NSLog(@"newClick: 按钮点击!! ");
}
+ (void)newClassMethod {
NSLog(@"---newClassMethod被调用");
}
+ (void)oldClassMethod {
NSLog(@"---oldClassMethod被调用");
}
- (void)newMethod {
NSLog(@"---新:newMethod被调用");
}
- (void)oldMethod {
NSLog(@"---旧:oldMethod被调用");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self oldMethod];
[ViewController oldClassMethod];
}
@end
二、Hook微信的注册方法
1、请先看这篇文章:iOS逆向009--代码注入、Dylib注入
2、使用注入Framework库的项目工程,来做这份案例
3、修改shell脚本,将Framework库添加到MachO文件
# ---------------------------------------------------
# 7. 注入我们编写的动态库
echo "开始注入"
# 需要注入的动态库的路径 这个路径我就写死了!
# INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libZMHook.dylib"
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/ZMHookFramework.framework/ZMHookFramework"
#
## 通过工具实现注入 MachO文件
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"
4、运行工程,查看微信注册按钮
所在的类:Target <WCAccountLoginControlLogic: 0x104de6930>
点击响应的按钮:Action onFirstViewRegester
image.png
5、将微信的头文件导出,查看WCAccountLoginControlLogic类
image.png5.1 //连续的3个命令:导出 Wechat 的所有头文件
$ cd ZM_破坏微信的注册.app
$ ls
$ class-dump -H WeChat -o /Users/zhangmeng/Desktop/WeChatHeardes/
5.2 将Headers文件夹拖到Sublime Text工具,
使用快捷键:Cmd+Shift+F查找 WCAccountLoginControlLogic,双击WCAccountLoginControlLogic.h文件,进入此文件
6、编辑Hook微信注册的方法
#import "ZM_Hook.h"
#import <objc/message.h>
@implementation ZM_Hook
+ (void)load
{
//拿到微信的 注册方法
Method oldMethod = class_getInstanceMethod(objc_getClass("WCAccountLoginControlLogic"), @selector(onFirstViewRegester));
//自己的方法
Method newMethod = class_getInstanceMethod(self, @selector(test1));
method_exchangeImplementations(oldMethod, newMethod);
NSLog(@"---ZM_破坏微信的注册:成功了!!🍺🍺🍺🍺🍺🍺!!");
}
- (void)test1 {
NSLog(@"哥们检测到异常,不能注册!!😆😆😆😆😆😆");
}
@end
7、运行工程,Hook微信注册方法
- 运行成功打印:---ZM_破坏微信的注册:成功了!!🍺🍺🍺🍺🍺🍺!!
- 点击注册按钮打印:哥们检测到异常,不能注册!!😆😆😆😆😆😆
网友评论