Jak provádět injekce kódu iOS v souborech .ipa

Obrázek z http://dyci.github.io/

Vkládání kódu je proces zavedení externího kódu do existujícího softwarového systému. V tomto příspěvku budu sdílet nástroje a techniky potřebné k provádění injekce kódu iOS v aplikacích iOS. S XCode je možné nastavit experiment tak, aby se ukázala injekce kódu iOS v akci. Cílem je vytvořit nezávislou sadu kódů, zabalit ji do konečné aplikace a nějakým způsobem provést nové kódy.

[Poznámka: Bylo prokázáno, že tento proces vkládání kódu funguje na iOS 9.3, 10.0.2 a na XCode v7.3 a v8.0. Ještě to musím vyzkoušet na jiných verzích OS nebo XCode]

Pomocí Xcode můžeme vytvořit nezávislý binární balíček dvěma způsoby:
- Dynamic Libary via (Cocoa Touch Framework) nebo
- Statická knihovna prostřednictvím (Cocoa Touch Static Library)

Dynamická knihovna vs statická knihovna: Naše možnosti vytvoření externího binárního kódu obsahujícího naše injekční kódy

Statická knihovna

  • Jednotka kódu spojená v době kompilace.
  • Během kompilace .ipa musí být k dispozici statické knihovny, aby mohly být spuštěny jejich kódy
  • Funkce Swift není podporována pro statické knihovny
  • Neexistuje žádný známý způsob, jak nařídit .ipa načtení statické knihovny
  • Nemůžeme přímo použít statickou knihovnu. Možná jej budete muset nejprve převést do dynamické knihovny

Dynamická knihovna

  • Jednotka kódu, která je propojena za běhu. Xcode vyžaduje, aby během kompilace byly k dispozici závislé dynamické knihovny / rámce, ale nezaručuje, že tyto závislosti budou zabaleny do aplikace. Proto se někdy můžete setkat s chybami načítání dynamických knihoven runtime jako
    dyld: Knihovna není načtena: @ rpath / libswift_stdlib_core.dylib
  • Můžeme vytvořit Swift kódy pro dynamické knihovny
  • Příkaz Load Dylib je třeba provést na .ipa, aby načte dynamickou knihovnu do paměti před spuštěním aplikace.
  • ANO, MŮŽEME TOTO POUŽÍVAT :)

S dylibem (Dynamic Library) vybraným jako náš vlastní kódový balíček umožňuje použití XCode k prezentaci konceptu injekce kódu.

Ověření konceptu vstřikování kódu pomocí XCode

Proces vstřikování kódu přes XCode

Zde jsou kroky

  1. Vytvořte nový projekt XCode
  2. Vytvořte nový cíl aplikace pro iOS.
  3. Vytvořte nový cíl „Cocoa Touch Framework“. Řekněme tomu „PatchPGO“
  4. Vytvořte novou třídu kakaových doteků Objective-C. Řekněme tomu „PatchLoader“. Přidejte následující metodu do souboru .m.
@implementace PatchLoader

static void __attribute __ ((konstruktor)) inicializovat (void) {
    NSLog (@ "==== Vstřikování kódu v akci ====");
    / *
      Sem vložte své kódy pro vstřikování kódu
    * /
}

@konec

Použitím „static void __attribute __ ((konstruktor))“ jako modifikátoru pro metodu inicializace můžeme určit, co chceme dělat, když se třída načte do paměti před spuštěním aplikace. Můžete to považovat za „vstupní bod “Pro kódy, které mají být vloženy do aplikace pro iOS.

5. Spusťte cíl aplikace pro iOS a ujistěte se, že konzola protokolu bude na výstupu tak, jak byste očekávali před vložením kódu.

6. Nyní propojte soubor Dynamic Framework s aplikací pro iOS. Zajistěte, aby byl rámec podle potřeby vložen.

Obecná nastavení cílení na iOS: Zajistěte, aby byl rámec propojenFáze sestavení cílové aplikace pro iOS: Zajistěte, aby byl váš rámec přidán do „Embed Frameworks“ a jeho cíl byl „Frameworks“

7. Nyní, když je váš cíl aplikace pro iOS správně propojen, spusťte cíl a sledujte konzolu protokolování. Naše zpráva NSLog byla úspěšně vložena do naší cílové aplikace pro iOS.

Zobrazí se zpráva o zaznamenávání kódu

Všimněte si, že byla pozorována změna chování (nová protokolovací zpráva), ale cílové kódy aplikace nebyly změněny. Za scénami Xcode propojil knihovnu s cílem před podepsáním kódu a instalací modifikované aplikace. Ve výše uvedeném experimentu s vložením kódu prostřednictvím Xcode vlastní vývojář vlastní zdrojový kód aplikace. Nyní se můžeme pokusit vložit kódy do souboru .ipa, kde vývojář nevlastní zdrojové kódy.

Důkaz koncepce injekce kódu se souborem .ipa

Zde jsou kroky

  1. Stáhněte si a soubor .ipa dle vašeho výběru. Můžete najít prasklé soubory .ipa od poskytovatelů obsahu třetích stran (např. Www.iphonecake.com)
  2. Stáhněte si optool (https://github.com/alexzielenski/optool) nebo
    stáhnout / klonovat mé úložiště (https://github.com/depoon/iOSDylibInjectionDemo). Toto úložiště obsahuje optool a skript „patchapp.sh“ načte dyliby (přes optool) do daného souboru .ipa. Podrobnosti jsou v README.
  3. Vytvořte složku ve složce iOSDylibInjectionDemo, která obsahuje binární soubory dynamické knihovny, které vložíme do .ipa. Řekněme tomu „Dylibs“
  4. Přejděte do složky framework (ta, kterou jste vytvořili v XCode ve výše uvedeném experimentu) a prozkoumejte obsah složky frameworku.
Jak najít umístění složky dynamického rámce v XCode: Klikněte pravým tlačítkem -> Zobrazit ve FinderuObsah dynamického rámce. Binární dynamická knihovna je zvýrazněna modře

Vyhledejte soubor, který nese stejný název jako složka framework. Tento soubor je binární dynamická knihovna a my budeme muset tento soubor použít k úpravě našeho souboru ipa. Zkopírujte tento binární soubor do složky, kterou jsme vytvořili v bodě 3. Vaše složka by nyní měla vypadat takto

Složka Dylibs obsahující naše vlastní kódy dynamické knihovny

Pokud vaše dynamická knihovna obsahuje kódy Swift, budete možná muset zkopírovat standardní knihovny Xcode Swift dylib do složky „Dylibs“. Dylibry Swift lze najít místně na adrese /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift

Takto může vypadat vaše složka po přidání standardních souborů Swift dylib.

Standardní Swift dylib byl zkopírován a připraven pro vstřikování kódu

5. Pojmenujme proces úpravy .ipa jako „Oprava“. Přejděte do složky iOSDylibPatchingDemo a spusťte v terminálu sh ./patchapp.sh cracked.ipa ./DYLIBS, kde „cracked.ipa“ je ipa, kterou chcete opravit, a „./DYLIBS“ je složka dylibů, které chcete patch s. Opravný skript vydá opravený soubor .ipa jako „cracked-patch.ipa“ a dokončí proces vložení kódu. V tuto chvíli však nemůžeme nainstalovat nebo naložit toto .ipa do jakéhokoli nezařízeného zařízení, protože přestože má „cracked-patch.ipa“ injikované kódy, podpis kódu .ipa je nyní neplatný poté, co jsme temperovali a upravil jeho obsah.

6. Stáhněte si Cydia Impactor z http://www.cydiaimpactor.com. Cydia impaktor je nástroj, který nám umožňuje nainstalovat jakýkoli soubor .ipa na zařízení bez vězení, rezignováním souboru .ipa a jeho obsahu pomocí platných profilů a pověření spojených se zařízením.

Cydia Impactor Mac App

Instalační proces .ipa můžete zahájit přetažením „cracked-patch.ipa“ do aplikace Cydia Impactor Mac. Poté vás požádá o přihlášení a heslo vývojáře Apple.

Cydia Impactor požadující při instalaci přihlašovací jméno a heslo pro Apple Developer

Cydia Impactor (CI) se pokouší přihlásit do Apple Developer Center a stáhnout si svůj zajišťovací profil a načíst váš vývojový certifikát iOS v místní klíčence. CI se poté pokusí podepsat obsah .ipa nejprve do hloubky, počínaje nejhlubší úrovní složky a poté se dostane na úroveň složky .ipa. Poté CI nainstaluje a načte .ipa do určeného zařízení. Tento proces používající CI funguje, protože zařízení si bude myslet, že .ipa je vyvinut a podepsán uživatelem a umožňuje úspěšné spuštění modifikované aplikace na zařízení. Pokud máte potíže s používáním nástroje Cydia Impactor, můžete ručně stáhnout rezoluci .ipa a pomocí nástroje XCode načíst .ipa.

Proces oprava souboru .ipaProces podepisování a instalace souboru .ipa do zařízení bez vězení

7. Sledujte protokoly konzoly zařízení a vyhledejte zprávu NSLog, kterou jsme dříve vložili do naší dynamické knihovny: "==== Vstřikování kódu v akci ====". Pokud se vám podaří najít zprávu protokolu, můžete začít slavit, protože jste úspěšně provedli Vstřikování kódu iOS do souboru iOS .ipa. Celý tento proces vkládání kódu můžete provést v kterémkoli souboru .ipa.

Hmmmm…. to mi připadá zlé

Toto téma jsem představil v listopadové skupině iOS Dev Scout Meetup (Singapur) a demonstroval jsem, jak jsem pomocí injekce kódu přerušil hru PokemonGo App. Během setkání skupina přinesla publikum hackerské nápady od přidání funkcí keyloggingu až po porušení pravidel jiných herních aplikací. Přicházet s kódy na hack aplikace není snadné, protože to vyžaduje spoustu hádat práce spolu s hodinami pokus-a-chyba, aby to bylo správné.

Hrstka zlých nápadů

  • Keylogging (https://gist.github.com/johndel/6df8aee01055ed21dd9a#file-keylogger-swift-L65)
  • Metoda Swizzling (http://nshipster.com/method-swizzling/)
  • Získejte informace o třídách, ivarech, vlastnostech a metodách za běhu Objective C (https://developer.apple.com/reference/objectivec/1657527-objective_c_runtime)
  • Získejte seznam registrovaných tříd (https://developer.apple.com/reference/objectivec/1418579-objc_getclasslist)

S výše uvedenými nápady může nečestný vývojář prakticky přečíst všechny třídy a jejich ivary a metody používané v aplikaci a tyto informace použít k naplánování zlomyslného hacku. Nejlepší ze všeho je, že není třeba používat jailbroken zařízení.

Pokud se chcete dočíst o používání této techniky vkládání kódu k zaseknutí skutečné aplikace, zde je můj další příspěvek o hackování PokemonGo App (https://medium.com/@kennethpoon/hacking-the-pokemongo-ios-app-with- 3-třídy-4b81589a9f39 # .kz2vey8ir)

Kdo je tedy zlý?

Po absolvování celého procesu injekce kódu iOS popsaného v tomto příspěvku osobně mám pocit, že schopnost dovolit komukoli rezigovat soubory .ipa je vážnou bezpečnostní chybou. Jakmile je ipa podepsána, měla by být neměnná a jakýkoli pokus o zmírnění jeho obsahem by měl vést k tomu, že bude považována za poškozenou a zařízení iOS by neměla umožnit spuštění těchto .ipa.

Doufám, že čtenáři považují tento příspěvek za bystrý. Neváhejte mě komentovat nebo buzzovat na de_poon@hotmail.com.

Video: Diskuse o vstřikování kódu iOS z listopadu 2016