iOS 判断设备是否越狱

    xiaoxiao2022-06-29  45

    有些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;

    }

    有需要的可以拿去用

    转载请注明原文地址: https://ju.6miu.com/read-1125314.html

    最新回复(0)