iOS逆向0010--HOOK(MethodSwizzle-方法

2018-05-18  本文已影响73人  lukyy

一、Hook的实现:自己工程中交换 实例方法、类方法

1.新建一个项目工程
2.创建一个类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);
}
#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.png

5.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文件,进入此文件

image.png image.png

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微信注册方法

上一篇下一篇

猜你喜欢

热点阅读