美文网首页
iOS 逆向防护(一)

iOS 逆向防护(一)

作者: 木扬音 | 来源:发表于2021-06-11 15:51 被阅读0次

1、DYLD_INSERT_LIBRARIES

注意:该方法只支持iOS10以下系统并且只防护动态库插入的形式,在高版本上系统不会去检查该函数

我们在低版本的DYLD源码中可以发现在环境变量DYLD_INSERT_LIBRARIES判断之前有这样一个代码。
gLinkContext.processIsRestricted == YES即当前进程受限制的时候,pruneEnvironmentVariables函数会移除相关的环境变量,也就是insert_libraries里的数据会清空,即我们插入的动态库无法被加载

pruneEnvironmentVariables源码解析

  • DYLD_INSERT_LIBRARIES 判断


    DYLD_INSERT_LIBRARIES 判断
  • gLinkContext.processIsRestricted 进程受限


    进程受限
  • 全局搜索processIsRestricted = true,我们可以看到下图红框的有两个判断,其中issetugid是不能自己调用的,所以只剩hasRestrictedSegment这个方法,它是判断当前mach-o是否受限,因为他在dyld之前,所以这个函数没法进行hook

    processIsRestricted = true
  • hasRestrictedSegment函数就是通过读取mach-o文件中的load commands,判断当前segname == "__RESTRICT",并且sectname == __restrict,就返回true

    hasRestrictedSegment函数
  • 没有进行防护的mach-o文件


    没有进行防护的mach-o文件

防护

选择Targets --> Build Settings --> Other Linker Flags,点击添加-Wl,-sectcreate,__RESTRICT,__resyrict,/dev/null

添加linker

编译运行后,查看对应的mach-o

防护后的mach-o

破解processIsRestricted防护

当我们通过二进制修改工具来修改对应的__RESTRICT 和 __restrict后,该防护就会失效,

image.png

优化

我们可以将DYLD中hasRestrictedSegment方法复制到自己工程中,来检测mach-o中的__RESTRICT段是否被修改,当我们检测到工程被人注入的时候,我们可以向服务器发送请求标记当前账号、手机被注入,或者我们前端主动进行断网的操作,或者在网络请求的时候返回脏数据,封杀IP地址等等,切记不可做一些强标记,例如直接退出程序,防止被人找到当前防注入的方法进行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

@interface ViewController ()

@end

@implementation ViewController

+(void)load
{
    const struct macho_header * header = _dyld_get_image_header(0);
    if (yp_hasRestrictedSegment(header)) {
        NSLog(@"防止Tweak注入!");
    }else{
        NSLog(@"被修改了!");
//        exit(0);//相当于这是一个记号! -- 给服务器发请求!
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

//-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
 //   //这里不能碰!
 //  exit(0);
//}

static bool yp_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);
                //dyld::log("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;
}

@end

相关文章

  • iOS 逆向防护(一)

    1、DYLD_INSERT_LIBRARIES 注意:该方法只支持iOS10以下系统并且只防护动态库插入的形式,在...

  • iOS逆向之文件系统结构

    上一篇文章地址:iOS逆向之介绍 上一篇文章中,介绍了iOS逆向做了些什么,需要怎样的防护,逆向的流程,提到的工具...

  • iOS 逆向防护(二)

    白名单检测 上一篇文章中我们解决了iOS10以下系统的防止动态库注入的方式,这篇文章我们通过白名单检测的方式来防止...

  • 一 iOS 逆向工程概述

    1 什么是iOS逆向工程 2 iOS逆向的目的 3 iOS逆向过程以及方法 一 什么是iOS逆向工程 iOS逆向...

  • iOS逆向学习

    参考文章:iOS逆向开发记录:iOS逆向之手机越狱iOS逆向之介绍iOS逆向之文件系统结构iOS逆向之文件权限及类...

  • iOS逆向工程 - 基本防护

    知道了 HOOK 的原理,接下来我们就可以做一些代码的基本防护了。我们今天基本防护要达到的目的是:自己的 Meth...

  • iOS应用之逆向防护

    iOS的逆向步骤一般为: 脱壳可执行文件 使用IDE或Hopper反编译分析代码逻辑 使用class-dump加l...

  • iOS 逆向 -- 动态调试防护

    ptrace debugserver通过ptrace函数调试app ptrace是系统函数,此函数提供一个进程去监...

  • 2021全新iOS学习方向

    iOS逆向安防学习 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂。这对于刚接触i...

  • iOS 逆向开发(三)代码分析-dump-class/Hoppe

    iOS逆向系列: 1、iOS 逆向开发(一)界面分析 - Cycript&Reveal2、iOS 逆向开发(二)砸...

网友评论

      本文标题:iOS 逆向防护(一)

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