[TOC]
Cet article est motivé par mon fort intérêt pour l'ingénierie inverse. J'ai lu "Ingénierie inverse des applications iOS" et j'ai implémenté une fonction intéressante. Je souhaite la partager avec vous et c'est aussi un simple résumé de mon propre apprentissage. BTW iOS Reverse Forum iOSRe est une bonne communauté de communication inversée iOS.
Tous les codes et outils de cet exemple sont hébergés sur GitHub. Veuillez consulter https://github.com/jackrex/FakeWeChatLoc.
Tout cet article est uniquement destiné au divertissement personnel et à la valeur d'apprentissage. La technologie associée est uniquement destinée à l'apprentissage et à la communication. Veuillez ne pas l'utiliser à des fins illégales ou à d'autres fins commerciales ! ! !
Le jailbreak du système iOS, pour parler franchement, est similaire à Android Root. Cela équivaut à augmenter les autorisations du téléphone mobile, vous permettant de contrôler des choses que vous ne pouviez pas contrôler auparavant.
Étant donné qu'Objective-C est un langage de haut niveau orienté objet, le format de fichier Mach-O utilisé par iOS contient de nombreuses informations de métadonnées, nous permettant d'utiliser le dump de classe pour restaurer ses fichiers d'en-tête. C'est un bon début pour iOS. ingénierie inverse.
MobileSubstrate est un framework qui permet au développement iOS de faciliter le hooking. MobileSubstrate se compose des trois parties suivantes :
MobileSubstrat
Ce type de système d'exploitation dérivé d'Unix a généralement la même hiérarchie de répertoires. Autant comparer Android et MacOS et vous constaterez que de nombreux noms de répertoires sont identiques. Choisissons-en quelques-uns et expliquons-les brièvement :
`/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 即是我们一般用户的主目录
La structure Deb est en fait un gzip du fichier de contrôle des applications de bibliothèque dans data.tar.gz et le place dans control.tar.gz.
Outils couramment utilisés pour le débogage dynamique et l’analyse statique en rétro-ingénierie :
class-dump est un outil utilisé pour vider tous les fichiers d'en-tête d'une application jailbreakée.
IDA est le meilleur outil de décompilation. En fait, une simple ingénierie inverse peut être réalisée en utilisant uniquement IDA.
Hopper Disassembler peut être utilisé sous OS X avec des frais de licence faibles
Le puissant outil de débogage dynamique fonctionne avec IDA pour que tout bouge et reste immobile.
Un outil de débogage qui facilite le débogage et le positionnement de l'interface utilisateur. Nous pouvons identifier rapidement quelle interface d'application correspond à une certaine classe.
Logiciel pratique d'assistant de gestion de fichiers
OpenSSH permet à votre ordinateur de se connecter à votre téléphone à distance
Un outil très puissant qui permet aux développeurs d'interagir avec les applications à partir de la ligne de commande et d'afficher et de modifier les applications au moment de l'exécution.
Un logiciel qui gère facilement le système de fichiers sur les téléphones mobiles, tel que iFunbox et le gestionnaire Re d'Android, qui peut facilement modifier les fichiers et installer les binaires Deb.
APPsync est le correctif le plus couramment installé après le jailbreak de l'iPhone, de l'iPad et de l'iPod touch. Après l'installation, vous pouvez contourner la vérification de la signature du système et installer et exécuter un logiciel ipa cracké à volonté.
Sur la base de la compréhension ci-dessus, puisque nous voulons simuler le positionnement dans WeChat, nous utilisons WeChat comme objet d'analyse. Utilisez class-dump pour exporter le fichier d'en-tête de WeChat. Bien que nous voyions la méthode d'exportation directe class-dump -H xxx -o output/ sur le site officiel de class-dump, il n'est pas possible de décompresser directement le wechat dans l'ipa et Nous le ferons. Il a été constaté qu'il n'y avait que le fichier CDStructures.h dans le dossier de sortie et qu'il était vide.
La raison en est qu'après le téléchargement sur l'AppStore, l'AppStore crypte automatiquement tous les ipas, nous devons donc décortiquer le binaire WeChat avant de le vider.
Nous devrions d’abord essayer le Clutch, plus pratique.
Lorsque Clutch échoue, essayez les étapes suivantes. Nous avons besoin d'un outil comme dumpdecrypted.dylib pour vider le shell sur notre application. Nous nous connectons d'abord à notre téléphone iOS, nous terminons tous les programmes, ouvrons WeChat et exécutons.
ps - e //列出当前运行的进程
TODO Vous pouvez voir que le processus répertorié commençant par /var/mobile/Containers/ est le processus WeChat. Nous savons que le chemin du bac à sable de toutes les applications est /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. -0E2C6541F879/ , mais nous ne savons pas de quelle application il s’agit 03B61840-2349-4559-B28E-0E2C6541F879 . Il serait très difficile si nous allions dans l’annuaire de les trouver un par un.
À ce moment-là, le cryptage est utile, exécutez
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
De cette façon, nous obtenons le répertoire Documents WeChat. Ensuite, utilisez scp ou ifunbox pour copier dumpdecrypted.dylib dans le répertoire Documents de WeChat.
Commencez à briser la coquille
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted sera généré dans le répertoire actuel. C'est WeChat qui a été bombardé. Avant le dumping, nous pouvons utiliser l'outil otool pour afficher les informations du fichier Match-o.
otool -H WeChat.décrypté
Utilisez otool -l WeChat.decrypted pour trouver le cryptid et utilisez lipo pour diviser la structure déchiffrée.
mettre en œuvre
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Générez un dossier de sortie dans le répertoire actuel, qui contient tous les fichiers d'en-tête exportés par WeChat, y compris les SDK tiers, etc. Nous plaçons tous ces fichiers d'en-tête dans un projet Xcode vide pour une visualisation facile.
Sur la base de notre intuition, nous avons découvert qu'Appdelegate est le MircoMessengerAppDelegate de WeChat. Nous pouvons voir grossièrement la structure du projet WeChat, etc. En fait, l'ingénierie inverse est aussi un moyen d'apprentissage.
Pensons ensuite à la fonction que nous voulons implémenter. Nous voulons changer notre emplacement pour changer les personnes à proximité. Nous pouvons approximativement deviner que cette classe doit être soumise à l'emplacement à proximité ou similaire, et nous pouvons rechercher le fichier d'en-tête correspondant.
Nous avons constaté qu'il y en avait tellement après avoir recherché à proximité, lequel s'agit-il ?
En fait, en plus de la méthode d'élimination et de la spéculation un par un, nous pouvons utiliser le puissant outil Reveal pour nous aider à localiser
On peut dire que le dump de classe nous aide à répertorier l'intégralité du fichier d'en-tête, nous donnant une compréhension générale de la structure globale du projet, mais le plan de mise en œuvre correspondant dans .m reste une boîte noire pour nous. À l’heure actuelle, nous devons utiliser les puissants outils d’analyse de l’IDA.
Ouvrez IDA et sélectionnez nouveau
Nous retirons le binaire WeChat de Wechat.app et le faisons glisser vers l'IDA ci-dessus Comme j'utilise le processeur itouch 5 et que l'architecture est armv7, j'utilise le premier s'il est mal utilisé, le décalage obtenu par le point d'arrêt. sera faux, donc incapable de déboger normalement.
Une fois le traitement terminé, ce sera comme indiqué dans la figure ci-dessous
Parmi eux, nous pouvons facilement voir l'implémentation de méthodes spécifiques dans MicroMessengerAppDelegate. Appuyez sur la barre d'espace pour passer en mode affichage.
Ici, nous pouvons voir l'implémentation dans .m
Le débogage dynamique, c'est lorsque nous n'avons pas le code source, nous utilisons lldb pour définir des points d'arrêt à l'emplacement du code pour le débogage. L'objectif principal est de calculer l'adresse d'exécution du code correspondant et comment déboguer pour obtenir la valeur souhaitée. . Comme mentionné ci-dessus, nous utilisons les résultats de décompilation de IDA
iOS ouvre le serveur de débogage et écoute le port 1234 du serveur de débogage *:1234 -a "WeChat"
Exécutez lldb sur Mac et restez connecté au serveur iOS. Exécutez le processus lldb connect connect://iOSIP:1234.
le décalage est 0xd000
Obtenez l'adresse du point d'arrêt br s -a 0xd000+0x649D8 // Point d'arrêt inférieur
Démarrer le débogage de ni po et d'autres commandes de débogage
Démarrez une application directement : debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak signifie « réglage fin » dans le mot. Il s'agit en fait de la bibliothèque de liens dynamiques tierce dylib, qui est écrite sur la base de MobileSubstrate et peut modifier l'application du hook au moment de l'exécution.
Theos est une boîte à outils de développement de jailbreak. Cette méthode est également présentée dans le "iOS Application Reverse Engineering Book", mais je préfère personnellement utiliser iOSOpenDev pour créer des projets (ps : après m'être familiarisé avec la ligne de commande git, j'ai pensé à utiliser sourceTree Plus. intuitif), je vais donc le mentionner brièvement ici. Il semble qu'iOSOpenDev transforme le modèle de carte réseau de ligne de commande en un modèle visuel. En fait, ce n'est presque pas si difficile.
L'installation est très simple. Téléchargez le programme d'installation et installez-le.
Une fois l'installation terminée, créez un nouveau projet et iOSOpenDev apparaîtra dans le modèle iOS
Ici nous choisissons Logos Tweak et la création se termine comme suit
Il existe un fichier fakeloc.xm, dans lequel nous voulons écrire du code. Ouvrez le fichier fakeloc.xm et nous pouvons voir que le code à l'intérieur est complété à l'aide de logos. Pour les logos, un nouveau langage, vous n'avez pas à vous inquiéter. Sa syntaxe de base est similaire à Objc. Il existe plusieurs syntaxes spécifiques qui nécessitent des particularités. attention:
Syntaxe de base de Logos : %hook spécifie la classe qui doit être hookée. Elle doit se terminer par %end. %log écrit les informations de fonction dans syslog pour imprimer les informations. %orig exécute la fonction hookée et ne peut être exécutée que dans la méthode spécifique à %hook. .
fakeloc.xm correspond à fakeloc.mm
Nous sommes au-dessus
Comme vous pouvez le voir sur les paramètres de construction, il y a une colonne en bas appelée User-Define. Voici notre partie personnalisée À l'emplacement iOSOpenDevDevice , écrivez l'adresse IP de notre appareil iOS (adresse LAN telle que 192.168.1.103). Le principe est que l'appareil iOS est installé OpenSSH
erreur d'authentification ssh iosod sshkey -h 192.168.1.109
Au début, je pensais que la création d'une application jailbreakée devait être écrite dans la syntaxe Logos, ce qui m'a fait très peur. En fait, le développement d'une application jailbreakée iOS est presque exactement le même qu'une application normale.
Tout d'abord, nous créons toujours un projet. Tout comme la création d'un projet normal, vous pouvez également utiliser CocoaPods pour gérer vos bibliothèques tierces.
Créez d'abord un nouveau projet comme d'habitude, configurez-le comme suit, puis modifiez les paramètres de construction.
Ajoutez Run Script et supprimez le contrôle des ressources du bundle de copie
Structure globale du projet
Exécuteur de build pour le profilage
Après avoir généré App et Tweak, comment appelons-nous Tweak dans notre application ? La réponse est d'utiliser 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());
}
Obtenez ensuite dynamiquement la classe personnalisée correspondante
Classe TweakBridge = NSClassFromString (@"TweakBridge");
Au début, j'ai été intrigué par ce problème et j'ai finalement adopté la méthode la plus stable et la plus simple pour y parvenir, qui consiste à lire et écrire des données dans le même fichier. Ce fichier peut être utilisé comme support de transmission de données. Mais au début, j'ai mis le fichier dans /var/mobile/xxx.plist, mais tweak n'a pas pu lire la valeur. La raison est que tweak et notre application ont des autorisations différentes, nous devons donc trouver un endroit où il peut être. écrit publiquement. Cet endroit est **/var/mobile/Library/Preferences/ ** Par conséquent, notre interaction d'informations App et Tweak utilise une méthode d'écriture et l'autre méthode de lecture pour atteindre l'objectif de transmission Si vous avez une meilleure et plus. méthode directe, vous pouvez la proposer. Discutons-en ensemble.
Le code final est donc :
- (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());
}
}
Alors, comment pouvons-nous combiner notre Tweak avec notre application afin que les utilisateurs puissent l'utiliser directement après l'installation ? Compte tenu du format deb que nous avons mentionné ci-dessus, la méthode, la structure et le zip d'empaquetage sont en fait les mêmes et peuvent être installés par le système iOS ? Nous avons déjà expliqué le format et la structure du package ci-dessus, maintenant comment générer le package Deb
Nous retirons respectivement les répertoires générés de dylib et app.
Placez-les tous dans un répertoire Package distinct. La structure de répertoires finale est la suivante.
Nous organisons tous les fichiers selon la structure de répertoires organisée par Deb selon la hiérarchie indiquée ci-dessous, puis utilisons la méthode dpkg-deb pour empaqueter. Notez qu'il est préférable de ne pas avoir de fichiers .DS_Store dans le deb lors de l'empaquetage. script suivant pour le supprimer en même temps.
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
Le package d'installation généré est le suivant, puis nous le transmettons au périphérique
Nous utilisons iFunbox pour faire glisser le fakeLoc .deb généré vers le répertoire racine, puis ouvrons iFile sur le téléphone et cliquons sur fakeLoc.deb pour installer le programme. Après l'installation, nous réinstallons AppSync et redémarrons le téléphone, puis nous pouvons ouvrir notre application. , et a également constaté que notre application ne peut pas être désinstallée en appuyant longuement dessus, tout comme les applications système, Cydia, etc. Cela devrait être dû au fait que nous l'avons installée sous /Applications. Pour la désinstaller, nous pouvons utiliser la ligne de commande pour la supprimer, ou. utilisez Cydia.
Une fois l'installation terminée, redémarrez simplement l'appareil.
Ouvrez l'application, entrons la précision et la latitude, puis exécutez-la. Enfin, ouvrez WeChat People Near pour voir si les personnes à proximité ont changé. Si nous le faisons mieux, la latitude de précision est sélectionnée sur la carte lorsque notre noyau. La fonction est L'explication se termine ici. Nos résultats de tests simples sont les suivants :
Nous pouvons sélectionner différents emplacements dans le sélecteur d'adresse de la carte pour les tests
Vous pouvez voir que la plupart des gens viennent de Pékin.
Simulation réussie de personnes à proximité sur WeChat
Ce n'est pas comme publier sur l'AppStore. Vous avez d'abord besoin d'une source d'hébergement. Si vous ne souhaitez pas la créer vous-même, vous pouvez utiliser thebigboss.org/hosting-repository-cydia/submit-your-app.
Remplissez les informations pertinentes, celles-ci ne seront pas décrites à nouveau.
Cet article est une introduction au sujet. J'espère que vous aurez une compréhension préliminaire du jailbreak iOS, que vous serez capable de compléter n'importe laquelle de vos propres applications et de développer des Tweaks plus amusants, par exemple le plug-in pour récupérer des enveloppes rouges sur WeChat. Cela ne semble pas difficile à mettre en œuvre. Cet exemple de projet est entièrement hébergé sur Github, où fakeloc est dylib, c'est-à-dire que tweak TestFakeTweak est le projet d'application, HackAppTool. Notre article ci-dessus décrit les outils tiers qui doivent être utilisés.
Adresse du projet : 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你就可以进一步修改成其它的密码了