美文网首页
iOS逆向0010--HOOK(MethodSwizzle-方法

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

作者: lukyy | 来源:发表于2018-05-18 14:40 被阅读73次

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

    • 运行成功打印:---ZM_破坏微信的注册:成功了!!🍺🍺🍺🍺🍺🍺!!
    • 点击注册按钮打印:哥们检测到异常,不能注册!!😆😆😆😆😆😆

    相关文章

      网友评论

          本文标题:iOS逆向0010--HOOK(MethodSwizzle-方法

          本文链接:https://www.haomeiwen.com/subject/iyegdftx.html