zoukankan      html  css  js  c++  java
  • Swift 判断是否是调试模式以及是否越狱

    以下两段代码是从安全公司里面代码

    判断是否是调试模式

    extension UIApplication {
    
        var isBeingDebugged: Bool {
            // Initialize all the fields so that,
            // if sysctl fails for some bizarre reason, we get a predictable result.
            var info = kinfo_proc()
            // Initialize mib, which tells sysctl the info we want,
            // in this case we're looking for info about a specific process ID.
            var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
            // Call sysctl.
            var size = MemoryLayout.stride(ofValue: info)
            let junk = sysctl(&mib, u_int(mib.count), &info, &size, nil, 0)
            assert(junk == 0, "sysctl failed")
            // We're being debugged if the P_TRACED flag is set.
            return (info.kp_proc.p_flag & P_TRACED) != 0
        }
    
    }
    
    

    判断是否越狱

    import Foundation
    
    var isJailbroken: Bool {
        return jailbreakFileExists
            || sandboxBreached
            || evidenceOfSymbolLinking
    }
    
    private var evidenceOfSymbolLinking: Bool {
        var s = stat()
        guard lstat("/Applications", &s) == 0 else { return false }
        return (s.st_mode & S_IFLNK == S_IFLNK)
    }
    
    private var sandboxBreached: Bool {
        guard (try? " ".write(
            toFile: "/private/jailbreak.txt",
            atomically: true, encoding: .utf8)) == nil else {
                return true
        }
        return false
    }
    
    private var jailbreakFileExists: Bool {
        let jailbreakFilePaths = [
            "/Applications/Cydia.app",
            "/Library/MobileSubstrate/MobileSubstrate.dylib",
            "/bin/bash",
            "/usr/sbin/sshd",
            "/etc/apt",
            "/private/var/lib/apt/"
        ]
        let fileManager = FileManager.default
        return jailbreakFilePaths.contains { path in
            if fileManager.fileExists(atPath: path) {
                return true
            }
            if let file = fopen(path, "r") {
                fclose(file)
                return true
            }
            return false
        }
    }
    
    
    
    
  • 相关阅读:
    CentOS创建vsftp进行读写操作的简单方法
    [知乎]经典古诗词
    js仿手机端九宫格登录功能
    Android Studio 小技巧合集
    Android MVPR 架构模式
    剖析OkHttp缓存机制
    Java Observable 模式
    使用Rxjava缓存请求
    ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
    ThreadPoolExecutor使用介绍
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/13871134.html
Copyright © 2011-2022 走看看