美文网首页iOS安全
[iOS逆向]10、HOOK防护&MonkeyDev

[iOS逆向]10、HOOK防护&MonkeyDev

作者: 史记_d5da | 来源:发表于2022-01-08 19:12 被阅读0次

    1、替换系统IMP

    1.1、创建FrameWork

    在framework中通过fishhook替换系统的IMP
    MethodSwizzle
    1、method_exchangeImplementations 交换两个IMP
    2、class_replaceMethod 替换某个SEL的IMP(如果没有该方法,就添加。相当于替换掉该方法)
    3、method_setImplementation、method_getImplementation 获取和设置某个方法的IMP(很多三方框架在使用)
    fishhook
    Facebook提供的一个工具,利用MachO文件的加载原理,动态修改懒加载两个符号表
    原理:
    共享缓存:iOS系统有一块特殊的位置,存放公用动态库。动态库共享缓存(dyld shared cache)
    PIC技术:
    1、由于外部的函数调用,在我们编译时刻是没法确定其内存地址的
    2、苹果就采用PIC技术(位置无关代码)。外部函数存放在MachO文件DATA(需要可读可写)段,建立两张表,懒加载和非懒加载,里面存放指向外部函数的指针。
    3、首次调用懒加载函数,会去找桩代码。首次执行会执行Binder函数
    4、通过字符找到懒加载表:fishhook利用stringTable->Symbols->indirect Symbols->懒加载符号表之间的对应关系。通过重绑定修改指针的值
    Cydia Substrate
    一个强大的框架
    AntiHookCode代码

    @implementation AntiHookCode
    +(void)load {
        //exchange
        struct rebinding exchange;
        exchange.name = "method_exchangeImplementations";
        exchange.replacement = my_exchange;
        exchange.replaced = (void *)&exchangeP;
        
        //setIMP
        struct rebinding setIMP;
        setIMP.name = "method_setImplementation";
        setIMP.replacement = my_exchange;
        setIMP.replaced = (void *)&setIMP_p;
        
        //getIMP
        struct rebinding getIMP;
        getIMP.name = "method_getImplementation";
        getIMP.replacement = my_exchange;
        getIMP.replaced = (void *)&getIMP_p;
    
        struct rebinding bds[] = {exchange,setIMP,getIMP};
        rebind_symbols(bds, 3);
    }
    
    //指针!这个可以暴露给外接!我自己的工程使用!!
    void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
    
    IMP _Nonnull (*setIMP_p)(Method _Nonnull m, IMP _Nonnull imp);
    IMP _Nonnull (*getIMP_p)(Method _Nonnull m);
    
    void my_exchange(Method _Nonnull m1, Method _Nonnull m2){
        NSLog(@"检测到了HOOK!");
    }
    @end
    

    分别导出exchangeP、setIMP_p、getIMP_p供外界使用

    CF_EXPORT void (*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);
    CF_EXPORT IMP _Nonnull (*setIMP_p)(Method _Nonnull m, IMP _Nonnull imp);
    CF_EXPORT IMP _Nonnull (*getIMP_p)(Method _Nonnull m);
    

    2、MonkeyDev

    2.1、安装步骤

    1、安装theos
    sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
    2、配置环境变量
    export PATH=$PATH:$/opt/theos/bin
    3、安装MonkeyDev(需要耐心,翻墙多试几次)
    sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)"
    1)、报错1
    File /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Package Types.xcspec not found
    解决方案

    //建立软链接
    sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications
    

    2)、报错2,安装成功,但是退出xcode重新打开xcode闪退问题解决方案
    删除文件中/Applications/Xcode.app/Contents/PlugIns/IDEiOSSupportCore.ideplugin/Contents/Resources/Embedded-Device.xcspec连续两个<dict/><dict/>,保存文件即可
    3)、报错3,library not found for -libstdc++
    解决方案
    4)、报错4,安装报错executable not found
    解决方案:需要每次运行前,先clean


    以上安装步骤均参照github,感谢stackoverflow,感谢github

    2.2、MonkeyDev使用

    1、安装成功后,在xcode可以看到创建MonkeyDev的入口


    MonkeyDev

    2、在文件目录下TargetApp下添加需要hook的app或者ipa


    app
    3、在工程目录下编写需要hook的类和方法 添加hook代码

    相关文章

      网友评论

        本文标题:[iOS逆向]10、HOOK防护&MonkeyDev

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