without what the semi check iphone spoofing udid

what - udid iphone xs



Detectar la falsificación de UDID en el iPhone en tiempo de ejecución (2)

Los iPhones de Jailbroken se ponen nerviosos porque mancha algunas API fundamentales en iOS, mediante el uso de MobileSubstrate.

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

Creo que muchas aplicaciones utilizan UDID como medio para autenticar un dispositivo y / o un usuario, ya que es semiautomático y práctico, pero debe tener en cuenta este problema: el dispositivo UID no es tan a prueba de manipulaciones como debería ser. Hay una aplicación llamada UDID Faker, que le permite falsificar fácilmente el UDID de otra persona en el tiempo de ejecución.

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

Aquí está el código fuente de la misma:

// // 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]; }

Como puede ver, el método uniqueIdentifier en la clase UIDevice ahora devuelve fakeUDID en cualquier aplicación.

Parece que Skype y algunas otras aplicaciones detectan este tipo de mancha, pero no sé cómo hacerlo.

Lo que quería hacer es: cuando se detecte un dispositivo UID contaminado al iniciar, alertar y salir (0).

Ideas?


La clave es detectar un dispositivo JB y no ejecutarse en él.


No hay una manera realmente segura de verificar si el UDID es real. El UDID se obtiene a través de liblockdown, que se comunica con lockdownd a través de un canal seguro para recibir el UDID:

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

Cuando el dispositivo tiene jailbreak, se pueden reemplazar los 4 componentes.

Un método para detectar la presencia de UDID Faker es verificar si existen algunas identificaciones (archivos, funciones, etc.) exclusivas. Este es un contraataque muy específico y frágil, ya que cuando el método de detección está expuesto, el spoofer podría simplemente cambiar la identificación para ocultar su existencia.

Por ejemplo, UDID Faker se basa en un archivo /var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist . Por lo tanto, puede comprobar si este archivo existe:

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

también define el método -[UIDevice orig_uniqueIdentifier] que se podría usar para evitar el faker:

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

Por supuesto, el spoofer podría simplemente cambiar el nombre de estas cosas.

Un método más confiable reside en cómo funciona Mobile Substrate. El código inyectado debe estar ubicado en un dylib / paquete, que se carga en una región de memoria diferente de UIKit. Por lo tanto, solo necesita verificar si el puntero de función del método -uniqueIdentifier está dentro del rango aceptable.

// 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 }

De todos modos, UDID Faker es un hack de muy alto nivel (es decir, se puede evitar fácilmente). Secuestra el enlace entre UIDevice y liblockdown proporcionando una identificación falsa.

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

Por lo tanto, podría mover el código solicitando que el UDID baje al nivel de bloqueo de datos. Esto se puede usar para aplicaciones para plataformas de Jailbroken, pero esto no es posible para aplicaciones de AppStore porque liblockdown es una API privada. Además, el spoofer podría secuestrar liblockdown (es muy fácil, espero que nadie lo haga), o incluso reemplazar el propio lockdownd.

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

(No voy a mostrar cómo usar liblockdown aquí. Debes poder encontrar suficiente información en el sitio al que te has vinculado).