[Inhaltsverzeichnis]
Dieser Artikel ist auf mein starkes Interesse am Reverse Engineering zurückzuführen. Ich habe „Reverse Engineering von iOS-Anwendungen“ gelesen und möchte ihn mit Ihnen teilen. Außerdem ist er eine einfache Zusammenfassung meiner eigenen Erkenntnisse. Übrigens ist das iOS Reverse Forum iOSRe eine gute iOS-Reverse-Communication-Community.
Der gesamte Code und die Tools für dieses Beispiel werden auf GitHub gehostet. Bitte überprüfen Sie https://github.com/jackrex/FakeWeChatLoc
Der gesamte Artikel dient ausschließlich der persönlichen Unterhaltung und dem Lernwert. Die zugehörige Technologie dient nur dem Lernen und der Kommunikation. Bitte verwenden Sie sie nicht für illegale Zwecke oder für andere kommerzielle Zwecke. ! !
Das Jailbreaking des iOS-Systems ähnelt, um es ganz klar auszudrücken, dem Android-Root. Es entspricht einer Erhöhung der Berechtigungen des Mobiltelefons und ermöglicht Ihnen die Kontrolle über Dinge, die Sie zuvor nicht kontrollieren konnten.
Da Objective-C eine objektorientierte Hochsprache ist, enthält das von iOS verwendete Dateiformat Mach-O viele Metadateninformationen, sodass wir Class-Dump zum Wiederherstellen seiner Header-Dateien verwenden können. Dies ist ein guter Anfang für iOS Reverse Engineering.
MobileSubstrate ist ein Framework, das die iOS-Entwicklung ermöglicht, um das Hooking zu erleichtern. MobileSubstrate besteht aus den folgenden drei Teilen:
MobileSubstrate
Diese Art von Betriebssystem, das von Unix abgeleitet ist, hat im Allgemeinen die gleiche Verzeichnishierarchie. Vergleichen Sie auch Android und MacOS und Sie werden feststellen, dass viele Verzeichnisnamen gleich sind.
`/bin binnary` ,系统常用的基本二进制文件 例如 cd, ls, ps 等
`/usr` 包含大多用户工具库
`/var variable` 存放经常更改的东西,例如 logs,用户数据,/var/mobile/Applications 是纺织AppStore 下载的 App
`/Applications` 存放所有系统App,以及从Cydia下载的App路径
`/Library` 存放了系统App的数据,其中有一个/Library/MobileSubstrate 目录,MobileSubstrate 是一个hook 功能开发平台,其中内容如下图所示,我们所开发的插件都被放置到这个里面
`/Library/MobileSubstrate` 里面文件类型主要有 dylib,plist
dylib 是动态加载库,就是tweak
plist 配合dylib 使用的filter 文件,指定注入目标,及hook的目标
`/System` 存放iOS 各种系统framework
`/User` 指向 /var/mobile 即是我们一般用户的主目录
Die Deb-Struktur ist eigentlich die Steuerdatei in Library Applications gzip data.tar.gz und wird in control.tar.gz abgelegt
Häufig verwendete Tools für dynamisches Debugging und statische Analyse beim Reverse Engineering:
class-dump ist ein Tool zum Sichern aller Header-Dateien einer App mit Jailbreak.
IDA ist das beste Dekompilierungstool. Tatsächlich kann einfaches Reverse Engineering allein mit IDA durchgeführt werden.
Hopper Disassembler kann gegen eine geringe Lizenzgebühr unter OS X genutzt werden
Das leistungsstarke Tool für dynamisches Debuggen sorgt zusammen mit IDA dafür, dass sich alles bewegt und ruhig bleibt.
Ein Debug-Tool, das das Debuggen und Positionieren der Benutzeroberfläche erleichtert. Wir können schnell erkennen, welche App-Schnittstelle einer bestimmten Klasse entspricht.
Praktische Assistentensoftware für die Dateiverwaltung
Mit OpenSSH kann sich Ihr Computer aus der Ferne bei Ihrem Telefon anmelden
Ein sehr leistungsfähiges Tool, mit dem Entwickler über die Befehlszeile mit Anwendungen interagieren und Anwendungen zur Laufzeit anzeigen und ändern können.
Eine Software, die das Dateisystem auf Mobiltelefonen bequem verwaltet, wie z. B. iFunbox und der Re-Manager von Android, mit der sich problemlos Dateien ändern und Deb-Binärdateien installieren lassen.
APPsync ist der am häufigsten installierte Patch nach dem Jailbreak von iPhone, iPad und iPod touch. Nach der Installation können Sie die Überprüfung der Systemsignatur umgehen und geknackte IPA-Software nach Belieben installieren und ausführen.
Basierend auf dem obigen Verständnis verwenden wir WeChat als unser Analyseobjekt, da wir die Positionierung in WeChat simulieren möchten. Verwenden Sie Class-Dump, um die Header-Datei von WeChat zu exportieren. Obwohl wir die direkte Exportmethode Class-Dump -H xxx -o Output/ auf der offiziellen Website von Class-Dump sehen, ist es nicht möglich, den WeChat direkt in der IPA zu dekomprimieren Dump es. Es wurde festgestellt, dass sich nur die Datei CDStructures.h im Ausgabeordner befand und diese leer war.
Der Grund dafür ist, dass der AppStore nach dem Hochladen in den AppStore automatisch alle IPAS verschlüsselt, sodass wir die WeChat-Binärdatei vor dem Dumpen schälen müssen.
Wir sollten zunächst die komfortablere Clutch ausprobieren
Wenn Clutch fehlschlägt, versuchen wir die folgenden Schritte. Wir benötigen ein Tool wie dumpdecrypted.dylib, um die Shell auf unserem iOS-Telefon zu sichern, wir beenden alle Programme, öffnen WeChat und führen es aus
ps - e //列出当前运行的进程
TODO Sie können sehen, dass der mit /var/mobile/Containers/ beginnende Prozess der WeChat-Prozess ist. Wir wissen, dass der Sandbox-Pfad aller Apps /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E ist - 0E2C6541F879/ , aber wir wissen nicht, welche App 03B61840-2349-4559-B28E-0E2C6541F879 ist. Es wäre sehr schwierig, sie einzeln im Verzeichnis zu finden.
Zu diesem Zeitpunkt ist Cycript praktisch, führen Sie es aus
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
Auf diese Weise erhalten wir das WeChat-Dokumentenverzeichnis. Als nächstes kopieren wir dumpdecrypted.dylib mit scp oder ifunbox in das Dokumentenverzeichnis von WeChat.
Fangen Sie an, die Schale zu zerbrechen
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted wird im aktuellen Verzeichnis generiert. Wir können es vor dem Dump ablegen, um die Dateiinformationen von Match-o anzuzeigen.
otool -H WeChat.decrypted
Verwenden Sie otool -l WeChat.decrypted, um die cryptid zu finden, und verwenden Sie lipo, um die entschlüsselte Struktur aufzuteilen.
implementieren
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Erstellen Sie im aktuellen Verzeichnis einen Ausgabeordner, der alle von WeChat exportierten Header-Dateien enthält, einschließlich SDKs von Drittanbietern usw. Wir legen alle diese Header-Dateien zur einfacheren Anzeige in einem leeren Xcode-Projekt ab.
Basierend auf der Intuition haben wir herausgefunden, dass Appdelegate das MircoMessengerAppDelegate von WeChat ist. Wir können die Projektstruktur usw. von WeChat grob erkennen. Tatsächlich ist Reverse Engineering auch eine Art des Lernens.
Dann denken wir über die Funktion nach, die wir implementieren möchten, um Personen in der Nähe zu ändern. Wir können grob erraten, dass diese Klasse an „Nearby Location“ oder ähnliches gesendet werden soll, und wir können nach der entsprechenden Header-Datei suchen.
Nach der Suche in der Nähe haben wir herausgefunden, dass es so viele davon gibt. Welches ist es?
Tatsächlich können wir neben der Eliminierungsmethode und der Einzelspekulation auch das leistungsstarke Tool Reveal verwenden, das uns bei der Lokalisierung hilft
Man kann sagen, dass Class-Dump uns dabei hilft, die gesamte Header-Datei aufzulisten und uns ein allgemeines Verständnis der Gesamtstruktur des Projekts vermittelt, aber der entsprechende Implementierungsplan in .m ist für uns immer noch eine Blackbox. Zu diesem Zeitpunkt müssen wir die leistungsstarken Tools von IDA für die Analyse nutzen.
Öffnen Sie IDA und wählen Sie „Neu“.
Wir nehmen die WeChat-Binärdatei aus Wechat.app heraus und ziehen sie auf die IDA oben. Da ich eine iTouch 5-CPU verwende und die Architektur armv7 ist, verwende ich bei falscher Verwendung den durch den Haltepunkt erhaltenen Offset wird falsch sein und kann daher nicht normal debuggen
Nach Abschluss der Verarbeitung sieht es wie in der folgenden Abbildung dargestellt aus
Darunter können wir leicht die Implementierung bestimmter Methoden in MicroMessengerAppDelegate sehen. Drücken Sie die Leertaste, um in den Ansichtsmodus zu gelangen.
Hier können wir die Implementierung in .m sehen
Beim dynamischen Debuggen verwenden wir lldb, um Haltepunkte an der Stelle des Codes für das Debuggen festzulegen. Der Hauptzweck besteht darin, die Ausführungsadresse des entsprechenden Codes zu berechnen und zu debuggen, um den gewünschten Wert zu erhalten . Wie oben erwähnt, verwenden wir die Dekompilierungsergebnisse von IDA
iOS öffnet Debugserver und lauscht auf Port 1234 Debugserver *:1234 -a „WeChat“
Führen Sie lldb auf dem Mac aus und bleiben Sie mit dem iOS-Server verbunden. Führen Sie den lldb-Prozess connect connect://iOSIP:1234 aus
Offset ist 0xd000
Holen Sie sich die Haltepunktadresse br s -a 0xd000+0x649D8 // Unterer Haltepunkt
Beginnen Sie mit dem Debuggen von ni po und anderen Debugging-Befehlen
Starten Sie eine App direkt: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak bedeutet im Wortlaut „Feinabstimmung“. Es handelt sich tatsächlich um eine dynamische Linkbibliothek eines Drittanbieters, die auf MobileSubstrate basiert und die Hook-App zur Laufzeit ändern kann.
Theos ist ein Jailbreak-Entwicklungs-Toolkit. Diese Methode wird auch im „iOS Application Reverse Engineering Book“ vorgestellt, aber ich persönlich bevorzuge die Verwendung von iOSOpenDev zum Erstellen von Projekten (ps: Nachdem ich mich mit der Git-Befehlszeile vertraut gemacht habe, dachte ich daran, sourceTree zu verwenden intuitiv), deshalb werde ich es hier kurz erwähnen. Es fühlt sich an, als würde iOSOpenDev die Befehlszeilen-NIC-Vorlage in eine visuelle umwandeln. Tatsächlich ist es fast nicht so schwierig.
Die Installation ist sehr einfach. Laden Sie das Installationsprogramm herunter und installieren Sie es.
Nachdem die Installation abgeschlossen ist, erstellen Sie ein neues Projekt und iOSOpenDev wird in der iOS-Vorlage angezeigt
Hier wählen wir Logos Tweak und die Erstellung wird wie folgt abgeschlossen
Es gibt eine Datei fakeloc.xm, in die wir Code schreiben möchten. Öffnen Sie die Datei fakeloc.xm und wir können sehen, dass der darin enthaltene Code mit Logos, einer neuen Sprache, vervollständigt wird. Die grundlegende Syntax ähnelt der von Objc. Es gibt mehrere spezifische Syntaxen Aufmerksamkeit:
Grundlegende Logos-Syntax: %hook gibt die Klasse an, die mit %end enden muss. %log schreibt Funktionsinformationen in syslog, um Informationen auszugeben, und kann nur innerhalb der %hook-spezifischen Methode ausgeführt werden .
fakeloc.xm entspricht fakeloc.mm
Wir sind oben
Wie Sie in den Build-Einstellungen sehen können, gibt es unten eine Spalte mit dem Namen „Benutzerdefiniert“. Dies ist unser benutzerdefinierter Teil. Geben Sie in den Bereich „iOSOpenDevDevice“ die IP-Adresse unseres iOS-Geräts ein (LAN-Adresse wie 192.168.1.103). Voraussetzung ist, dass auf dem iOS-Gerät OpenSSH installiert ist
SSH-Authentifizierungsfehler iosod sshkey -h 192.168.1.109
Zuerst dachte ich, dass das Erstellen einer App mit Jailbreak in der Logos-Syntax geschrieben werden muss, was mich zu Tode erschreckte. Tatsächlich ist die Entwicklung einer iOS-App mit Jailbreak fast genau die gleiche wie die einer normalen App.
Zunächst erstellen wir noch ein Projekt. Genau wie beim Erstellen eines normalen Projekts können Sie auch CocoaPods verwenden, um Ihre Bibliotheken von Drittanbietern zu verwalten.
Erstellen Sie zunächst wie gewohnt ein neues Projekt, konfigurieren Sie es wie folgt und ändern Sie dann die Build-Einstellungen.
Fügen Sie „Run Script“ hinzu und entfernen Sie die Kontrolle über die Kopierpaketressourcen
Gesamtstruktur des Projekts
Build für Profiling-Executor
Wie rufen wir Tweak in unserer App auf, nachdem wir App und Tweak generiert haben? Die Antwort ist die Verwendung von dlopen
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY); //TWEAK_PATH 是dylib 的地址
if (handle) {
NSLog(@"handle");
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
Rufen Sie dann dynamisch die entsprechende benutzerdefinierte Klasse ab
Klasse TweakBridge = NSClassFromString(@"TweakBridge");
Ich war zunächst verwirrt über dieses Problem und habe schließlich die stabilste und einfachste Methode gewählt, um es zu lösen: Daten in dieselbe Datei zu lesen und zu schreiben. Diese Datei kann als Medium zum Übertragen von Daten verwendet werden. Aber am Anfang habe ich die Datei in /var/mobile/xxx.plist abgelegt, aber Tweak konnte den Wert nicht lesen. Der Grund dafür ist, dass Tweak und unsere App unterschiedliche Berechtigungen haben, also müssen wir einen Ort finden, an dem er sein kann Dieser Ort ist öffentlich geschrieben. **/var/mobile/Library/Preferences/ ** Daher verwendet unsere App- und Tweak-Informationsinteraktion eine Schreibmethode und die andere Lesemethode, um den Zweck der Übertragung zu erreichen Direkte Methode, Sie können sie gemeinsam besprechen
Der endgültige Code lautet also:
- (void)setLocWithLat:(double)lat andLng:(double)lng {
NSLog(@"set lat & lng is %f &&&& %f", lat, lng);
Class TweakBridge = NSClassFromString(@"TweakBridge");
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY);
if (handle) {
NSLog(@"handle");
TweakBridge = NSClassFromString(@"TweakBridge");
NSDictionary *dict = @{@"lat":[NSNumber numberWithDouble:lat], @"long":[NSNumber numberWithDouble:lng]};
BOOL isSuccess = [dict writeToFile:LOCATION_PATH atomically:YES];
NSLog(@"isSuccess, %d", isSuccess);
CLLocation *location = [[TweakBridge shareInstance] getCoreLocation];
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
}
Wie kombinieren wir also unser Tweak mit unserer App, damit Benutzer es direkt nach der Installation verwenden können? Angesichts des oben erwähnten Deb-Formats sind die Verpackungsmethode und -struktur tatsächlich die gleichen wie bei zip und können vom iOS-System installiert werden. Das Paketformat und die Struktur haben wir oben bereits erläutert. Nun erfahren Sie, wie Sie das Deb-Paket generieren
Wir nehmen die generierten Verzeichnisse von Dylib bzw. App heraus.
Legen Sie sie alle in einem separaten Paketverzeichnis ab. Die endgültige Verzeichnisstruktur ist wie folgt:
Wir ordnen alle Dateien gemäß der von Deb geordneten Verzeichnisstruktur gemäß der unten gezeigten Hierarchie an und verwenden dann die dpkg-deb-Methode zum Packen. Beachten Sie, dass es beim Packen am besten ist, keine .DS_Store-Dateien in der Deb zu haben Führen Sie das folgende Skript aus, um es gleichzeitig zu entfernen
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
Das generierte Installationspaket lautet wie folgt, und dann senden wir es per SCP auf das Gerät
Wir verwenden iFunbox, um die generierte fakeLoc.deb in das Stammverzeichnis zu ziehen, öffnen dann iFile auf dem Telefon und klicken auf fakeLoc.deb, um das Programm zu installieren. Nach der Installation installieren wir AppSync neu und starten das Telefon neu. Anschließend können wir unsere App öffnen. Außerdem wurde festgestellt, dass unsere App nicht durch langes Drücken deinstalliert werden kann, genau wie Systemanwendungen, Cydia usw. Dies sollte daran liegen, dass wir sie unter /Applications installiert haben. Zum Deinstallieren können wir sie über die Befehlszeile löschen Benutze Cydia.
Nachdem die Installation abgeschlossen ist, starten Sie das Gerät einfach neu.
Öffnen Sie die App, geben Sie die Präzision und den Breitengrad ein und führen Sie sie dann aus. Öffnen Sie schließlich WeChat People Nearby, um zu sehen, ob sich die Personen in der Nähe geändert haben. Wenn wir es besser machen, wählen Sie den Präzisionsbreitengrad auf der Karte aus und lassen Sie unsere Kernfunktionen zu Die Erklärung endet hier. Unsere einfachen Testergebnisse lauten wie folgt:
Zum Testen können wir in der Adressauswahl der Karte verschiedene Standorte auswählen
Man sieht, dass die meisten Leute aus Peking kommen
Erfolgreich simulierte Personen in der Nähe auf WeChat
Dies ist nicht mit dem Veröffentlichen im AppStore zu vergleichen. Zuerst benötigen Sie eine Hosting-Quelle. Wenn Sie es nicht selbst erstellen möchten, können Sie thebigboss.org/hosting-repository-cydia/submit-your-app verwenden
Geben Sie die relevanten Informationen ein, diese werden nicht noch einmal beschrieben.
Dieser Artikel ist eine Einführung in das Thema. Ich hoffe, Sie haben ein erstes Verständnis für den iOS-Jailbreak, können Ihre eigenen Apps vervollständigen und weitere lustige Optimierungen entwickeln, zum Beispiel das Plug-in zum Erfassen roter Umschläge auf WeChat Die Implementierung dieses Beispielprojekts scheint nicht schwierig zu sein. Fakeloc ist Dylib, d. h. Tweak TestFakeTweak ist das App-Projekt HackAppTool. Unser obiger Artikel beschreibt die Tools von Drittanbietern, die verwendet werden müssen
Projektadresse: https://github.com/jackrex/FakeWeChatLoc
重新安装下AppSync 并重启SpringBoard
由于iOS7之后引入一些新的类库等,在iOS6设备上的兼容性一般,所以在工程的framework 中把 require 改为 option
root密码文件存放地方: / etc / master . passwd
用iFile的文本编辑功能打开master . passwd ,更改之前记得权限
你会找到类似这样的一行字符—— root : UlD3amElwHEpc : 0 : 0 :: 0 : 0 : System
UlD3amElwHEpc就是加密过的密码
把它更替为ab3z4hnHA5WdU ,这是对应的密码就是abc123 。
保存,重启。
有了密码abc123你就可以进一步修改成其它的密码了