Визначення, чи iPhone в'язниця зламана програмно


79

Як визначити (програмно), чи є iPhone / iPod таким:

  1. В'язниця зламана
  2. Запуск зламаної копії вашого програмного забезпечення

Pinch Media може виявити, чи телефон зламаний у в’язниці, чи не працює програмне забезпечення, чи хтось знає, як вони це роблять? Чи є бібліотеки?


1
Apple знає, як це визначити: p
JoshJordan

2
Дивіться також: stackoverflow.com/questions/413242 / ...
e.James

2
Якщо вас цікавить це питання, чому б не підтримати пропозицію Area 51 щодо в'язничного сайту для обміну стеками
Річард Стеллінг,

Відповіді:


39

Ось один із способів виявити, чи зламана ваша програма.

Коротше кажучи: для злому зазвичай потрібно змінити Info.plist. Оскільки це звичайний файл, до якого ви маєте доступ, визначити такі зміни досить просто.


1
На жаль, існує обхідний шлях, який порушує цей механізм виявлення. Після встановлення програми ключ SignerIdentity більше не потрібний, тому зломщик може просто ssh увійти до свого розбитого телефону та відредагувати список, щоб видалити його.
Лілі Баллард,

@KevinBallard, чи є у вас рекомендації щодо виявлення поширених джейлбрейків у 2017 році?
Cœur

@ Cœur Nope, я не вивчав це питання з моменту написання цього коментаря.
Лілі Баллард

25

Виявити зламаний телефон так само просто, як перевірити наявність /private/var/lib/apt/ папки. Хоча це не виявляє користувачів лише для встановлення, на сьогодні більшість встановили Cydia, Icy або RockYourPhone (усі вони використовують apt)

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


10

Просто щоб розширити відповідь zakovyrya, ви можете використати такий код:

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

Втім, особа, яка вчинила джейлбрейк вашого додатка, може шістнадцять встановити вашу програму, і як така, вона може редагувати рядок @ "SignerIdentity", щоб прочитати @ "siNGeridentity" або щось інше, що поверне нуль і, таким чином, пройде.

Отже, якщо ви використовуєте це (або будь-яку іншу пропозицію з http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Не чекайте, що це спрацює вічно
  • Не використовуйте цю інформацію, щоб будь-яким чином зламати / перешкодити вашій програмі (інакше вони матимуть причину гекситувати її, тому ваша програма не знатиме, що вона зламана).
  • Можливо, розумно затушувати цей біт коду. Наприклад, ви можете додати в код кодований зворотний рядок base64, а потім декодувати його в програмі, змінивши процес.
  • Перевірте свою перевірку пізніше у своєму коді (наприклад, коли я сказав SignerIdentity, чи насправді там було сказано SignerIdentity або siNGeridentity?)
  • Не кажіть людям на загальнодоступному веб-сайті, як stackoverflow, як ви це робите
  • Майте на увазі, що це лише керівництво і не є надійним (і не захищеним від злому!) - з великою силою приходить велика відповідальність.

Отже, це перевіряє SignerIdentity у вашому наборі програм, але як щодо випадку, якщо додаток не зламаний або щось інше, крім пристрою JailBroken, як би ви це виявили?
Едвард Ашак,

Задайте це запитання на SO, і хтось відповість :)
Benjie

5

Щоб розширити коментарі Yonel та Benjie вище:

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

У будь-якому разі, я не вживатиму будь-яких необдуманих дій проти користувача на основі цього коду ...

2) Доповнити коментар Бенджі повторно. затуманення (абсолютна необхідність при роботі з будь-якими рядковими значеннями у вашому коді проти піратства): подібним, але, можливо, ще простішим способом є завжди перевіряти солону хеш- версію значення, яке ви шукаєте. Наприклад (навіть незважаючи на те, що ця перевірка вже не ефективна), ви б перевірили ім'я ключа кожної MainBundle як md5 (keyName + "деяка секретна сіль") проти відповідної константи ... Досить базовий, але впевнений, що переможе будь-яку спробу знайти рядок.

Звичайно, для цього потрібно мати можливість опосередковано запитувати значення, яке потрібно порівняти (наприклад, переглядаючи масив, що його містить). Але це найчастіше так.


Чи є метод Лендона Фуллера досі дієвим у наш час з iOS 7?
Василь Бурк,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.