ВНИМАНИЕ: этот инструмент следует использовать ТОЛЬКО для взлома вашей собственной базы данных. НЕ ИСПОЛЬЗУЙТЕ его ни в каких незаконных обстоятельствах.
(Этот инструмент может решить проблемы, перечисленные в https://github.com/ppwwyyxx/wechat-dump/wiki, pysqlcipher.dbapi2.DatabaseError: файл зашифрован или не является базой данных)
На некоторых устройствах вы можете получить сообщение об ошибке: «файл зашифрован или не является базой данных» при попытке расшифровать EnMicroMsg.db с помощью «md5(imei + uin)[:7]». Одна из возможных причин заключается в том, что WeChat использует другие идентификаторы устройств вместо IMEI для генерации пароля.
Нам повезло, что 28-битный пароль (всего 16^7 комбинаций) недостаточно надежен, чтобы противостоять атаке методом перебора.
WeChat использует sqlcipher v2 для шифрования базы данных. Части функций безопасности перечислены ниже (с https://www.zetetic.net/sqlcipher/design/):
Итак, наша стратегия — это общение: получить первую страницу; получить IV из последних 16B и соль из первых 16B; перебрать все комбинации возможных парольных фраз; получить соответствующий ключ. Расшифруйте БД.
Мы знаем, что исходный заголовок sqlite db представляет собой строку размером 16 байт: «SQLite format 3 », которая в зашифрованном случае заменяется солью. Ниже приведены 2B для описания размера страницы (0x04 0x00), 1B версии записи ( 0x01 0x02) и версия чтения 1B ( 0x01 0x02). У нас есть 4 одинаковых байта, чтобы проверить, получили ли мы правильный простой текст. (2019-04-12) В Wechat 7 Tencent использует новую версию записи/чтения (0x02), которая нарушает наше прежнее обнаружение. Теперь мы будем использовать следующие три фиксированных байта, чтобы проверить, получаем ли мы правильный простой текст: 1. максимальная доля встроенной полезной нагрузки (0x40) со смещением 5; 2. минимальная доля встроенной полезной нагрузки (0x20) со смещением 6; 3. доля полезной нагрузки листа (0x20) со смещением 7. (Здесь мы можем просто игнорировать коллизию. Если вы успешно получили проход, но все еще не можете открыть базу данных, просто пропустите «ложное предупреждение» и начните со следующего прохода.)
Выполнение одного PBKDF2 с 4000 итерациями занимает около 5 мс. Таким образом, в худшем случае на взлом уйдет 16^7 * 0,005/3600/24 = 15,5 дней. На 8-ядерном ПК этот срок сокращается до 2 дней (теперь это звучит разумно).
Прежде чем взломать, используйте Extract_key_from_cfg_files.py, чтобы получить ключ, если доступны systemInfo.cfg и CompatibleInfo.cfg.
На выбор доступны две версии: версия C и версия Python. Первый должен быть немного быстрее (ядро использует openssl. Никакой разницы в расчете 4000 итераций).
$ sudo apt-get install libssl-dev
$ gcc password_cracker.c -l crypto -o password_cracker.o
измените параметры в «crack_enmicromsg_db_(C_version)». process_no: общее количество используемых ядер. Примечание. Если вы успешно получили пропуск, но по-прежнему не можете открыть базу данных, начните со следующего прохода, изменив «pass_start».
начинать:
$ python2 crack_enmicromsg_db_(C_version).py
Демонстрационная цель. Не хорошо написано.
Используйте замечательный дамп wechat, написанный Юсинем Ву, чтобы сбросить всю базу данных. Вам нужно изменить несколько строк в «decrypt-db.py», чтобы использовать ключ. Веселиться!
decrypt_db_with_password.py: если вы уже знаете пароль, используйте этот сценарий, чтобы получить расшифрованную базу данных, которую можно просматривать/редактировать с помощью DB Browser для SQLite.
encrypt_db_again.py: повторное шифрование базы данных. Примечание. (4 февраля 2018 г.) не проверялось, сможет ли WeChat открыть его правильно.
Extract_key_from_cfg_files.py: этот скрипт может извлечь ключ из CompatibleInfo.cfg и systemInfo.cfg . Обратите внимание, что он написан на Python 3 . Сначала измените search_path, а затем запустите скрипт с помощью
$ python3 extract_key_from_cfg_files.py
sqlcipher-tools/decrypt.c очень помогает мне понять, как работает sqlcipher.
wechat-dump/decrypt-db.py предоставляет ключевые параметры базы данных WeChat.
Документация sqlcipher: подробные сведения о функциях безопасности.
Исправление проблемы № 4: не компилируется с openssl 1.1: спасибо @couling за патч для openssl 1.1.