Как да изпълнявате iOS Code Injection върху .ipa файлове

Изображение от http://dyci.github.io/

Инжектирането на кода е процес на въвеждане на външен код в съществуваща софтуерна система. В тази публикация ще споделя инструментите и техниките, необходими за изпълнение на IOS Инжектиране на код в iOS Apps. С XCode е възможно да се настрои експеримент, който да покаже инжектиране на iOS Code в действие. Идеята е да се създаде независим набор от кодове, да се пакетира с крайното приложение и по някакъв начин да се изпълнят новите кодове.

[Забележка: Доказано е, че този процес на инжектиране на код работи на iOS 9.3, 10.0.2 и на XCode v7.3 и v8.0. Все още не съм пробвал това на други версии на OS или XCode]

Ние можем да създадем независим двоичен пакет чрез Xcode по 2 начина:
- Динамична библиотека чрез (Cocoa Touch Framework) или
- Статична библиотека чрез (Статична библиотека на какао Touch)

Динамична библиотека срещу статична библиотека: Нашите възможности да създадем външен двоичен файл, който да съдържа нашите кодове за инжектиране

Статична библиотека

  • Единица код, свързана по време на компилиране.
  • Статичните библиотеки трябва да са на разположение по време на компилирането на .ipa, за да могат да се изпълняват кодовете им
  • Swift не се поддържа за статични библиотеки
  • Не е известен начин да инструктира .ipa да зареди статична библиотека
  • Не можем да използваме статична библиотека директно. Може да се наложи първо да го преобразувате в динамична библиотека

Динамична библиотека

  • Единица код, която е свързана по време на изпълнение. Xcode изисква зависими динамични библиотеки / рамки, за да бъдат достъпни по време на компилация, но не гарантира, че тези зависимости са пакетирани в приложението. Ето защо понякога може да срещнете грешки при зареждане на динамични библиотеки по време на изпълнение, като
    dyld: Библиотеката не е заредена: @ rpath / libswift_stdlib_core.dylib
  • Можем да изградим Swift кодове за динамични библиотеки
  • Заредете командата Dylib, за да се изпълни в .ipa, така че тя да зареди динамичната библиотека в паметта преди стартирането на приложението.
  • ДА МОЖЕМ ДА ИЗПОЛЗВАМЕ ТОВА :)

С dylib (Dynamic Library), избран за наш персонализиран код, нека използваме XCode, за да представим доказателството за концепция за инжектиране на код.

Доказване на концепцията за инжектиране на кода чрез XCode

Процес на инжектиране на кода чрез XCode

Ето стъпките

  1. Създайте нов проект XCode
  2. Създайте нова цел за приложение на iOS.
  3. Създайте нова цел „Cocoa Touch Framework“. Да го наречем „PatchPGO“
  4. Създайте нов клас на какао с докосване Objective-C. Да го наречем „PatchLoader“. Добавете следния метод във .m файла.
@implementation PatchLoader

static void __attribute __ ((конструктор)) инициализиране (void) {
    NSLog (@ "==== Инжектиране на код в действие ====");
    / *
      Поставете тук вашите кодове за инжектиране на кодове
    * /
}

@край

Използвайки "static void __attribute __ ((конструктор))" като модификатор за метода на инициализация, можем да определим какво искаме да направим, когато класът се зареди в паметта преди стартирането на приложението. Можете да разгледате това като "входна точка ”За кодове, които трябва да се инжектират в iOS приложението.

5. Изпълнете целта на приложението за iOS, за да гарантирате, че конзолата на лога се извежда като това, което бихте очаквали преди инжектирането на кода.

6. Сега свържете файла с динамична рамка към приложението си за iOS. Уверете се, че рамката е вградена според изискванията.

Основни настройки на приложението за iOS: Уверете се, че вашата рамка е свързанаiOS App Target Build Faza: Уверете се, че вашата рамка е добавена под „Embed Frameworks“ и нейното предназначение е „Frameworks“

7. Сега, когато целта на приложението ви за iOS е правилно свързана, изпълнете целта и наблюдавайте вашата конзола за регистриране. Нашето съобщение NSLog успешно е инжектирано в нашето целево приложение за iOS.

Появява се съобщение за регистриране на код за инжектиране

Забележете, че е наблюдавана промяна в поведението (ново съобщение за регистриране), но кодовете на целите на приложението не са променени. Зад кулисите Xcode свързва библиотеката с целта преди подписване на код и инсталиране на модифицираното приложение. В горния експеримент за инжектиране на код чрез Xcode, програмистът притежава изходния код на приложението. Сега, нека се опитаме да инжектираме кодове във .ipa файл, където програмистът не притежава изходните кодове.

Доказване на концепцията за инжектиране на кода с .ipa файл

Ето стъпките

  1. Изтеглете и .ipa файл по ваш избор. Можете да намерите напукани .ipa файлове от доставчици на съдържание на трети страни (например www.iphonecake.com)
  2. Изтеглете optool (https://github.com/alexzielenski/optool) или
    изтеглете / клонирайте моето хранилище (https://github.com/depoon/iOSDylibInjectionDemo). Това хранилище съдържа optool и скрипт „patchapp.sh“ ще зареди дилиби (чрез optool) в даден .ipa файл. Подробности са в ПРОЧЕТАТА.
  3. Създайте папка в папката iOSDylibInjectionDemo, която да съдържа динамичните двоични библиотеки, които ще инжектираме в .ipa. Да го наречем „Dylibs“
  4. Отидете в рамката (тази, която сте създали в XCode в горния експеримент) и разгледайте съдържанието на рамката.
Как да намерите местоположението на папките на Dynamic Framework в XCode: Щракнете с десния бутон -> Покажи в FinderСъдържание на динамичната рамка. Динамичната бинарна библиотека е подчертана в синьо

Намерете файл, който носи същото име като папката на рамката. Този файл е динамичен бинарен библиотечен файл и ще трябва да използваме този файл, за да модифицираме нашия ipa файл. Копирайте този двоичен файл в папката, която създадохме в точка 3. Вашата папка сега трябва да изглежда така

Папка Dylibs, която съдържа нашите персонализирани динамични библиотечни кодове

Ако динамичната ви библиотека съдържа кодове на Swift, може да се наложи да копирате стандартните библиотеки на Xli Swift dylib във вашата папка „Dylibs“. Swift dylibs може да се намери локално на адрес /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift

Ето как може да изглежда папката ви след добавяне на стандартните файлове на Swift dylib.

Стандартното копиране на Swift dylib и подготвено за инжектиране на код

5. Позволява да се определи процесът на модификация на .ipa като „Кръпване“. Отидете в папката iOSDylibPatchingDemo и изпълнете следното в терминала sh ./patchapp.sh cracked.ipa ./DYLIBS, където „cracked.ipa“ е ipa, който искате да кръпка, а „./DYLIBS“ е папката на dylibs, която искате да кръпка с. Скриптът за кръпка ще изведе закърпения .ipa файл като „пропукан-patch.ipa“ и завърши процеса на инжектиране на код. На този етап обаче не можем да инсталираме или странично да заредим този .ipa в нито едно устройство, което не е свързано с джейлбрейк, тъй като въпреки че „спукан-patch.ipa“ има инжектирани кодове, подписът на .ipa код вече е невалиден, след като сме темперирали и променя съдържанието му.

6. Изтеглете Cydia Impactor от http://www.cydiaimpactor.com. Cydia impactor е инструмент, който ни позволява да инсталираме всеки .ipa на устройство без разбивка, като подаде оставка на .ipa и неговото съдържание, използвайки валидни профили и идентификационни данни, свързани с устройството.

Cydia Impactor Mac App

Можете да започнете процеса на инсталиране на .ipa чрез плъзгане и пускане на „cracked-patch.ipa“ в приложението Cydia Impactor Mac. След това ще ви подканят да влезете и паролата на вашия програмист за ябълки.

Cydia Impactor изисква вашата Apple Developer вход и парола по време на инсталирането

Cydia Impactor (CI) се опитва да влезе в Apple Developer Center и да изтегли профила си за осигуряване, както и да изтегли сертификата си за разработка на iOS в местния ключодържател. След това CI ще се опита да подпише съдържанието .ipa първо на дълбочина, като се започне от най-дълбокото ниво на папката и след това се проправи до нивото на папката .ipa. След което CI ще инсталира и странично зарежда .ipa в определено устройство. Този процес с използване на CI работи, тъй като устройството ще мисли, че .ipa е разработен и подписан от потребителя и ще позволи на модифицираното приложение да бъде стартирано успешно на устройството. Ако не ви е удобно да използвате Cydia Impactor, можете ръчно да подадете оставка на .ipa самостоятелно и да заредите .ipa с помощта на XCode.

Процес на кръпка на .ipa файлПроцес на подписване и инсталиране на

7. Наблюдавайте дневниците на конзолата на устройството и потърсете съобщението NSLog, което сме поставили в нашата динамична библиотека по-рано: "==== Инжектиране на код в действие ====". Ако успеете да намерите съобщението в дневника, можете да започнете да празнувате, защото успешно сте извършили iOS Code Injection във iOS .ipa файл. Можете да извършите целия този процес на инжектиране на код във всеки .ipa файл.

Хмммм .... това ми звучи зло

Представих тази тема в ноемврийската група iOS Dev Scout Meetup (Сингапур) и демонстрирах как използвах инжектиране на код, за да разбия играта на PokemonGo App. По време на групата за запознанства публиката издигна хакерски идеи от добавяне на функционалност за програмиране на ключове до нарушаване на правилата на други приложения за игри. Създаването на кодове за хакване на приложение не е лесно, тъй като изисква много предположения, заедно с часове проба и грешка, за да се оправи.

Шепа зли идеи

  • Keylogging (https://gist.github.com/johndel/6df8aee01055ed21dd9a#file-keylogger-swift-L65)
  • Метод Swizzling (http://nshipster.com/method-swizzling/)
  • Вземете информация за класове, ivars, свойства, методи чрез Objective C runtime (https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime)
  • Вземете списък с регистрирани класове (https://developer.apple.com/reference/objectivec/1418579-objc_getclasslist)

С горепосочените идеи, измамният разработчик може на практика да чете всички класове и техните ivars и методи, използвани в приложение и да използва тази информация, за да планира злонамерен хак. Най-хубавото е, че няма нужда от използване на джейлбрейк устройства.

Ако се интересувате да прочетете как да използвате тази техника за инжектиране на код, за да хакнете истинско приложение, ето следващата ми публикация за хакерство на PokemonGo App (https://medium.com/@kennethpoon/hacking-the-pokemongo-ios-app-with- 3-класи-4b81589a9f39 # .kz2vey8ir)

И така, кой е злият?

След като преминах през целия процес на инжектиране на iOS Code, описан в тази публикация, аз лично усещам, че възможността да позволявам на всеки да подаде оставка .ipa файловете е сериозен недостатък на сигурността. След като ipa се подпише, той трябва да бъде неизменен и всеки опит за темпериране на съдържанието му трябва да доведе до това той да се счита за повреден, а iOS устройствата да не позволяват стартирането им. Ipa.

Надявам се читателите да намерят тази публика проницателна. Чувствайте се свободни да ме коментирате или да ме озвучите на de_poon@hotmail.com.

Видео: ноември 2016 г. iOS Code Injection talk