这儿每天同享一个 iOS 的新知识,快来注重我吧

前语

iPhone 越狱现已不是什么新鲜事,但是越狱之后意味着现已拿到了体系的所有权限,继续在越狱的设备上工作你的程序也就意味着不再安全,因此目前许多主流的 App 都是阻止工作在此类设备上的。

但是怎样判别一个设备是否为越狱的机器呢?今日就来讲讲我所知道的一些方法。

方法一

检查手机上是否设备了 Cydia,玩越狱的同学肯定都清楚,这个 app 堪称是越狱体系的 App Store,上边可以设备各种正规 App Store 设备不到的软件。Cydia 上除了独立的运用程序之外,更多的包是 iOS 自身和运用程序的扩展、修正和主题。

因此可以说只要是越狱的设备,都会设备这个运用,那我们只需要检测这个运用存不存在就行了。

这儿首要用到的方法是用 canOpenURL 是否能打开 cydia:// 这个 URL Scheme。

funcisJailBreak()->Bool{
returnUIApplication.shared.canOpenURL(URL(string:"cydia://")!)
}

这儿记得把 cydia 加入到 info.plist 中的 LSApplicationQueriesSchemes 字段里才干正常检测运用是否设备

这种方法简略粗暴,不过不建议用,由于准确度或许不高,一方面 cydia 或许把这个 URL Scheme 改掉防止你检测。另一方面正常手机也或许会有一个 app 的 URL Scheme 叫这个名字,构成误判。

方法二

检测是否存在 MobileSubstrate 动态库,这个库是 cydia 的柱石,越狱环境下设备绝大部分插件,有必要要有 MobileSubstrate,因此我们只需要判别是否存在这个动态库即可。

我在网上找了一个 c 言语的完成:

bool
isJailBreak(void)
{
constchar*constimageName="MobileSubstrate";
if(imageName!=NULL){
constuint32_timageCount=_dyld_image_count();
for(uint32_tiImg=0;iImg<imageCount;iImg++){
constchar*name=_dyld_get_image_name(iImg);
if(strstr(name,imageName)!=NULL){
returntrue;
}
}
}
returnfalse;
}

方法三

仍是检测文件,假设越狱的话,设备会创建许多文件,可以运用 FileManager 来检测这些文件是否存在:

funcisJailBreak()->Bool{
#iftargetEnvironment(simulator)
returnfalse
#else
letfiles=[
"/private/var/lib/apt",
"/Applications/Cydia.app",
"/Applications/RockApp.app",
"/Applications/Icy.app",
"/Applications/WinterBoard.app",
"/Applications/SBSetttings.app",
"/Applications/blackra1n.app",
"/Applications/IntelliScreen.app",
"/Applications/Snoop-itConfig.app",
"/bin/sh",
"/usr/libexec/sftp-server",
"/usr/libexec/ssh-keysign/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
"/System/Library/LaunchDaemons/com.ikey.bbot.plist",
"/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
"/Library/MobileSubstrate/DynamicLibraries/Veency.plist"
]
returnfiles.contains(where:{
returnFileManager.default.fileExists(atPath:$0)
})
#endif
}

这儿有个条件编译,在模拟器下是不需要检查的。

方法四

越狱之后所有 App 都被颁发 root 权限,并且可以修正沙箱之外的文件。利用这个特色,假设我们的 App 可以写入其沙箱之外的文件,则证明该设备已越狱:

funcisJailBreak()->Bool{
letstring="iOS新知"
do{
trystring.write(to:URL(filePath:"/private/myfile.txt"),atomically:true,encoding:.utf8)
returntrue
}catch{
returnfalse
}
}

方法五

越狱之后也就意味着 App 可以随意调用体系 API 了,因此我们可以测验调用体系 API,来检查是否能得到正确成果,以此来判别是否越狱:

funcisJailBreak()->Bool{
letRTLD_DEFAULT=UnsafeMutableRawPointer(bitPattern:-2)
letforkPtr=dlsym(RTLD_DEFAULT,"fork")
typealiasForkType=@convention(c)()->Int32
letfork=unsafeBitCast(forkPtr,to:ForkType.self)
returnfork()!=-1
}

建议以上五种方法结合运用,前进检测的准确率

检测到越狱设备,阻止运用

假设检测到其时工作环境为越狱设备,可以强制退出 App,以确保安全。强制退出 app 的方法就许多了,可以运用 exit(-1),也可以人为做个数组越界之类的:

//检测到越狱设备
ifisJailBreak(){
//退出app
exit(-1)
//或者数组越界crash
//[0][1]
}

这儿每天同享一个 iOS 的新知识,快来注重我吧

本文同步自微信大众号 “iOS新知”,每天按时同享一个新知识,这儿仅仅同步,想要及时学到就来注重我吧!