Обнаружение подделки UDID на iPhone во время выполнения - PullRequest
21 голосов
/ 12 ноября 2010

Взломанные айфоны действуют мне на нервы, поскольку они портят некоторые фундаментальные API для iOS с помощью MobileSubstrate.

http://www.iphonedevwiki.net/index.php/MobileSubstrate

Я считаю, что многие приложения используют UDID для проверки подлинности устройстваи / или пользователя, поскольку он полуавтоматический и удобный, но вы должны знать об этой проблеме: UIDevice не так защищен, как должно быть.Существует приложение под названием UDID Faker, которое позволяет легко подделывать чужой UDID во время выполнения.

http://www.iphone -network.net / how-to-fake-udid-on-ios-4 /

Вот его исходный код:

//
//  UDIDFaker.m
//  UDIDFaker
//

#include "substrate.h"

#define ALog(...) NSLog(@"*** udidfaker: %@", [NSString stringWithFormat:__VA_ARGS__]);
#define kConfigPath @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist"

@protocol Hook
- (NSString *)orig_uniqueIdentifier;
@end

NSString *fakeUDID = nil;

static NSString *$UIDevice$uniqueIdentifier(UIDevice<Hook> *self, SEL sel) {  

    if(fakeUDID != nil) {
                 ALog(@"fakeUDID %@", fakeUDID);
        /* if it's a set value, make sure it's sane, and return it; else return the default one */
                return ([fakeUDID length] == 40) ? fakeUDID : [self orig_uniqueIdentifier];

    }
    /* ... if it doesn't then return the original UDID */
    else {
        return [self orig_uniqueIdentifier];
    }
}

__attribute__((constructor)) static void udidfakerInitialize() {  

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSString *appsBundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
        ALog(@"Loading UDID Faker into %@", appsBundleIdentifier);


        NSDictionary *config = [NSDictionary dictionaryWithContentsOfFile: kConfigPath];
        fakeUDID = [config objectForKey: appsBundleIdentifier];
        [fakeUDID retain];

        if(fakeUDID != nil) {

                ALog(@"Hooking UDID Faker into %@", appsBundleIdentifier);
                MSHookMessage(objc_getClass("UIDevice"), @selector(uniqueIdentifier), (IMP)&$UIDevice$uniqueIdentifier, "orig_");
        }

    [pool release];
}

Как видите, метод uniqueIdentifier в классе UIDevice теперь возвращает fakeUDID для любых приложений.

ItПохоже, что Skype и некоторые другие приложения обнаруживают такого рода заражение, но я не знаю, как это сделать.

Что я хотел сделать, так это: при обнаружении испорченного UIDevice при запуске, предупреждении и выходе (0).

Идеи?

Ответы [ 2 ]

36 голосов
/ 13 ноября 2010

Не существует действительно безопасного способа проверить, является ли UDID реальным. UDID получен через liblockdown, который связывается с lockdownd через защищенный канал для получения UDID:

+-----------+
| your code |
+-----------+
      |
+----------+       +-------------+       +-----------+
| UIDevice |<----->| liblockdown |<=====>| lockdownd |   (trusted data)
+----------+       +-------------+       +-----------+
         untrusted user                   trusted user

Когда устройство взломано, все 4 компонента могут быть заменены.


Один из способов обнаружения присутствия UDID Faker заключается в проверке, существуют ли некоторые идентификаторы (файлы, функции и т. Д.), Уникальные для него. Это очень специфическая и хрупкая контратака, так как при раскрытии метода обнаружения спуфер может просто изменить идентификацию, чтобы скрыть свое существование.

Например, UDID Faker использует plist-файл /var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist. Следовательно, вы можете проверить, существует ли этот файл:

NSString* fakerPrefPath = @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist";
if ([[NSFileManager defaultManager] fileExistsAtPath:fakerPrefPath])) {
   // UDID faker exists, tell user the uninstall etc.
}

также определяет метод -[UIDevice orig_uniqueIdentifier], который можно использовать для обхода фейкера:

UIDevice* device = [UIDevice currentDevice];
if ([device respondsToSelector:@selector(orig_uniqueIdentifier)])
   return [device orig_uniqueIdentifier];
else
   return device.uniqueIdentifier;

Конечно, спуфер может просто переименовать эти вещи.


Более надежный метод заключается в том, как работает мобильный субстрат. Внедренный код должен находиться в dylib / bundle, который загружается в область памяти , отличную от UIKit. Поэтому вам просто нужно проверить, находится ли указатель функции метода -uniqueIdentifier в допустимом диапазоне.

// get range of code defined in UIKit 
uint32_t count = _dyld_image_count();
void* uikit_loc = 0;
for (uint32_t i = 0; i < count; ++ i) {
   if (!strcmp(_dyld_get_image_name(i), "/System/Library/Frameworks/UIKit.framework/UIKit")) {
     uikit_loc = _dyld_get_image_header(i);
     break;
   }
}

....

IMP funcptr = [UIDevice instanceMethodForSelector:@selector(uniqueIdentifier)];
if (funcptr < uikit_loc) {
   // tainted function
}

В любом случае UDID Faker - это хак очень высокого уровня (то есть его можно легко избежать). Он перехватывает связь между UIDevice и liblockdown, предоставляя поддельный идентификатор.

+-----------+
| your code |
+-----------+
      |
+----------+       +-------------+       +-----------+
| UIDevice |<--.   | liblockdown |<=====>| lockdownd |   (trusted data)
+----------+   |   +-------------+       +-----------+
               |   +------------+
               ‘-->| UDID Faker |
                   +------------+

Таким образом, вы можете переместить код, запрашивающий UDID ниже, на уровень liblockdown. Это можно использовать для приложений для платформ Jailbroken, но это невозможно для приложений AppStore, поскольку liblockdown является частным API. Кроме того, спуфер может взломать liblockdown (это очень легко, я надеюсь, что никто этого не сделает) или даже заменить сам lockdownd.

                   +-----------+
                   | your code |
                   +-----------+
                         |
+----------+       +-------------+       +-----------+
| UIDevice |<--.   | liblockdown |<=====>| lockdownd |   (trusted data)
+----------+   |   +-------------+       +-----------+
               |   +------------+
               ‘-->| UDID Faker |
                   +------------+

(Я не собираюсь здесь показывать, как использовать liblockdown. Вы должны быть в состоянии найти достаточно информации на сайте, на который вы ссылались.)

0 голосов
/ 05 сентября 2012

Ключ обнаруживает устройство JB и не работает на нем.

...