Ответ 1
Не существует действительно надежного способа проверить, действительно ли UDID. UDID получен через liblockdown, который связывается с блокировкой по защищенному каналу для получения 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. Кроме того, spoofer может захватить liblockdown (это очень легко, я надеюсь, что никто этого не делает), или даже заменить lockdownd сам.
+-----------+
| your code |
+-----------+
|
+----------+ +-------------+ +-----------+
| UIDevice |<--. | liblockdown |<=====>| lockdownd | (trusted data)
+----------+ | +-------------+ +-----------+
| +------------+
‘-->| UDID Faker |
+------------+
(Я не буду показывать, как использовать liblockdown здесь. Вы должны быть в состоянии найти достаточную информацию с сайта, с которым вы связались.)