博客> iOS应用代码注入防护
iOS应用代码注入防护
5分钟前 评论:0 阅读:19 AG亚游集团iOSone

在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能、代码健壮相关的问题,我们有时还需要考虑到应用安全的问题。

那么应用安全的问题涉及到很多方面。比如防止静态分析的,代码混淆、逻辑混淆;防止重签名的,应用ID检测、甚至是代码的HASH检测等等。那么这篇文章我想聊聊关于代码的注入检测,因为发现随着iOS系统的更新,我们防护的手段发生了一些变化。

代码注入的方式

代码注入的方式大致分为两种

  • 越狱注入:通过修改DYLD_INSERT_LIBRARIES?环境变量的值,来插入动态库并执行

  • 非越狱注入:

    • 直接将自定义的Framwork或者dylib库打包进入APP并重签名。

    • 利用yololib修改MachO文件,添加库路径.在应用启动时,dyld会加载并执行.

早期防护方式

在工程的Build Settings中找到Other Linker Flages 并添加字段 -Wl,-sectcreate,__RESTRICT,__raestrict,/dev/null 此操作的作用是在可执行文件中添加一个Section.我们使用MachOView分析如下:

MachOView

当MachO文件中拥有这个字段,那么我们通过越狱环境插入动态库的方式就会失效.起到防护的作用.其原理在DYLD源码中可以分析到.

dyld源码分析

首先这里分析的DYLD源码版本是519.2.2版本.

我们可以通过检索DYLD_INSERT_LIBRARIES定位到_main函数加载插入动态库的代码如下.

            /load any inserted libraries
        if  ( sEnv.DYLD_INSERT_LIBRARIES != NULL ) {
            for (const char* const* lib = sEnv.DYLD_INSERT_LIBRARIES; *lib != NULL; ++lib) 
                loadInsertedDylib(*lib);
        }

但是早在这个环境变量判断之前,dyld已经做了一个判断

    if ( gLinkContext.processIsRestricted ) {
        pruneEnvironmentVariables(envp, &apple);
        /set again because envp and apple may have changed or moved
        setContext(mainExecutableMH, argc, argv, envp, apple);
    }

如果判断出进程是restricted!也就是当前进程是限制插入动态库的!就会调用pruneEnvironmentVariables函数移除相关的环境变量.

那么我们的processIsRestricted值什么时候为true呢?

继续分析源码可以发现两个关键函数影响其值.其中 hasRestrictedSegment 函数专门检测RESTRICT段

/any processes with setuid or setgid bit set or with __RESTRICT segment is restricted
    if ( issetugid() || hasRestrictedSegment(mainExecutableMH) ) {
        gLinkContext.processIsRestricted = true;
    }

通过注释也能发现.任意进程的__RESTRICT段设置为restricted动态库插入将被限制.

我们进入到processIsRestricted函数内,实现如下.

#if __MAC_OS_X_VERSION_MIN_REQUIRED
static bool hasRestrictedSegment(const macho_header* mh)
{
    const uint32_t cmd_count = mh->ncmds;
    const struct load_command* const cmds = (struct load_command*)(((char*)mh)+sizeof(macho_header));
    const struct load_command* cmd = cmds;
    for (uint32_t i = 0; i < cmd>cmd) {
            case LC_SEGMENT_COMMAND:
            {
                const struct macho_segment_command* seg = (struct macho_segment_command*)cmd;

                /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>sectname, "__restrict") == 0) 
                            return true;
                    }
                }
            }
            break;
        }
        cmd = (const struct load_command*)(((char*)cmd)+cmd->cmdsize);
    }

    return false;
}

所以通过添加Other Linker Flags 在MachO中设置RESTRICT段赋值为restricted可以用来防护越狱的代码注入.

但是新版的dyld源码中去掉了__RESTRICT检测.从iOS10开始,这种防护手段已失效

DYLD_INSERT_LIBRARIES 检测

那么既然dyld加载过程不再检测__RESTRICT段了我们就手动的检测DYLD_INSERT_LIBRARIES环境变量.通过函数可查看当前进程环境变量的值.

  char *env = getenv("DYLD_INSERT_LIBRARIES");
  NSLog(@"%s",env);

在没有插入动态库时,env为null. 那么一旦为自己的应用写入插件时,我们就可以看到控制台的输出

2019-01-03 19:20:37.285 antiInject[7482:630392] /Library/MobileSubstrate/MobileSubstrate.dylib

白名单检测

那么上面的检测只可以检测越狱环境中的代码注入,在非越狱环境中,逆向工程师可以利用yololib工具注入动态库.所以我们可以检索一下自己的应用程序所加载的动态库是否是我们源程序所有


bool HKCheckWhitelist(){

    int count = _dyld_image_count();
    for (int i = 0; i < count xss=removed xss=removed>白名单</q>.

>小编给大家推荐一个iOS技术交流群:551346706!群内提供数据结构与算法、底层进阶、swift、逆向、底层面试题整合文档等免费资料!让我们来相互学习,为了今年的跳槽加分吧!
收藏
0
AG亚游集团sina weixin mail 回到顶部
联想欲在印度生产智能可穿戴配件 并提高当地市占率 李彦宏:百度有自己的价值观 未来“AI战略”不变 澳媒:旅行住院摩纳哥最贵 一晚平均花2.3万元 为梦想前行!丁彦雨航:旅程不止 独行侠见 “时代力量”与社民党协调失败 第三势力整合破局 琼州海峡全面恢复通航 23日晚仍有1.2万汽车待渡 受投诉事件影响 京东早盘下跌超3% 委员吴杰庄:买房非终极目标 香港青年机遇在大陆 官方!曼城转会禁令危机解除 今夏可正常引援 市委原书记落马4天后 副书记被查 三因素聚合助推棉价上涨 互联网第四次上市浪潮来袭 资本盛宴远未结束
“媒体训练营”一审被判赔偿人人车30万余元并道歉 京沪男排缘何不“坦诚相见” 沈琼李牧各道原委 明天起 这些新规将影响你的生活 如何解决入园难入园贵? 政协委员提五点建议 上港憋4个月重返虹口复仇 拿申花祭旗已势不可挡 台官员发文赖清德仅给蔡英文副本 网友:拍马屁 美伊核危机推动中国原油期货发展 合约数已占全球12% 谷歌收欧盟43亿欧元“罚单” 安卓生态将生变? 揭秘在人民币上睡觉的人:金山百座 心如止水 台湾想发展核武?美国智库:台湾的面积没有必要 销分新规被误读 驾驶员到交管局前面有1277人排队 房地产税征税范围有哪些?财政部给出这些干货
时富证券:港股先低开 随后反弹 国台办前副主任:蔡英文渐进图“独” 台海危机增加 日本月内将在三泽基地部署首架自行组装的F35战机 两岸记者:改革开放造就深圳 台湾应向大陆学习 张建民任国家烟草专卖局局长 陈杰任同济大学校长 全国政协委员王小川:用科技的力量服务社会 男子月薪6000元上交妻子5500元 10年后家里没存… 蒿俊闵:李霄鹏强调要把握住开局 对手一急难免出漏洞 美股又崩了创1928年来最差二季度开局 谁最受伤? 手机可以做的打字兼职 手机可以做的打字兼职 女人没经验开什么店好 适合女性开的十五种店 AG亚游集团