美文网首页
攻防笔记一

攻防笔记一

作者: 浪淘沙008 | 来源:发表于2019-08-08 16:24 被阅读0次

    hook没有任何防护的代码

    • hook没有任何防护的代码,如图
    屏幕快照 2019-08-08 上午11.20.01.png 屏幕快照 2019-08-08 上午11.21.42.png

    图一是正常创建的工程项目,图二是通过MonkeyDev创建的Logos Tweak工程,目的是通过图二工程hook图一的touch方法,正常将两个工程运行到手机上点击即可发现hook效果

    hook通过设置Other Linker Flags防护的代码

    • 防护方法 原理:由于该hook方式是通过动态库插入的形式来进行hook的,在dyld在加载时也会检测是否允许插入,所以可以通过该方式禁止动态库的插入。在运行代码时,程序会在MachO文件中寻找__RESTRICT所对应的字段,如果字段值为__restrict时,那么该程序拒绝插入,防止被直接hook。实现方式在Build Settings中的Other Linker Flags的值设置为“-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null”,该方法仅在iOS 10.0以下有用,iOS 10.0以后苹果的LYLD不再检测RESTRICT字段
    -Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
    
    • 破解方法:当对ipa进行重签后,开发者可直接通过修改内存中RESTRICT的内容来使防护失效
    • 防护方法 原理:当开发者通过修改RESTRICT的值来进行hook时,我们可以通过检测RESTRICT是否被修改来判断应用是否存在被hook的风险,从而进行下一步防护
    
    #import <mach-o/loader.h>
    #import <mach-o/dyld.h>
    
    
    #if __LP64__
    #define macho_header               mach_header_64
    #define LC_SEGMENT_COMMAND        LC_SEGMENT_64
    #define LC_SEGMENT_COMMAND_WRONG LC_SEGMENT
    #define LC_ENCRYPT_COMMAND        LC_ENCRYPTION_INFO
    #define macho_segment_command    segment_command_64
    #define macho_section            section_64
    #else
    #define macho_header               mach_header
    #define LC_SEGMENT_COMMAND        LC_SEGMENT
    #define LC_SEGMENT_COMMAND_WRONG LC_SEGMENT_64
    #define LC_ENCRYPT_COMMAND        LC_ENCRYPTION_INFO_64
    #define macho_segment_command    segment_command
    #define macho_section            section
    #endif
    
    + (void)load
    {
        const struct mach_header_64 * header = _dyld_get_image_header(0);//获取可执行文件的头部
        if (hasRestrictedSegment(header)) {
            NSLog(@"防止Tweak注入状态!!");
        }else{
            NSLog(@"被修改了,进行下一步操作");
        }
    }
    
    static bool hasRestrictedSegment(const struct macho_header* mh)
    {
        const uint32_t cmd_count = mh->ncmds;
        const struct load_command* const cmds = (struct load_command*)(((char*)mh)+sizeof(struct macho_header));
        const struct load_command* cmd = cmds;
        for (uint32_t i = 0; i < cmd_count; ++i) {
            switch (cmd->cmd) {
                case LC_SEGMENT_COMMAND:
                {
                    const struct macho_segment_command* seg = (struct macho_segment_command*)cmd;
                    
                    printf("seg name: %s\n", seg->segname);
                    if (strcmp(seg->segname, "__RESTRICT") == 0) {
                        const struct macho_section* const sectionsStart = (struct macho_section*)((char*)seg + sizeof(struct macho_segment_command));
                        const struct macho_section* const sectionsEnd = &sectionsStart[seg->nsects];
                        for (const struct macho_section* sect=sectionsStart; sect < sectionsEnd; ++sect) {
                            if (strcmp(sect->sectname, "__restrict") == 0)
                                return true;
                        }
                    }
                }
                    break;
            }
            cmd = (const struct load_command*)(((char*)cmd)+cmd->cmdsize);
        }
        
        return false;
    }
    
    
    • 破解方法:通过二进制文件查找方法并修改方法的内容

    白名单防护

    RESTRICT防护的方式在iOS 10.0之后失效,所以需要通过其它方式来检测第三方插件的插入

    • 获取白名单(上线前)
    #import <mach-o/dyld.h>
    #import <mach-o/loader.h>
    
    void whiteList() {
        int count = _dyld_image_count();
        for (int i = 0; i < count; i++) {
            const char * imageName = _dyld_get_image_name(i);
            printf("%s \n", imageName);
        }
    }
    
    • 白名单检测
    const char * libsName = "";     // 白名单,
    
    bool CheckWhiteList() {
        int count = _dyld_image_count(); //加载库的数量
        for (int i = 0; i < count; i++) {
            const char * imageName = _dyld_get_image_name(i);
            if (!strstr(libsName, imageName) && !strstr(imageName, "/var/containers/Bundle/")) {  //  /var/containers/Bundle 由于应用本身所在位置会不同,所以要排除应用本身的检测
                printf("该库不在白名单%s \n", imageName);
                return NO;
            }
        }
        return YES;
    }
    

    相关文章

      网友评论

          本文标题:攻防笔记一

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