Questions d'entretien sur la sécurité mobile - Liées à iOS

Le principe de l'outil smashing iOS (DYLD_INSERT_LIBRARIES injecte la bibliothèque dynamique dylib)

Sur la plate-forme iOS, le déballage (déballage) fait référence au décryptage d'une application cryptée téléchargée depuis l'App Store sous une forme non cryptée. Les outils Shell sont souvent utilisés à des fins d’ingénierie inverse et de débogage.
DYLD_INSERT_LIBRARIES est une variable d'environnement pour l'éditeur de liens dynamique (dyld) sur les plateformes iOS et macOS qui permet d'insérer une ou plusieurs bibliothèques dynamiques au démarrage du programme. En insérant une bibliothèque dynamique contenant la fonction de shelling, la partie cryptée du programme peut être interceptée et déchiffrée lorsque le programme est en cours d'exécution, afin d'atteindre l'objectif de shelling.
Voici le principe de base de l'utilisation de DYLD_INSERT_LIBRARIES pour réaliser un smashing :

  1. Écriture d'une bibliothèque dynamique de shelling : tout d'abord, nous devons écrire une bibliothèque dynamique contenant la fonction de shelling. Cette bibliothèque doit implémenter les fonctions suivantes :
    • Intercepter les appels système liés au mappage de la mémoire, tels que mmap et mremap_encrypted ;
    • Dans l'appel système intercepté, lorsqu'un segment de mémoire chiffré (identifié par le champ cryptid) est détecté, utilisez la méthode de déchiffrement fournie par le système (telle que mremap_encrypted) pour le déchiffrer ;
    • Remappez le segment de mémoire déchiffré au programme.
  2. Obtenez le chemin d'accès au sheller : vous devez obtenir le chemin d'accès à l'application cible afin de l'exécuter ultérieurement.
  3. Utilisez DYLD_INSERT_LIBRARIES pour injecter la bibliothèque dynamique du shell : Avant d'exécuter le programme cible, définissez la variable d'environnement DYLD_INSERT_LIBRARIES sur le chemin de la bibliothèque dynamique du shell, par exemple :
export DYLD_INSERT_LIBRARIES=/path/to/your/dylib
  1. Exécutez le programme cible : Vous pouvez maintenant exécuter le programme cible. Puisque DYLD_INSERT_LIBRARIES a été défini, dyld chargera automatiquement la bibliothèque dynamique du shell au démarrage du programme, afin de décrypter la partie cryptée du programme au moment de l'exécution.
  2. Exportez le programme déchiffré : après avoir terminé les étapes ci-dessus, vous pouvez utiliser d'autres outils (tels que le vidage de classe, MachOView, etc.) pour exporter le programme déchiffré à des fins d'analyse plus approfondie et d'ingénierie inverse.

Ce qui précède est le principe de base de l'utilisation de DYLD_INSERT_LIBRARIES pour injecter la bibliothèque dynamique du shell. Veuillez noter que la faisabilité réelle de cette méthode sur la plateforme iOS peut être affectée par des facteurs tels que la version du système, l'état du jailbreak, etc.

Comment iOS hook a c fonctionne-t-il sans jailbreak ? Connaissez-vous fishhook, Method Swizzling ?

Une façon d’accrocher des fonctions C sur des appareils iOS non jailbreakés consiste à utiliser la bibliothèque fishhook. fishhook est un outil léger d'accrochage de bibliothèque de liens dynamiques développé par Facebook qui peut être utilisé sur iOS et macOS. Il peut relier (relier) les symboles C au moment de l'exécution pour atteindre l'objectif d'accrochage des fonctions C.
Voici les étapes de base pour accrocher une fonction C à l’aide d’un hameçon :

  1. Importez la bibliothèque fishhook : Tout d’abord, vous devez importer la bibliothèque fishhook dans votre projet. Il peut être importé en clonant le dépôt officiel ou en utilisant CocoaPods :
  2. Écrivez la fonction hook : Ensuite, écrivez la fonction hook qui remplace la fonction C d'origine. Par exemple, si vous souhaitez hooker la fonction printf, vous pouvez écrire la fonction hook suivante : objcCopy
#include <stdio.h>

static int (*orig_printf)(const char * restrict format, ...);

int hook_printf(const char * restrict format, ...) {
    
    
    // 在这里编写你的 hook 逻辑
    // 例如,在原始 printf 输出的基础上添加前缀
    va_list args;
    va_start(args, format);
    int result = orig_printf("[HOOK] ");
    result += orig_printf(format, args);
    va_end(args);
    return result;
}
  1. Relier à l'aide de fishhook : Ensuite, utilisez la fonction rebind_symbols de la bibliothèque fishhook pour relier les symboles. Dans l'exemple ci-dessus, vous feriez : objcCopy
#import <fishhook/fishhook.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    // 在这里进行符号重绑定
    rebind_symbols((struct rebinding[1]){
    
    {
    
    "printf", hook_printf, (void *)&orig_printf}}, 1);

    // 接下来的 printf 调用将使用 hook 函数
    printf("Hello, world!\n");

    return YES;
}

Quant au Method Swizzling, il s'agit d'une technique en Objective-C permettant de remplacer les implémentations de méthodes au moment de l'exécution. Cependant, cette technique s'applique principalement aux méthodes Objective-C, et non aux fonctions C. Si vous souhaitez accrocher des méthodes Objective-C, vous pouvez utiliser Method Swizzling ; si vous avez besoin d'accrocher des fonctions C, vous pouvez utiliser des outils comme fishhook.

おすすめ

転載: blog.csdn.net/u010671061/article/details/132268639