iOS防护----越狱检测2021年版

如何检测越狱手机一直是iOS应用安全防护的第一道门槛。
早在2018年的时候就写过一篇文章来介绍越狱检测,但是由于时间久远,技术在不断地推陈出新,因此当初的代码大多已经被各种反越狱插件研究透彻,因此才有了这篇新的文章。

首先最好使的依然是检测各个越狱常用的软件是否存在:

static char *paths[] = {
    "/Applications/ALS.app"
    "/Applications/Cydia.app",
    "/Applications/FakeCarrier.app",
    "/Applications/Filza.app",
    "/Applications/FlyJB.app",
    "/Applications/IntelliScreen.app",
    "/Applications/MTerminal.app",
    "/Applications/SBSetttings.app",
    "/Applications/Snoop-itConfig.app"
    "/Applications/WinterBoard.app",
    "/Applications/blackra1n.app",
    "/Library/LaunchDaemons/com.openssh.sshd.plist"
    "/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
    "/Library/LaunchDaemons/com.tigisoftware.filza.helper.plist",
    "/Library/LaunchDaemons/com.rpetrich.rocketbootstrapd.plist",
    "/Library/LaunchDaemons/dhpdaemon.plist",
    "/Library/LaunchDaemons/re.frida.server.plist",
    "/Library/MobileSubstrate",
    "/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
    "/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/System/Library/LaunchDaemons/com.ikey.bbot.plist",
    "/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
    "/User/Applications/",
    "/bin.sh",
    "/bin/bash",
    "/etc/apt",
    "/etc/ssh/sshd_config",
    "/private/etc/apt",
    "/private/etc/apt/preferences.d/checkra1n",
    "/private/etc/apt/preferences.d/cydia",
    "/private/etc/dpkg/origins/debian",
    "/private/etc/ssh/sshd_config",
    "/private/var/lib/apt",
    "/private/var/lib/cydia",
    "/private/var/mobileLibrary/SBSettingsThemes/",
    "/private/var/stash",
    "/private/var/tmp/cydia.log",
    "/usr/bin/cycript",
    "/usr/bin/ssh",
    "/usr/lib/libcycript.dylib",
    "/usr/libexec/cydia/",
    "/usr/libexec/sftp-server",
    "/usr/libexec/ssh-keysign",
    "/usr/local/bin/cycript",
    "/usr/sbin/frida-server",
    "/usr/sbin/sshd",
    "/var/lib/cydia",
    "/var/lib/dpkg/info"
};

BOOL checkPath() {
   
    for (int i = 0;i < sizeof(paths) / sizeof(char *);i++) {
        struct stat stat_info;
        if (0 == stat(paths[i], &stat_info)) {
            return YES;
        }
    }
    
    return NO;
}

这么做其实有问题,如果大家知道有个叫fishhook的东西,其实很容易就能hook stat函数,那么应该怎么办呢?
我们可以用函数指针调用的方式隐藏一下:

BOOL checkPath() {
    void * handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
    stat_ptr_t stat_ptr = dlsym(handle, "stat");
    for (int i = 0;i < sizeof(paths) / sizeof(char *);i++) {
        struct stat stat_info;
        if (0 == stat_ptr(paths[i], &stat_info)) {
            return YES;
        }
    }
    return NO;
}

但是dlopen调用的方式,想必大家也能看出如何破解,fishhook既然能hook你的stat,难道就不能hook你的dlopen和dlsym吗?
所以我们再加大些力度,直接用汇编搞一个stat的调用:

__attribute__((always_inline)) long f_stat(const char * s, struct stat * stat_info) {
    long ret = 0;
    __asm__ volatile(
                     "mov x0, %[s_p]\n"
                     "mov x1, %[stat_info_p]\n"
                     "mov x16, #338\n"
                     "svc #0x80\n"
                     "mov %[ret_p], x0\n"
        : [ret_p]"=r"(ret)
        : [s_p]"r"(s), [stat_info_p]"r"(stat_info)
    );
    return ret == 0 ? ret : -1;
}

BOOL checkPath() {
    for (int i = 0;i < sizeof(paths) / sizeof(char *);i++) {
        struct stat stat_info;
        if (0 == f_stat(paths[i], &stat_info)) {
            return YES;
        }
    }
    return NO;
}

其中mov x16, #338代表的是stat函数的系统调用号,完整的系统调用号可以从这里查看

当然,我们除了stat函数,还可以使用open函数来判断:

__attribute__((always_inline)) long f_open(const char *path) {
    long rs = 0;
    __asm__ volatile(
                     "mov x0, %[path]\n"
                     "movz x1, #0\n"
                     "movz x16, #5\n"
                     "svc #0x80\n"
                     "mov %[result], x0\n"
                     : [result]"=r"(rs)
                     : [path]"r"(path)
                     );
    
    return rs > 2 ? rs : -1;
}

BOOL checkPath() {
    for (int i = 0;i < sizeof(paths) / sizeof(char *);i++) {
        if (-1 != f_open(paths[i])) {
            return YES;
        }
    }
    return NO;
}

至于汇编代码为什么要这么写,可以看一下这篇文章,自己领悟一下。

防护做到这里,我们其实可以成功的防御fishhook的攻击,但是目前国内的大神做了一个叫Dobby的inlinehook框架,专治各种防御,那么针对Dobby这种inlinehook的方式我们又应该如何防御呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • iOS应用安全 攻易防难,唯有缜密、多层的防护网络才能可靠的保护我们iOS应用程序的安全。那么,一个完善的iOS应...
    求长生阅读 797评论 0 0
  • 在逆向和保护的过程中,总会涉及到反调试和反反调试的问题,这篇文章主要是总结一下几种常见的反调试手段。 当我们上线一...
    含笑州阅读 2,683评论 1 4
  • 前沿 公司项目,最新的一个版本,bugly崩溃率突然升高,而且发生在一个未知的动态库。观察了几天发现:每天发生有固...
    张聪_2048阅读 4,082评论 0 2
  • 一: ptrace 作用 ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的...
    ldzSpace阅读 12,271评论 1 26
  • 如果你看完书中的所有例子,你很可能已经做完你的实验和在已经越狱的iPhone上的研究。因为和许多人一样,几乎所有的...
    fishmai0阅读 15,648评论 2 42