ADVERTENCIA: Esta herramienta SÓLO debe usarse para descifrar su propia base de datos. NO lo utilice en NINGUNA circunstancia ilegal.
(Esta herramienta puede resolver los problemas enumerados en https://github.com/ppwwyyxx/wechat-dump/wiki, pysqlcipher.dbapi2.DatabaseError: el archivo está cifrado o no es una base de datos)
Con algunos dispositivos, es posible que reciba el mensaje de error: "el archivo está cifrado o no es una base de datos" al intentar descifrar EnMicroMsg.db con "md5(imei + uin)[:7]". Una posible razón es que WeChat utiliza otros ID de dispositivo en lugar de IMEI para generar una contraseña.
Tenemos suerte de que la contraseña de 28 bits (un total de 16^7 combinaciones) no sea lo suficientemente fuerte como para resistir un ataque de fuerza bruta.
WeChat usa sqlcipher v2 para cifrar la base de datos. Partes de las características de seguridad se enumeran a continuación (de https://www.zetetic.net/sqlcipher/design/):
Entonces, el compañerismo es nuestra estrategia: conseguir la primera página; obtener IV de los últimos 16B y sal de los primeros 16B; iterar sobre todas las combinaciones de posibles frases de contraseña; derivar la clave correspondiente. Descifrar la base de datos.
Sabemos que el encabezado original de sqlite db es una cadena de 16B: "formato SQLite 3 ", que se reemplaza por salt en el caso cifrado. A continuación se muestran 2B para describir el tamaño de la página (0x04 0x00), 1B versión de escritura ( 0x01 0x02) y versión de lectura 1B ( 0x01 0x02). Tenemos 4 bytes idénticos para comprobar si obtenemos el texto sin formato correcto. (2019-04-12) Desde Wechat 7, Tencent utiliza una nueva versión de escritura/lectura (0x02), que romperá nuestra detección anterior. Ahora usaremos los siguientes tres bytes fijos para probar si obtenemos el texto sin formato correcto: 1. fracción máxima de carga útil incrustada (0x40) con desplazamiento 5; 2. fracción mínima de carga útil integrada (0x20) con desplazamiento 6; 3. fracción de carga útil de la hoja (0x20) con desplazamiento 7. (Aquí podemos simplemente ignorar la colisión. Si obtiene el pase con éxito pero aún no puede abrir la base de datos, simplemente omita la "alerta falsa" y comience desde el siguiente pase).
Se necesitan unos 5 ms para realizar un solo PBKDF2 con 4000 iteraciones. Entonces, en el peor de los casos, tomará 16^7 * 0.005 /3600/24 = 15.5 días para descifrarlo. En una PC de 8 núcleos, se reduce a 2 días (ahora suena razonable).
Antes de descifrar, utilice extract_key_from_cfg_files.py para obtener la clave si systemInfo.cfg y CompatibleInfo.cfg están disponibles.
Hay dos versiones para elegir: una versión C y una versión Python. El primero debería ser un poco más rápido (el núcleo se basa en openssl. No hay diferencia al calcular las 4000 iteraciones).
$ sudo apt-get install libssl-dev
$ gcc password_cracker.c -l crypto -o password_cracker.o
modificar parámetros en "crack_enmicromsg_db_(C_version)". Process_no: núcleos totales utilizados. Nota: Si obtiene el pase con éxito pero aún no puede abrir la base de datos, comience desde el siguiente pase cambiando "pass_start".
comenzar:
$ python2 crack_enmicromsg_db_(C_version).py
Propósito de la demostración. No bien escrito.
Utilice el maravilloso wechat-dump escrito por Yuxin Wu para volcar toda la base de datos. Debes modificar algunas líneas en "decrypt-db.py" para usar la clave. ¡Divertirse!
decrypt_db_with_password.py: cuando ya conozca la contraseña, utilice este script para obtener una base de datos descifrada que DB Browser para SQLite pueda ver/editar.
encrypt_db_again.py: cifrando la base de datos nuevamente. Nota: (4 de febrero de 2018) no se ha probado si WeChat puede abrirlo correctamente.
extract_key_from_cfg_files.py: este script puede extraer la clave de CompatibleInfo.cfg y systemInfo.cfg . Tenga en cuenta que está escrito en Python 3 . Primero cambie search_path y luego ejecute el script con
$ python3 extract_key_from_cfg_files.py
sqlcipher-tools/decrypt.c me ayuda mucho a comprender cómo funciona sqlcipher.
wechat-dump/decrypt-db.py proporciona parámetros clave de WeChat db.
Documentación de sqlcipher: sus características de seguridad detalladas.
Solucionar el problema #4: No se compilará con openssl 1.1: gracias @couling por el parche de openssl 1.1.