Обнаружение подмены UDID на iPhone во время выполнения.

Взломанные iPhone действуют мне на нервы, поскольку они портят некоторые фундаментальные 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 *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 для любых приложений.

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

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

Идеи?

21
задан kenn 12 November 2010 в 14:10
поделиться