小编:在isf会议上小编见到了碳基体MM真身,很友善很漂亮:)
一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备越狱与否的。但很显然,我忽略了一个问题,app在设计的时候或许会依照设备是否越狱而采取不同的流程,比如说对越狱的设备采取更多的安全措施,在这种场景下,越狱检测是否可靠就成为了关键问题。本篇文章主要介绍越狱检测的常见方法(并配有相应的测试代码),以及最流行的越狱检测绕过插件xCon(会分析该工具会绕过哪些检测方法),最后总结了个人认为的比较可靠的越狱检测方法。
以下是最常见的越狱文件。可以使用stat函数来判断以下文件是否存在
/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate /Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装 /var/cache/apt /var/lib/apt /etc/apt /bin/bash /bin/sh /usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config
代码如下:
这种方法是目前最靠谱的方法,调用_dyld_image_count()和_dyld_get_image_name()来看当前有哪些dylib被加载
使用下面代码就可以知道目标iOS设备加载了哪些dylib
#include <string.h> #import <mach-o/loader.h> #import <mach-o/dyld.h> #import <mach-o/arch.h> void printDYLD() { //Get count of all currently loaded DYLD uint32_t count = _dyld_image_count(); for(uint32_t i = 0; i < count; i++) { //Name of image (includes full path) const char *dyld = _dyld_get_image_name(i); //Get name of file int slength = strlen(dyld); int j; for(j = slength - 1; j>= 0; --j) if(dyld[j] == '/') break; printf("%s\n", dyld); } printf("\n"); } int main(int argc, char *argv[]) { printDYLD(); NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; }
可以使用otool工具将该文件的text section反汇编出来从而了解程序的具体逻辑(在windows下可以使用IDA Pro查看)
DANI-LEE-2:iostools danqingdani$ otool -tV xCon.dylib >xContextsection
可以根据文件中的函数名,同时结合该工具的原理以及越狱检测的一些常用手段(文章第一部分有介绍)来猜其逻辑,例如越狱检测方法中的文件系统检查,会根据特定的文件路径名来匹配,我们可以使用strings查看文件中的内容,看看会有哪些文件路径名。
DANI-LEE-2:IAP tools danqingdani$ strings xCon.dylib >xConReadable
以下是xCon中会匹配的文件名
/usr/bin/sshd /usr/libexec/sftp-server /usr/sbin/sshd /bin/bash /bin/sh /bin/sw /etc/apt /etc/fstab /Applications/blackra1n.app /Applications/Cydia.app /Applications/Cydia.app/Info.plist /Applications/Cycorder.app /Applications/Loader.app /Applications/FakeCarrier.app /Applications/Icy.app /Applications/IntelliScreen.app /Applications/MxTube.app /Applications/RockApp.app /Applications/SBSettings.app /Applications/WinterBoard.app /bin/bash/Applications/Cydia.app /Library/LaunchDaemons/com.openssh.sshd.plist /Library/Frameworks/CydiaSubstrate.framework /Library/MobileSubstrate /Library/MobileSubstrate/ /Library/MobileSubstrate/DynamicLibraries /Library/MobileSubstrate/DynamicLibraries/ /Library/MobileSubstrate/DynamicLibraries/LiveClock.plist /Library/MobileSubstrate/DynamicLibraries/Veency.plist /Library/MobileSubstrate/DynamicLibraries/xCon.plist /private/var/lib/apt /private/var/lib/apt/ /private/var/lib/cydia /private/var/mobile/Library/SBSettings/Themes /private/var/stash /private/var/tmp/cydia.log /System/Library/LaunchDaemons/com.ikey.bbot.plist /System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist NzI0MS9MaWJyYXJ5L01vYmlsZVN1YnN0cmF0ZQ== (对应7241/Library/MobileSubstrate)
通过分析,xCon会绕过以下越狱检测方法
(1)根据是否存在特定的越狱文件,及特定文件的权限是否发生变化来判断设备是否越狱
fileExistsAtPath: fileExistsAtPath:isDirectory: filePermission: fileSystemIsValid: checkFileSystemWithPath:forPermissions: mobileSubstrateWorkaround detectIllegalApplication:
(2)根据沙箱完整性检测设备是否越狱
(3)根据文件系统的分区是否发生变化来检测设备是否越狱
(4)根据是否安装ssh来判断设备是否越狱
(1)检查常见的越狱文件是否存在,使用stat(),检查以下文件是否存在
/Library/MobileSubstrate/MobileSubstrate.dylib 最重要的越狱文件,几乎所有的越狱机都会安装MobileSubstrate /Applications/Cydia.app/ /var/lib/cydia/绝大多数越狱机都会安装 /var/cache/apt /var/lib/apt /etc/apt /bin/bash /bin/sh /usr/sbin/sshd /usr/libexec/ssh-keysign /etc/ssh/sshd_config
(2)检查特定的文件是否是符号链接文件,使用lstat(),检查以下文件是否为符号链接文件
/Applications /Library/Ringtones /Library/Wallpaper /usr/include /usr/libexec /usr/share
http://theiphonewiki.com/wiki/index.php?title=Bypassing_Jailbreak_Detection