AVISO: Esta ferramenta SÓ deve ser usada para quebrar seu próprio banco de dados. NÃO o use em NENHUMA circunstância ilegal.
(Esta ferramenta pode resolver os problemas listados em https://github.com/ppwwyyxx/wechat-dump/wiki, pysqlcipher.dbapi2.DatabaseError: o arquivo está criptografado ou não é um banco de dados)
Com alguns dispositivos, você pode receber a mensagem de erro: "o arquivo está criptografado ou não é um banco de dados", ao tentar descriptografar EnMicroMsg.db com "md5(imei + uin)[:7]". Uma possível razão é que o WeChat usa outros IDs de dispositivos em vez de IMEI para gerar uma senha.
É uma sorte para nós que a senha de 28 bits (total de 16 ^ 7 combinações) não seja forte o suficiente para resistir a ataques de força bruta.
WeChat usa sqlcipher v2 para criptografar o banco de dados. Partes dos recursos de segurança estão listadas a seguir (em https://www.zetetic.net/sqlcipher/design/):
Então, o Fellowing é a nossa estratégia: pegar a primeira página; obtenha IV do último 16B e sal do primeiro 16B; iterar sobre todas as combinações de senhas possíveis; derivar a chave correspondente. Descriptografe o banco de dados.
Sabemos que o cabeçalho original do sqlite db é uma string de 16B: "SQLite format 3 ", que é substituída pelo salt no caso criptografado. A seguir estão 2B para descrever o tamanho da página (0x04 0x00), versão de gravação 1B ( 0x01 0x02) e versão de leitura 1B ( 0x01 0x02). Temos 4 bytes idênticos para testar se obtemos o texto simples correto. (12/04/2019) A partir do Wechat 7, a Tencent usa uma nova versão de gravação/leitura (0x02), que quebrará nossa detecção anterior. Agora usaremos os três bytes fixos a seguir para testar se obtemos o texto simples correto: 1. fração máxima de carga útil incorporada (0x40) com deslocamento 5; 2. fração mínima de carga útil incorporada (0x20) com deslocamento 6; 3. fração de carga útil folha (0x20) com deslocamento 7. (Aqui podemos simplesmente ignorar a colisão. Se você obtiver a passagem com sucesso, mas ainda não conseguir abrir o banco de dados, basta pular o "alerta falso" e começar na próxima passagem.)
Demora cerca de 5 ms para fazer um único PBKDF2 com 4.000 iterações. Portanto, na pior das hipóteses, levará 16 ^ 7 * 0,005/3600/24 = 15,5 dias para quebrar. Em um PC de 8 núcleos, reduz para 2 dias (parece razoável agora).
Antes de quebrar, use extract_key_from_cfg_files.py para obter a chave se systemInfo.cfg e CompatívelInfo.cfg estiverem disponíveis.
Existem duas versões para escolher: uma versão C e uma versão Python. O primeiro deve ser um pouco mais rápido (o núcleo depende do openssl. Não há diferença no cálculo das 4.000 iterações).
$ sudo apt-get install libssl-dev
$ gcc password_cracker.c -l crypto -o password_cracker.o
modifique os parâmetros em "crack_enmicromsg_db_(C_version)". process_no: total de núcleos usados. Nota: Se você obtiver a passagem com sucesso, mas ainda não conseguir abrir o banco de dados, comece na próxima passagem alterando "pass_start".
começar:
$ python2 crack_enmicromsg_db_(C_version).py
Objetivo de demonstração. Não está bem escrito.
Use o maravilhoso wechat-dump escrito por Yuxin Wu para despejar todo o banco de dados. Você precisa ajustar algumas linhas em “decrypt-db.py” para usar a chave. Divirta-se!
decrypt_db_with_password.py: quando você já souber a senha, use este script para obter um banco de dados descriptografado que pode ser visualizado/editado pelo DB Browser para SQLite.
encrypt_db_again.py: criptografando o banco de dados novamente. Nota: (04 de fevereiro de 2018) não foi testado se o WeChat pode abri-lo corretamente.
extract_key_from_cfg_files.py : este script pode extrair a chave de CompatívelInfo.cfg e systemInfo.cfg . Observe que ele está escrito em Python 3 . Altere o search_path primeiro e depois execute o script com
$ python3 extract_key_from_cfg_files.py
sqlcipher-tools/decrypt.c me ajuda muito a entender como funciona o sqlcipher.
wechat-dump/decrypt-db.py fornece parâmetros-chave do banco de dados WeChat.
Documentação sqlcipher: seus recursos de segurança detalhados.
Correção do problema nº 4: não será compilado no openssl 1.1: obrigado @couling pelo patch do openssl 1.1.