有些app喜欢检测是否手机已经越狱,然后做一些处理,那么这里收集了一些方法,看看是否是越狱的
1. 常见越狱文件
const char *examineBreak_Tool_pathes[] = {
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt"
};
// 判断是否存在越狱文件
for (int i = 0; i < 5; i++) {
if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:examineBreak_Tool_pathes[i]]]){
return YES;
}
}
2.如果是非越狱情况下,返回的是nil
,如果是越狱了,返回了是个随机的字符串,判断length
即可
char *printEnv(void){
char *env = getenv("DYLD_INSERT_LIBRARIES");
return env;
}
3.检测一下是否安装了cydia
这个软件,亲测可用
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
return YES;
}
4.检测Mach-o
文件的插入库有无MobileSubstrate.dylib
这个库
遍历_dyld_get_image_name(i)获取的名称中是不是包含了Library/MobileSubstrate/MobileSubstrate.dylib
5.你可以看看stat
是不是出自系统库
有没有被攻击者换掉:如果结果不是 /usr/lib/system/libsystem_kernel.dylib
的话,那就100%被攻击了。
#import <dlfcn.h>
void checkInject(void)
{
int ret ;
Dl_info dylib_info;
int (*func_stat)(const charchar *, struct stat *) = stat;
if ((ret = dladdr(func_stat, &dylib_info))) {
NSLog(@"lib :%s", dylib_info.dli_fname);
}
}
后记:这个方法已经不好使了--读取系统所有的应用名称
系统已经不然我们获取其他文件。
// 过去好使,现在不行了.读取系统所有的应用名称
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
return YES;
}
读取系统文件已经过时了
说句题外话
如何检测这个app是不是来自于AppStore
,查看有无描述文件即可
//其实只要用这个就行,如果有路径,说明就是被重新签名了
[[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]
//验证一下猜测,看看是不是真的
NSFileManager *mgr = [NSFileManager defaultManager];
Bool have = [mgr fileExistsAtPath:@"/var/mobile/Containers/Bundle/Application/BECE8DA0-FA49-4BAE-9717-2ACB3FB3E4E4/Di.app/embedded.mobileprovision"];
网友评论