2010-11-12 19 views
21

Los iPhones Jailbroken me dan coraje ya que contaminan algunas API fundamentales en iOS, al usar MobileSubstrate.Detectar la suplantación UDID en el iPhone en tiempo de ejecución

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

creo que muchas de las aplicaciones utilizan UDID como medio para autenticar un dispositivo y/o un usuario, ya que es semi-automática y práctico, pero usted debe ser consciente de este problema: UIDevice no es tan manipulación indebida prueba como debería ser Hay una aplicación llamada UDID Faker, que te permite simular fácilmente el UDID de otra persona en 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 se puede ver, el método uniqueIdentifier en la clase UIDevice ahora vuelve fakeUDID en cualquier aplicación.

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

Lo que quería hacer es: Cuando el UIDevice contaminado se detecta al iniciar, alerta y sale (0).

Ideas?

+2

tío ... estás dando estas ideas a otras personas ... quiero decir que podrías haber publicado solo la pregunta sin el código de muestra y las API/Enlaces exactos para la suplantación de identidad. Ahora todos los usuarios de SO saben cómo suplantar un UDID. – lukya

+2

Las personas con tales intenciones o no tienen la capacidad de entender el código anterior, o tienen la capacidad y ya saben sobre ello. –

+0

Vamos, todos los usuarios de SO deben saber cómo usar google. El hecho de que los enlaces no estén aquí, no significa que alguien interesado en él no lo encuentre. – JustSid

Respuesta

35

No hay una forma realmente segura de verificar si el UDID es real. El UDID se consiguió a través de liblockdown, que se comunica a 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 está jailbroken, los 4 componentes pueden ser reemplazados.


Un método para detectar la presencia de UDID Faker es comprobar si existe a algunas identificaciones (archivos, funciones, etc.) únicos. Este es un contraataque muy específico y frágil, ya que cuando se expone el método de detección, el spoofer simplemente puede cambiar la identificación para ocultar su existencia.

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

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 podría ser utilizado para eludir el falsificador:

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 radica en cómo funciona Mobile Substrate. El código inyectado debe estar ubicado en un dylib/bundle, 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 se encuentra 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 
} 

todos modos UDID Faker es un corte 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 pidiendo que el UDID baje al nivel de liblockdown. Esto se puede usar para aplicaciones para plataformas Jailbroken, pero esto no es posible para las 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 lockdownd en sí mismo.

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

(no voy a mostrar cómo utilizar liblockdown aquí. Usted debe ser capaz de encontrar suficiente información del sitio que ha enlazado a.)

+0

¡Guau, gracias por su respuesta elaborada, KennyTM! ¡Perfecto! – kenn

+0

¡Muchas gracias por su respuesta detallada! En parte estoy usando tu código, pero recibo algunas advertencias, ¡¿tal vez me puedes ayudar ?! He incluido 'mach-o/dyld.h'. La línea 'uikit_loc = _dyld_get_image_header (i);' plantea la advertencia _Edición semántica: Asignando a 'void *' desde 'const struct mach_header *' descarta qualifiers_ y 'if (funcptr Stefan

-3

La clave es la detección de un dispositivo de JB y no corriendo en él.

+2

Eso es un poco duro, entonces estás castigando a todos los usuarios de JB. No todos los usuarios de JB son piratas, solo fíjate en el éxito de las aplicaciones pagas y los ajustes en la tienda de Cydia. – newenglander

Cuestiones relacionadas