0 votos

¿Romper SQLcipher modificando libsqlcipher.so?

Estaba intentando extraer datos de una aplicación Android que utiliza SQLcipher. SQLcipher es una extensión de SQLite que cifra los archivos de la base de datos con AES de 256 bits.

La mayor parte del código de la aplicación está comprimido y protegido con algún tipo de material contra la ingeniería inversa, por lo que no hay código fuente ni depuradores. Sin embargo, el binario de SQLcipher se encuentra en lib/libsqlcipher.so . Tengo curiosidad por saber si puedo extraer la clave de encriptación simplemente intercambiando libsqlcipher.so (por ejemplo, modificar sqlite3_key para que registre la clave de encriptación en un archivo). El plan es compilar mi propia versión de libsqlcipher.so , reempaquetar el APK, y ejecutarlo en un dispositivo.

¿Funcionará este método como se espera? Suena demasiado fácil para ser verdad:)

0 votos

¿Así que estás tratando de averiguar la contraseña/clave estática incrustada y oculta en la aplicación que se utiliza para proteger la base de datos? Si la sustitución de la biblioteca funciona, depende de las medidas anti-reversión. Si esas medidas están bien implementadas cada hash de la librería se comprueba antes de ser cargada. Por lo tanto, puede haber una ventana de tiempo muy pequeña entre la comprobación y la carga de la biblioteca.

0 votos

Para añadir a lo que dijo Robert, supongo que libsqlcipher.so vive en el archivo .apk, ¿no es así? Si los autores de la aplicación están realmente preocupados por la seguridad, incluso tratando de reemplazar el .so y reensamblar el .apk hará que alguna comprobación de firma falle, ya que la firma será cambiada por una personalizada.

2voto

user3165914 Puntos 119

Terminé usando a Frida para enganchar sqlite3_key dinámicamente y obtuvo la clave de encriptación. Bastante simple.


Breves pasos que he dado:

  1. Configuración de Frida para conectarse a su dispositivo Android

  2. En el extremo de Python, adjuntar a la aplicación de destino y cargar JavaScript.

    import frida

    Attach to target app

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

    Load Javascript from a separate file.

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

    Print any messages that Javascript send back

    script.on("message", print)

  3. En el extremo de Javascript, enganche en sqlite3_key y leer la clave de encriptación de la memoria:

    // Locate the SQLCipher library var sqlcipher = Process.findModuleByName("libsqlcipher.so");

    // Locate the sqlite3_key function call var func = sqlcipher.findExportByName("sqlite3_key");

    // Hook into it Interceptor.attach(func, { onEnter: function (args) { // The encryption key is the second argument to sqlite3_key var key_ptr = args[1];

        // read 32 bytes worth of data(256-bit key)
        var key = key_ptr.readByteArray(32);
    
        // And send it back to Python
        send("Got key", key);
    }

    });

0 votos

Hola, parece que has creado accidentalmente una cuenta duplicada. Por favor, consulte el centro de ayuda para fusionar sus cuentas y recuperar la propiedad de la pregunta y responder a los comentarios en su puesto. De momento, editaré el post y añadiré esta información. Gracias por tu comprensión.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X