0 votes

Casser SQLcipher en modifiant libsqlcipher.so ?

J'essayais d'extraire des données d'une application Android qui utilise SQLcipher. SQLcipher est une extension de SQLite qui crypte les fichiers de base de données avec AES 256 bits.

La plupart du code de l'application est compressé et protégé par une sorte de système anti-ingénierie inverse, donc pas de code source et pas de débogueurs. Cependant, le binaire SQLcipher se trouve dans lib/libsqlcipher.so. Je me demande si je peux extraire la clé de cryptage simplement en échangeant libsqlcipher.so (par exemple en modifiant la fonction sqlite3_key pour qu'elle enregistre la clé de cryptage dans un fichier). Le plan est de compiler ma propre version de libsqlcipher.so, de reconditionner l'APK et de l'exécuter sur un appareil.

Cette méthode fonctionnera-t-elle comme prévu? Cela semble trop facile pour être vrai :)

0 votes

Alors vous essayez de trouver le mot de passe/clé statique intégré et caché dans l'application qui est utilisé pour protéger la base de données ? Si le remplacement de la bibliothèque fonctionne, cela dépend des mesures anti-retournement. Si ces mesures sont bien implémentées, chaque hachage de bibliothèque est vérifié avant son chargement. Par conséquent, il pourrait n'y avoir qu'une très petite fenêtre de temps entre la vérification et le chargement de la bibliothèque.

0 votes

Pour ajouter à ce que Robert a dit - Je suppose que libsqlcipher.so se trouve dans le fichier .apk, n'est-ce pas? Si les auteurs de l'application sont vraiment préoccupés par la sécurité, même en essayant de remplacer le .so et de recompiler le .apk, certaines vérifications de signature échoueront, car la signature sera modifiée en une signature personnalisée.

2voto

Yizhe Sun Points 11

J'ai fini par utiliser Frida pour accrocher sqlite3_key dynamiquement et obtenir la clé de chiffrement. Assez simple.


Étapes succinctes que j'ai suivies:

  1. Configurer Frida pour se connecter à votre appareil Android

  2. Côté Python, se connecter à l'application cible et charger JavaScript.

    import frida

    Se connecter à l'application cible

    session = frida.get_usb_device().attach("cn.com.company_name.app_name")

    Charger le JavaScript à partir d'un fichier séparé.

    with open("script.js", "r") as file: script = session.create_script(file.read()) script.load()

    Afficher les messages renvoyés par le JavaScript

    script.on("message", print)

  3. Côté JavaScript, accrocher à sqlite3_key et lire la clé de chiffrement en mémoire:

    // Localiser la bibliothèque SQLCipher var sqlcipher = Process.findModuleByName("libsqlcipher.so");

    // Localiser l'appel de fonction sqlite3_key var func = sqlcipher.findExportByName("sqlite3_key");

    // Accrocher à cela Interceptor.attach(func, { onEnter: function (args) { // La clé de chiffrement est le deuxième argument de sqlite3_key var key_ptr = args[1];

        // Lire 32 octets de données (clé de 256 bits)
        var key = key_ptr.readByteArray(32);
    
        // Et le renvoyer vers Python
        send("Clé obtenue", key);
    }

    });

0 votes

Salut, il semble que vous avez créé accidentellement un compte en double. Veuillez consulter le centre d'aide pour fusionner vos comptes et retrouver la propriété de la question et répondre aux commentaires sur votre publication. Pour le moment, je vais modifier la publication et ajouter ces informations. Merci pour votre compréhension.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X