有些app不希望在越狱的设备上运行,于是我们需要去判断下设备是否越狱
+(BOOL)isJailbroken{
//check runtime env
char *env =getenv("DYLD_INSERT_LIBRARIES");
if (env !=nil) {
//NSLog(@"env %s", env );
returnYES;
}
//check system lib
int ret;
Dl_info dylib_info;
NSString *libStr=@"/usr/lib/system/libsystem_kernel.dylib";
int (*func_stat)(constchar*,structstat *) =stat;
if ((ret =dladdr(func_stat, &dylib_info))) {
//NSLog(@"lib:%s",dylib_info.dli_fname);
if (![libStrisEqualToString:FORMAT(@"%s", dylib_info.dli_fname)]) {
returnYES;
}
}
//Directory permissions checking
NSArray *nameArray =@[@"/Applications/Cydia.app",
@"/Library/MobileSubstrate/MobileSubstrate.dylib",
@"/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",
@"/var/lib/xcon"
];
structstat s;
for (NSString *fileNamein nameArray) {
constchar *charFileName = [fileNameUTF8String];
// if (stat(charFileName, &s) != -1) { //replace stat to be lstat for pen test issue
if (lstat(charFileName, &s) != -1) {
returnYES;
}
}
//Directory permissions checking ...
NSArray *dicrectoryArray =@[@"/Applications",
@"/Library/Ringtones",
@"/Library/Wallpaper",
@"/usr/include",
@"/usr/libexec",
@"/usr/share"
];
structstat d;
for (NSString *dNamein dicrectoryArray) {
constchar *charDName = [dNameUTF8String];
lstat(charDName, &d);
if (d.st_mode &S_IFLNK) {
returnYES;
}
}
NSMutableArray *mutArray = [NSMutableArrayarrayWithArray:nameArray];
[mutArray addObjectsFromArray:dicrectoryArray];
[mutArray removeObject:@"/Applications"];
[mutArray removeObject:@"/Library/Ringtones"];
[mutArray removeObject:@"/usr/share"];
NSInteger index =0;
for (NSString *fNamein mutArray) {
// [[TFSLog getInstance] logString:[NSString stringWithFormat:@"%s(Line: %d)To detect Jailbroken: FILENAME = %@", __func__, __LINE__, fName] type:TFSLOGINFO];
FILE *output =fopen([fNameUTF8String],"r");
NSLog(@"index = [%ld], fileName = %@", (long)index++, fName);
if (output) {
NSLog(@"isJailbroken: %@", fName);
returnYES;
}
fclose(output);
}
//Process forking
if (fork() != -1) {
returnYES;
}
NSError *error;
NSString *stringToBeWritten =@"this is test";
[stringToBeWritten writeToFile:@"/private/1.txt"atomically:YESencoding:NSUTF8StringEncodingerror:&error];
if (error ==nil) {
returnYES;
} else {
[[NSFileManagerdefaultManager]removeItemAtPath:@"/private/1.txt"error:nil];
}
//dyld checking
uint32_t count =_dyld_image_count();
for(uint32_t i =0; i < count; i++){
constchar *dyld =_dyld_get_image_name(i);
NSInteger slength =strlen(dyld);
NSInteger j;
for (j = slength -1; j >=0; --j){
if(dyld[j] =='/') {
break;
}
}
NSString *dyldString = [NSStringstringWithUTF8String:dyld];
if ([dyldStringhasSuffix:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] ||
[dyldString hasSuffix:@"/Library/MobileSubstrate/DynamicLibraries/xCon.dylib"]) {
returnYES;
}
}
@try {
// Create socket
int socketFileDescriptor =socket(AF_INET,SOCK_STREAM,0);
// Get IP address from host
//
structhostent * remoteHostEnt =gethostbyname([@"127.0.0.1"UTF8String]);
structin_addr * remoteInAddr = (structin_addr *)remoteHostEnt->h_addr_list[0];
// Set the socket parameters
structsockaddr_in socketParameters;
socketParameters.sin_family =AF_INET;
socketParameters.sin_addr = *remoteInAddr;
socketParameters.sin_port =22;
// Connect the socket
int ret =connect(socketFileDescriptor, (structsockaddr *) &socketParameters,sizeof(socketParameters));
if (-1 != ret) {
close(socketFileDescriptor);
returnYES;
}else{
close(socketFileDescriptor);
}
}
@catch (NSException *exception) {
NSLog(@"exception == %@", exception);
}
returnNO;
}
有需要的可以拿去用