hook framework_hook反越狱检测解读

本文介绍了iOS App在运行过程中的安全检测,特别是针对越狱设备的检测方法。通过分析App的加载流程,提出在+[NSObject load]方法中进行hook可以抢占先机。同时,提供了多种判断手机是否越狱的代码示例,包括检查越狱文件、能否打开Cydia、获取所有应用名称以及检测系统方法是否被hook。此外,还涉及了检测动态库注入和环境变量篡改的策略,以确保App的安全运行。
摘要由CSDN通过智能技术生成

抖音系列检测很严格 包括ker fish 等类型的hook 还有签名, 非法模块, 以及非官方dylib检测都有做包含了大概3000+的AB点, 能过的基本大仙级别,  能做的基本都是大佬, pay for much much money , 很值得!

1、iOS App运行的步骤为:

用户点击App启动

-> load(各种framework和dylib, 包含MobileLoader加载dylib) ->main()-> UIApplicationMain -> AppDelegate -> UIWindow -> ViewControllers -> View...

2、占得先机hook检测函数

对于App厂商而言,App越狱检测可能出现在main或以后的任何环节,

为了掌控一切,占得先机很有必要。

经过实测,发现+[NSObject load]中进行hook居然比dylib的入口函数还快!

static __attribute__((constructor)) void _logosLocalInit() {    // TODO:   printf("DYLIB START RUNNING.");}

那么,猜想+[NSObject load] hook 可以占得先机

dae669b0e7407ce91eae57bd04a940eb.png

3、测试

部分代码如下:

+ (void)load{    staticdispatch_once_t once;    dispatch_once(&once, ^{        rebind_symbols((structrebinding[9]){            {"fork", replaced_fork, (void*)&original_fork},            {"stat", replaced_stat, (void*)&original_stat},            {"access", replaced_access, (void*)&original_access},            {"fopen", replaced_fopen, (void*)&original_fopen},            {"dlopen", replaced_dlopen, (void*)&original_dlopen},            {"dladdr", replaced_dladdr, (void*)&original_dladdr},            {"dlsym", replaced_dlsym, (void*)&original_dlsym},            {"dlopen_preflight", replaced_dlopen_preflight, (void*)&original_dlopen_preflight},            {"dyld_get_image_name", replaced_dyld_get_image_name, (void*)&original_dyld_get_image_name}        },9);    printf("NSObject load RUNNING.");    });}

6c27a5711c6ade3495f166a5961710e5.png

判断手机越狱的几种方式:

  1. 通过手机越狱后增加的越狱文件判断

  2.  // 通过越狱后增加的越狱文件判断   class func isContainJailBreakFiles() -> Bool {       let files = [     "/Applications/Cydia.app",     "/Applications/limera1n.app",     "/Applications/greenpois0n.app",     "/Applications/blackra1n.app",     "/Applications/blacksn0w.app",     "/Applications/redsn0w.app",     "/Applications/Absinthe.app",     "/Library/MobileSubstrate/MobileSubstrate.dylib",     "/bin/bash",     "/usr/sbin/sshd",     "/etc/apt",     "/private/var/lib/apt/" ] for file in files {     if FileManager.default.fileExists(atPath: file) {         return true     } } return false
  3. 根据是否能打开cydia判断

    /// 根据是否能打开cydia判断


  4. class func canOpenCydia() -> Bool { if let url = URL(string: "cydia://") {     return UIApplication.shared.canOpenURL(url) } else {     return false  }}

3.根据是否能获取所有应用的名称判断,没有越狱的设备是没有读取所有应用名称的权限的

/// 读取应用列表

class func canGetApplicationList() -> Bool {    guard FileManager.default.fileExists(atPath: "/User/Applications/") else {        return false    }    do {        let appList = try FileManager.default.contentsOfDirectory(atPath: "/User/Applications/")        return !appList.isEmpty    } catch {        print("get app list error \(error)")        return false    }}

564aa7c6896a6d47ded418c85c65e867.png

4.根据使用stat方法来判断cydia是否存在来判断

攻击者可能会 hook NSFileManager 的方法,那么,你可以回避 NSFileManager,使用 stat 系列函数检测 Cydia 等工具.

bool checkCydia() {  struct stat stat_info;  return 0 == stat("/Applications/Cydia.app", &stat_info);}

攻击者可能会利用 Fishhook 原理 hook 了 stat。
那么,你可以看看 stat 是不是出自系统库,有没有被攻击者换掉

bool checkInject() {int ret ;Dl_info dylib_info;char *dylib_name = "/usr/lib/system/libsystem_kernel.dylib";int (*func_stat)(const char *, struct stat *) = stat;if ((ret = dladdr(func_stat, &dylib_info))) {    printf("lib :%s", dylib_info.dli_fname);    return strcmp(dylib_info.dli_fname, dylib_name) != 0;  }return false;}

9782920db108b764d1e34ebb5ff97d8f.png

  1. 检索一下应用程序是否被链接了异常动态库
    通常情况下,会包含越狱机的输出结果会包含字符串:

  2. Library/MobileSubstrate/MobileSubstrate.dylib
  3. bool checkDylibs() {uint32_t count = _dyld_image_count();for (uint32_t i = 0 ; i < count; ++i) { if (strcmp(_dyld_get_image_name(i), "Library/MobileSubstrate/MobileSubstrate.dylib") == 0) {     return true;  }}return false;}
  4. 通过检测当前程序运行的环境变量
    攻击者可能会给 MobileSubstrate 改名,但是原理都是通过 DYLD_INSERT_LIBRARIES注入动态库。

  bool checkEnv() {  char *env = getenv("DYLD_INSERT_LIBRARIES");  return env != nil; }

84b2c8b359e169b0b7284fc399e87277.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值