경고: 이 도구는 자신의 DB를 크랙하는 데에만 사용해야 합니다. 불법적인 상황에서는 사용하지 마십시오.
(이 도구는 https://github.com/ppwwyyxx/wechat-dump/wiki, pysqlcipher.dbapi2.DatabaseError: 파일이 암호화되었거나 데이터베이스가 아닙니다에 나열된 문제를 해결할 수 있습니다.)
일부 장치에서는 "md5(imei + uin)[:7]"을 사용하여 EnMicroMsg.db의 암호를 해독하려고 할 때 "파일이 암호화되었거나 데이터베이스가 아닙니다"라는 오류 메시지가 나타날 수 있습니다. 한 가지 가능한 이유는 WeChat이 IMEI 대신 다른 장치 ID를 사용하여 비밀번호를 생성하기 때문입니다.
28비트 암호(총 16^7 조합)가 무차별 대입 공격을 저항할 만큼 강력하지 않다는 점은 다행입니다.
WeChat은 sqlcipher v2를 사용하여 데이터베이스를 암호화합니다. 보안 기능의 일부는 다음과 같습니다(https://www.zetetic.net/sqlcipher/design/ 참조).
그래서 펠로우링이 우리의 전략입니다. 첫 번째 페이지를 확보하세요. 마지막 16B에서 IV를 얻고 처음 16B에서 소금을 얻습니다. 가능한 암호 문구의 모든 조합을 반복합니다. 해당 키를 파생시킵니다. DB를 해독합니다.
우리는 sqlite db의 원래 헤더가 16B 문자열인 "SQLite 형식 3 "이라는 것을 알고 있습니다. 이는 암호화된 경우 솔트로 대체됩니다. 다음은 페이지 크기(0x04 0x00)를 설명하는 2B, 쓰기 버전( 0x01 0x02) 및 1B 읽기 버전( 0x01 0x02). 올바른 일반 텍스트를 얻었는지 테스트하기 위해 4개의 동일한 바이트가 있습니다. (2019-04-12) Wechat 7부터 Tencent는 새로운 쓰기/읽기 버전(0x02)을 사용하므로 이전 감지 기능이 중단됩니다. 이제 다음 3개의 고정 바이트를 사용하여 올바른 일반 텍스트를 얻었는지 테스트합니다. 1. 오프셋 5의 최대 내장 페이로드 비율(0x40); 2. 오프셋 6의 최소 내장 페이로드 비율(0x20); 3. 오프셋 7의 리프 페이로드 부분(0x20). (여기서는 충돌을 무시할 수 있습니다. 패스를 성공적으로 얻었지만 여전히 db를 열 수 없는 경우 "false 경고"를 건너뛰고 다음 패스부터 시작하세요.)
4000회 반복으로 단일 PBKDF2를 수행하는 데 약 5ms가 걸립니다. 따라서 최악의 경우 크랙하는 데 16^7 * 0.005 /3600/24 = 15.5일이 소요됩니다. 8코어 PC에서는 2일로 단축됩니다(현재로서는 합리적으로 보입니다).
크래킹하기 전에 systemInfo.cfg 및 CompatibleInfo.cfg를 사용할 수 있는 경우 extract_key_from_cfg_files.py를 사용하여 키를 가져오세요.
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: 사용된 총 코어 수입니다. 참고: 패스 획득에 성공했지만 여전히 db를 열 수 없는 경우 "pass_start"를 변경하여 다음 패스부터 시작하세요.
시작:
$ python2 crack_enmicromsg_db_(C_version).py
데모 목적. 잘 쓰여지지 않았습니다.
전체 DB를 덤프하려면 Yuxin Wu가 작성한 멋진 wechat-dump를 사용하세요. 키를 사용하려면 "decrypt-db.py"에서 몇 줄을 조정해야 합니다. 재미있게 보내세요!
decrypt_db_with_password.py: 이미 비밀번호를 알고 있는 경우 이 스크립트를 사용하여 SQLite용 DB 브라우저에서 보거나 편집할 수 있는 해독된 데이터베이스를 가져옵니다.
encrypt_db_again.py: db를 다시 암호화합니다. 참고: (2018년 2월 4일) 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 db의 주요 매개변수를 제공합니다.
sqlcipher 문서: 자세한 보안 기능.
문제 #4 수정: openssl 1.1에 대해 컴파일되지 않습니다. openssl 1.1 패치에 대해 @couling에게 감사드립니다.