Verschleierung des iPhone / iPad-App-Codes - Ist dies möglich? Es ist es wert? [geschlossen]

70

Ich habe viel recherchiert, sowohl über SO als auch über das googeln überall, aber ich kann anscheinend keine eindeutige Antwort in Bezug auf die Codeverschleierung für iPhone / iPad-Apps finden, die in Objective-C geschrieben wurden .

Meine Fragen sind folgende:

  1. Gibt es eine Möglichkeit, dies zu tun? Wenn das so ist, wie?
  2. Ist es das wert?
  3. Erlaubt Apple dies oder hat es ein Problem damit, wenn die App an sie gesendet wird?
bpatrick100
quelle

Antworten:

62

Es scheint keinen Code-Verschleierer für Objective-C zu geben. Aber nehmen wir für einen Moment an, dass es einen gibt.

Apple wird eine verschleierte App wahrscheinlich nicht ablehnen, solange sie nicht abstürzt. Die Hauptfrage ist: Was ist der Punkt der Verschleierung? Normalerweise möchten Sie Code verschleiern, um Ihr Wissen zu schützen. Wenn Ihr Programm beispielsweise einen Kopierschutz verwendet, den Sie einem potenziellen Cracker erschweren möchten, oder wenn Sie einen erweiterten Algorithmus verwenden, möchten Sie nicht, dass die Geschäftskonkurrenten dies tun in der Lage, es zu dekompilieren.

Der Kopierschutz ist unter iOS bereits erledigt. Obwohl durch Jailbreaking eine normale App kopiert und ausgeführt werden kann, würde ich sagen, dass die tatsächliche Anzahl der Benutzer, die dies tun, ziemlich gering ist (zumindest viel geringer als auf "normalen" Computern wie PC und Mac). Erwarten Sie, dass Piraterie ein so großes Problem darstellt, dass Sie es verschleiern müssen?

Wenn Sie wichtige Kenntnisse zum Schutz haben, kann sich eine Verschleierung lohnen. Die Verschleierung hat ihre Nachteile: Sie können Ihre verschleierte App nicht mehr debuggen. Absturzberichte sind nutzlos.

Vielleicht möchten Sie auch den Artikel Verschleierung von Kakao lesen .

Zurück zu der Tatsache, dass es keinen Verschleierer zu geben scheint: Was Sie tun können , ist dieser Trick: Angenommen, Sie haben einen Header wie diesen:

@interface MyClass : NSObject {
}

- (void)myMethod;

Sie könnten eine billige Verschleierung wie diese machen:

#ifndef DEBUG
#define MyClass aqwe
#define myMethod oikl
#endif

@interface MyClass : NSObject {
}

- (void)myMethod;

Auf diese Weise können Sie weiterhin aussagekräftige Symbole in Ihrer Quelle verwenden, aber der Compiler würde sie in "Müll" verwandeln, wenn er nicht zum Debuggen kompiliert wird.

DarkDust
quelle
@DarkDust würde diese Methode das Dekompilieren zurück zu den ursprünglichen Methodennamen verhindern?
Ewok
17
Dieser Ansatz hat einige wesentliche Nachteile. Es ist schwierig, KVC damit zu warten oder sich mit dem dynamischen Methodenversand zu befassen (was viele Möglichkeiten für Abstürze nur mit Release eröffnet). Es funktioniert nicht gut für Methoden, die mehrere Parameter annehmen. Und wenn myMethodes in mehreren Klassen vorhanden ist, kann dies zu wirklich interessanten Kompilierungsfehlern führen. Es ist eine clevere Idee, und ich liebe die Einfachheit, aber ich kann mir nicht vorstellen, dass es die Kosten in einem praktischen System wert ist.
Rob Napier
@ewok: Ja, die ursprünglichen Namen würden nur in Ihrer Quelle existieren. In der kompilierten Binärdatei hätten Sie die "verstümmelten" Namen.
DarkDust
@ Rob Napier: Obwohl dies ein Hack und keine sehr gute Lösung ist, kann ich nicht sehen, wie dies zu Kompilierungsfehlern oder Abstürzen führen kann.
DarkDust
5
setValueForKey: stürzt ab, es sei denn, Sie haben zufällig einen Ivar mit demselben Namen, den Sie nicht verschleiert haben (in diesem Fall kann es überraschende Nebenwirkungen haben, wenn Sie nicht triviale Accessoren haben). Das bedeutet, dass NIB-Dateien dazu neigen, Abstürze zu verursachen. Alles, was einen Selektor aus einer Zeichenfolge erstellt (NSSelectorFromString ()), stürzt aus demselben Grund ab. Wenn Sie in A und B dieselbe Methode haben, diese jedoch in jeder .m unterschiedlich verschleiern, tritt beim Kompilieren von [B-Methode] A ein Kompilierungsfehler auf. Sie brauchen also eine Möglichkeit, alle im Auge zu behalten. Ich bin nicht sicher, wie @selector () darauf reagiert. könnte funktionieren.
Rob Napier
34
  1. Ja, Sie können sich EnsureIT für Apple iOS oder Contaxiom Code Protection ansehen
  2. Es hängt davon ab, ob. Sicherheit führt normalerweise zu Komplexität. Sie müssen die Benutzerfreundlichkeit in Einklang bringen.
  3. Apple sollte kein Problem damit haben (korrigieren Sie mich, wenn ich falsch liege), und ich persönlich habe nur wenige Apps, die Code Obfuscator verwenden.
Andy
quelle
@Andy Mit welchem ​​Tool haben Sie Ihren Code verschleiert? Unterstützen die von Ihnen vorgeschlagenen Tools die neuesten Swift-Versionen?
Ashok
@Ashok Ich habe meine Codes schon lange nicht mehr verschleiert.
Andy
14

Zusätzlich zu den früheren Antworten gibt es jetzt mehrere Tools von Drittanbietern, die ein gewisses Maß an Verschleierung und Integritätsschutz bieten, darunter:

  1. Arxan,
  2. Metaforic,
  3. Kryptanium

Sie unterscheiden sich in ihren Fähigkeiten und umfassen:

  1. Verschleierung des Kontrollflusses, z. B. ARM-Befehlsflüsse werden mit redundanten Befehlen entstellt, um zu versuchen, den ursprünglichen Zweck des Codes zu verbergen.
  2. Umbenennen von Klassen und Methoden - Benennt Ihre Methoden und Klassen in bedeutungslose Namen um, obwohl Sie vorsichtig sein müssen, wo dies verwendet wird, da Sie Ihre App leicht beschädigen können, da die Objective-C-Laufzeit bestimmte Namen erwartet.
  3. Zeichenfolgenverschlüsselung - Alle statischen Zeichenfolgen in der App werden verschlüsselt und Code wird eingefügt, um die Zeichenfolgen unmittelbar vor der Verwendung zu entschlüsseln und die statische Analyse zu erschweren
  4. Anti-Debug - Code wird eingefügt, um die üblichen Debugger zu brechen (nicht immer erfolgreich).
  5. Manipulationsschutz - baut normalerweise ein Netzwerk von Prüfsummen auf, die den Binärcode vor Änderungen schützen.
  6. Objective-C-Laufzeitschutz - Überprüft normalerweise die von obj-c registrierten Methodenimplementierungen, um sicherzustellen, dass sie sich in der App befinden und nicht "swizzled" wurden.

Alle diese Tools sind sehr teuer und nicht ohne Probleme. Sie benötigen also wirklich eine Anwendung, die ein hohes Maß an Integrität erfordert, um sie zu berücksichtigen, z. B. Bankgeschäfte oder Bereiche, in denen DRM sehr wichtig ist.

Für diese Art von App benötigen Sie auch qualifizierte Penetrationstester, um sicherzustellen, dass Ihre App nicht auf andere Weise verfügbar gemacht wird, da diese Tools oft nur so gut sind wie die Benutzer, und es gibt noch andere Betriebssystem-Schwachstellen, die gemindert werden müssen nicht ansprechen.

Andrew
quelle
Ich brauche deine Hilfe. Wissen Sie, gibt es SDK / Bibliotheken, die in den App-Code integriert werden sollen, oder wurde etwas anderes ausgeführt? B'c ging durch die Website, reflektierte nichts dergleichen. Konnten Sie es erfolgreich in Ihren Code implementieren?
Ajay Sharma
Diese Tools sind in den Erstellungsprozess eingebunden und arbeiten für die App größtenteils transparent. Normalerweise müssen Sie eine Konfigurationsdatei erstellen, die dem Tool mitteilt, welche Arten von Schutz Sie wünschen und wo es eingefügt werden muss. Diese Dateien können kompliziert werden. Normalerweise gibt es jedoch kein Laufzeit-SDK.
Andrew
3

Die ausführbare Datei einer App ist bereits von Apple verschlüsselt, und das ausführbare Codesegment der App-Sandbox ist nicht beschreibbar. Sie können daher keine zusätzliche Verschlüsselung durchführen, die eine Änderung des Laufzeit-Armcodes erfordert. Und der Optimierungsdurchlauf des Objective C / C-Compilers erzeugt bereits etwas ganz anderes als der ursprüngliche Quellcode. Wenn Sie mehr C und weniger verwenden, zeigt Objective C weniger Ihrer Funktionsnamen an, da Methodennamen in sichtbaren Klartext eingebettet sind, C-Funktionsnamen jedoch nicht. Daher sollte jeder Geschäftsgeheimnis-Typcode wahrscheinlich in einfachem C codiert und mit dem Optimierer kompiliert werden, der vollständig aufgedreht ist. Sie können jedes im App-Bundle eingebettete WebKit-Javascript oder jeden anderen eingebetteten VM-Code verschleiern (solange der interpretierte Code nicht heruntergeladen wird).

hotpaw2
quelle
1
Ist es wirklich verschlüsselt? AFAIK ist nur signiert.
DarkDust
2
@DarkDust - Sehen Sie sich die ausführbare ARM-Binärdatei an, bevor Sie eine App an Apple senden, und was sich in der ipa / zip-Datei befindet, nachdem Sie sie aus dem App Store heruntergeladen haben.
hotpaw2
4
Es ist einfach zu entschlüsseln und dann erhalten Sie alle einfachen Selektornamen - dies ist also nicht die Lösung.
jimpic
2
Können wir Links mit Details zu "ausführbare Datei wird bereits von Apple verschlüsselt" und "es ist einfach zu entschlüsseln und dann erhalten Sie alle einfachen Selektornamen" erhalten? Vielen Dank!
Olie
Ja, es ist bereits verschleiert, wenn Sie es an den Speicher senden. Wenn Sie IPA aus dem Speicher herunterladen, erhalten Sie eine verschleierte IPA mit Speicheradressen. Xcode generiert beim Kompilieren Maschinencode (Zwischencode, wenn Bitcode aktiviert ist) und eine passende Symboldatei (dSYM). Wenn wir eine App im Store einreichen, laden wir beide Dateien hoch. Wenn jemand eine App aus dem Store herunterlädt, erhält er nur die .app-Maschinencodedatei, die verschleierte Symbole enthält.
Irfan Gul
-9

Wahrscheinlich nicht, weil Objective-C nach Prozessoranweisungen kompiliert wird, anstatt interpretiert oder nach Bytecode kompiliert zu werden. Das Dekompilieren des Codes führt also bereits zu ziemlich undurchsichtigen Ergebnissen. Verschleierung ist etwas, das Sie normalerweise nur benötigen, wenn Sie die Quelle Ihres Codes wie in interpretierten Sprachen wie JavaScript verteilen müssen, damit er auch dann ausgeführt werden kann, wenn der Code geheim bleiben soll.

G Gordon Worley III
quelle
9
Aufgrund der Dynamik von Objective-C sind die Binärdateien voller Klassen- und Methodennamen. Nur diese Zeichenfolgen ermöglichen bereits einen Einblick in die Funktionsweise des Programms.
DarkDust