Определение того, является ли iPhone сломан Jail программно

79

Как определить (программно), является ли iPhone / iPod:

  1. Тюрьма сломана
  2. Запуск взломанной копии вашего программного обеспечения

Pinch Media может определить, сломан ли телефон или запущено программное обеспечение. Кто-нибудь знает, как они это делают? Есть ли библиотеки?

Ричард Стеллинг
источник
1
Apple знает, как это определить: p
Джош Джордан
2
См. Также: stackoverflow.com/questions/413242/…
e.James
2
Если вас интересует этот вопрос, почему бы не поддержать предложение Area 51 о взломе сайта Stack Exchange
Ричард Стеллинг,

Ответы:

39

Вот один из способов определить, было ли ваше приложение взломано.

Вкратце: взлом обычно требует изменения Info.plist. Поскольку это обычный файл, к которому у вас есть доступ, такие изменения довольно легко определить.

заковыря
источник
1
К сожалению, есть обходной путь, который нарушает этот механизм обнаружения. После установки приложения ключ SignerIdentity больше не нужен, поэтому взломщик может просто ввести ssh в свой взломанный телефон и отредактировать список, чтобы удалить его.
Лили Баллард,
@KevinBallard у вас есть какие-нибудь рекомендации по обнаружению распространенных джейлбрейков в 2017 году?
Cœur
@ Cœur Нет, я не смотрел на это с тех пор, как написал этот комментарий.
Лили Баллард
25

Обнаружить взломанный телефон так же просто, как проверить наличие /private/var/lib/apt/папки. Хотя это не определяет пользователей, использующих только установщик, к настоящему времени большинство из них установили Cydia, Icy или RockYourPhone (все они используют apt)

Самый простой способ обнаружить пиратских пользователей - проверить наличие SignerIdentityключа в вашем приложении Info.plist. Поскольку продвинутые взломщики могут легко найти стандартные [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]проверки, лучше всего скрыть эти вызовы, используя среду выполнения Objective C, доступную через #import <objc/runtime.h>или альтернативные эквиваленты.

rpetrich
источник
10

Чтобы расширить ответ заковыря, вы можете использовать следующий код:

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

ОДНАКО лицо, взломавшее ваше приложение, может выполнить шестнадцатеричное редактирование вашей программы и, как таковое, может отредактировать строку @ "SignerIdentity" так, чтобы она читалась как @ "siNGeridentity" или что-то еще, что вернет nil, и таким образом пройдет.

Итак, если вы используете это (или любое другое предложение из http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Не ждите, что это будет работать вечно
  • Не используйте эту информацию, чтобы каким-либо образом нарушить / помешать вашему приложению (в противном случае у них будет причина для его редактирования, чтобы ваше приложение не узнало, что оно взломано)
  • Вероятно, разумно скрыть этот фрагмент кода. Например, вы можете поместить обратную строку в кодировке base64 в свой код, а затем декодировать ее в приложении, изменив процесс.
  • Подтвердите свою валидацию позже в своем коде (например, когда я сказал SignerIdentity, действительно ли он сказал SignerIdentity или siNGeridentity?)
  • Не рассказывайте людям на общедоступных веб-сайтах, таких как stackoverflow, как вы это делаете.
  • Имейте в виду, что это всего лишь руководство, и оно не является надежным (и не защищенным от взлома!) - большая мощность влечет за собой большую ответственность.
Бенджи
источник
Таким образом, это проверяет SignerIdentity в вашем комплекте приложений, но как насчет случая, когда приложение не взломано или что-то еще, кроме устройства JailBroken, как вы это обнаружите?
Эдвард Ашак
Задайте это как вопрос о SO, и кто-нибудь ответит :)
Benjie
5

Чтобы расширить комментарии Йонеля и Бенджи выше:

1) Метод Лэндона Фуллера, основанный на проверке шифрования, связанный выше yonel, кажется, единственный, который до сих пор не побежден автоматизированными инструментами взлома. Я бы не стал слишком беспокоиться о том, что Apple изменит состояние заголовка LC_ENCRYPTION_INFO в ближайшее время. Похоже, что это оказывает непредсказуемое влияние на взломанные айфоны (даже когда пользователь купил копию ...)

В любом случае, я бы не стал предпринимать никаких опрометчивых действий против пользователя на основе этого кода ...

2) В дополнение к комментарию Бенджи re. запутывания (абсолютная необходимость при решении любых строковых значений в борьбе с пиратством коды): подобная , но , возможно , еще более простым способом, чтобы всегда проверять подсоленную хешированную версию значения вы ищете. Например (даже если эта проверка больше не эффективна), вы должны проверять имя каждого ключа MainBundle как md5 (keyName + "некоторая секретная соль") с соответствующей константой ... Скорее базовый, но обязательно отразите любую попытку найти строка.

Конечно, это требует, чтобы вы могли косвенно запрашивать значение, которое вы хотите сравнить (например, просматривая массив, содержащий его). Но так бывает чаще всего.


источник
Работоспособен ли метод Лэндона Фуллера в настоящее время с iOS 7?
Basil Bourque