Не существует действительно безопасного способа проверить, является ли 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. Вы должны быть в состоянии найти достаточно информации на сайте, на который вы ссылались.)