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
        }
    }
    
    
    
    
  • 相关阅读:
    文件和目录之文件访问权限
    文件和目录之设置用户ID和设置组ID
    文件和目录之文件类型
    文件和目录之stat、fstat和lstat函数
    实用编程技术之多个头文件中变量的重复定义
    带缓冲I/O和不带缓冲I/O的区别与联系
    如何使用nodejs发邮件
    cosmic_download-AsyncPool待修正
    python性能分析之line_profiler模块
    python性能分析之cProfile模块
  • 原文地址:https://www.cnblogs.com/gaox97329498/p/13871134.html
Copyright © 2011-2022 走看看