it-swarm.com.ru

Как определить, что приложение работает на взломанном устройстве?

Я только что выпустил свое приложение для iOS, но я не уверен, как обезопасить его от взломщиков. 

Можно ли что-то сделать, чтобы приложение не работало на взломанных устройствах?

47
R. Dewi

С помощью кода вы можете определить, работает ли приложение на сломанном устройстве или нет. Таким образом, вы можете вызвать предупреждение и закрыть приложение. Вы можете делать все, что хотите. Вот учебник для него:

http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

и вот сообщение о переполнении стека:

Как я могу определить, что приложение iOS работает на взломанном телефоне?

Кроме того, если вы хотите законченное решение, вы можете увидеть в tapjoy sdk code. Они обнаруживают взломанный iPhone. Вот тапфой URL https://www.tapjoy.com/

46
Rahul Vyas

Проверьте эти пути

+ (BOOL)isJailBroken {
#ifdef TARGET_IPHONE_SIMULATOR
    return NO;
#endif

    NSArray *paths = @[@"/bin/bash",
                       @"/usr/sbin/sshd",
                       @"/etc/apt",
                       @"/private/var/lib/apt/",
                       @"/Applications/Cydia.app",
                       ];

    for (NSString *path in paths) {
        if ([self fileExistsAtPath:path]) {
            return YES;
        }
    }

    return NO;
}


+ (BOOL)fileExistsAtPath:(NSString *)path {
    FILE *pFile;
    pFile = fopen([path cStringUsingEncoding:[NSString defaultCStringEncoding]], "r");
    if (pFile == NULL) {
        return NO;
    }
    else
        fclose(pFile);
    return YES;
}

Кроме того, вы можете посмотреть https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalJailbreakDettection/OneSignalJailbreakDetection.m

6
onmyway133

Попробуйте найти файл, созданный cydia или взломанным устройством. Или попробуйте записать файл вне черного ящика приложения. Если вам это удастся, устройство взломано/взломано :)

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
5
karim

Основываясь на ответе @ karim, вот немного измененная версия Swift:

func hasJailbreak() -> Bool {
    #if Arch(i386) || Arch(x86_64)
        println("Simulator")
        return false    
    #else
        var fileManager = NSFileManager.defaultManager()
        if(fileManager.fileExistsAtPath("/private/var/lib/apt")) {
            println("Jailbroken Device")
            return true
        } else {
            println("Clean Device")
            return false
        }
    #endif
}
4
inVINCEable
-(BOOL) isJailbroken
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
    // device is NOT jailbroken
    fclose(f);
    NSLog(@"no");
    return NO;
}
else {
    // device IS jailbroken
    fclose(f);
    NSLog(@"yes");
    return YES;

}
#endif
}
4
sinh99

Вы можете определить, является ли устройство взломанным или нет, проверив следующее

  1. Cydia установлена
  2. Проверьте некоторые из системных путей
  3. Может выполнить проверку целостности песочницы
  4. Выполните проверку символической ссылки
  5. Убедитесь, что вы создаете и пишете файлы за пределами своей песочницы

Существует библиотека с открытым исходным кодом я создал из различных статей и книг, попробуйте. 

3
user3088680

Даже если ваше устройство взломано, ipa-приложения могут получить доступ только к своим собственным песочницам, поэтому Если устройство взломано или нет, ваш метод вернет NO:) Ищите другой путь Также, если вы попытаетесь получить доступ куда-нибудь, но ваше приложение публикации песочницы в магазине приложений может столкнуться с проблемами

2
user1846654
/**
     Detect that the app is running on a jailbroken device or not

     - returns: bool value for jailbroken device or not
     */
    public class func isDeviceJailbroken() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            return false
        #else
            let fileManager = FileManager.default

            if (fileManager.fileExists(atPath: "/bin/bash") ||
                fileManager.fileExists(atPath: "/usr/sbin/sshd") ||
                fileManager.fileExists(atPath: "/etc/apt")) ||
                fileManager.fileExists(atPath: "/private/var/lib/apt/") ||
                fileManager.fileExists(atPath: "/Applications/Cydia.app") ||
                fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") {
                return true
            } else {
                return false
            }
        #endif
    }
1
CrazyPro007

Есть много способов найти взломанные устройства. Проверка техники cydia не будет работать, если опытный хакер изменит путь к приложению.

Хороший способ проверить это - посмотреть, сможем ли мы изменить файл в другом месте за пределами пакета приложения.

NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES
         encoding:NSUTF8StringEncoding error:&error];
if(error==nil){
   //Device is jailbroken
   return YES;
 } else {
   //Device is not jailbroken
   [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
 }

Найдите больше методов в приведенном ниже URL

http://highaltitudehacks.com/2013/12/17/ios-application-security-part-24-jailbreak-detection-and-evasion/

0
Boobalan

Нет никакого способа обнаружить, если устройство взломано.

Учтите, что даже если бы оно существовало, устройство уже было взломано, что означает выполнение произвольного кода, и джейлбрейкер просто изменил бы любой метод обнаружения, который вы использовали бы, чтобы сообщить, что устройство не было взломано.

ссылка: https://forums.developer.Apple.com/thread/43073

кредиты идут сотрудникам Apple, которые ответили на этот же вопрос

0
igrek

Swift 3:  

func hasJailbreak() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            print("Simulator")
            return false
        #else
            return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
        #endif
    }
0
Maksim Kniazev