请选择 进入手机版 | 继续访问电脑版

九重天论坛-集技术交流、视频教程、资源共享、游戏辅助、逆向分析、编程学习于一体的综合论坛

 找回密码
 立即注册
展开

喊话小喇叭     

全站
翻车是不可能的 说: 2019,九重天论坛 “猪”大家新年快乐! “猪”事如意。
2019-02-11
查看: 321|回复: 0

微信数据库解密算法

[复制链接]


签到天数: 8 天

[LV.3]偶尔看看II

发表于 2019-4-29 17:14:10 | 显示全部楼层 |阅读模式
pc端、安卓端微信数据库解密算法
安卓端微信数据库密码生成算法网上有文章介绍,这里不提了

pc端的密码生产算法在内存中加密了,有兴趣的朋友可以去看看密码如何生成的

拿到密码之后怎么解密sqlite数据库?有些朋友用sqlcipher死活解不开,其实是参数不对。

这里提供拿到密码之后的解密算法,兼容安卓上的、pc上的微信数据库。(免去到处找sqlcipher,又怕版本错误的问题)
  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. #include <openssl/rand.h>
  4. #include <openssl/evp.h>
  5. #include <openssl/aes.h>
  6. #include <openssl/hmac.h>

  7. //#define ANDROID_WECHAT

  8. #define SQLITE_FILE_HEADER "SQLite format 3" //length == 16
  9. #define IV_SIZE 16
  10. #define HMAC_SHA1_SIZE 20
  11. #define KEY_SIZE 32

  12. #ifndef ANDROID_WECHAT
  13. #define DEFAULT_PAGESIZE 4096
  14. #define DEFAULT_ITER 64000
  15. #else
  16. #define NO_USE_HMAC_SHA1
  17. #define DEFAULT_PAGESIZE 1024
  18. #define DEFAULT_ITER 4000
  19. #endif
  20. <br data-filtered="filtered">
  21. //安卓端这里密码是7位,pc端是经过算法得到的32位pass。
  22. //下面附pc端拿密码的OD图
  23. unsigned char pass[] = { 0x5C, 0xF8, 0x6A, 0x13, 0x61, 0xA1, 0x46, 0x14, 0x98, 0x6C, 0x2D, 0x6F, 0x5E, 0x6C, 0x16, 0x81, 0xB8, 0xCF, 0x5D, 0x3F, 0xD2, 0xEB, 0x49, 0xCE, 0xAF, 0xFB, 0x88, 0xE3, 0xD8, 0x28, 0xC7, 0xBD };

  24. int _tmain(int argc, _TCHAR* argv[])
  25. {
  26.     FILE *fpdb = fopen("MicroMsg.db", "rb+");
  27.     if (!fpdb)
  28.     {
  29.         return 0;
  30.     }
  31.     fseek(fpdb, 0, SEEK_END);
  32.     long nFileSize = ftell(fpdb);
  33.     fseek(fpdb, 0, SEEK_SET);
  34.     unsigned char *pDbBuffer = new unsigned char[nFileSize];
  35.     fread(pDbBuffer, 1, nFileSize, fpdb);
  36.     fclose(fpdb);

  37.     unsigned char salt[16] = { 0 };
  38.     memcpy(salt, pDbBuffer, 16);

  39. #ifndef NO_USE_HMAC_SHA1
  40.     unsigned char mac_salt[16] = { 0 };
  41.     memcpy(mac_salt, salt, 16);
  42.     for (int i = 0; i < sizeof(salt); i++)
  43.     {
  44.         mac_salt[i] ^= 0x3a;
  45.     }
  46. #endif

  47.     int reserve = IV_SIZE;
  48. #ifndef NO_USE_HMAC_SHA1
  49.     reserve += HMAC_SHA1_SIZE;
  50. #endif
  51.     reserve = ((reserve % AES_BLOCK_SIZE) == 0) ? reserve : ((reserve / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;

  52.     unsigned char key[KEY_SIZE] = { 0 };
  53.     unsigned char mac_key[KEY_SIZE] = { 0 };

  54.     OpenSSL_add_all_algorithms();
  55.     PKCS5_PBKDF2_HMAC_SHA1((const char *)pass, sizeof(pass), salt, sizeof(salt), DEFAULT_ITER, sizeof(key), key);
  56. #ifndef NO_USE_HMAC_SHA1
  57.     PKCS5_PBKDF2_HMAC_SHA1((const char *)key, sizeof(key), mac_salt, sizeof(mac_salt), 2, sizeof(mac_key), mac_key);
  58. #endif

  59.     unsigned char *pTemp = pDbBuffer;
  60.     unsigned char pDecryptPerPageBuffer[DEFAULT_PAGESIZE];
  61.     int nPage = 1;
  62.     int offset = 16;
  63.     while (pTemp < pDbBuffer + nFileSize)
  64.     {
  65.         printf("decrypt page:%d/%d \n", nPage, nFileSize / DEFAULT_PAGESIZE);

  66. #ifndef NO_USE_HMAC_SHA1
  67.         //check hmac
  68.         unsigned char hash_mac[HMAC_SHA1_SIZE] = { 0 };
  69.         unsigned int hash_len = 0;
  70.         HMAC_CTX hctx;
  71.         HMAC_CTX_init(&hctx);
  72.         HMAC_Init_ex(&hctx, mac_key, sizeof(mac_key), EVP_sha1(), NULL);
  73.         HMAC_Update(&hctx, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset + IV_SIZE);
  74.         HMAC_Update(&hctx, (const unsigned char *)&nPage, sizeof(nPage));
  75.         HMAC_Final(&hctx, hash_mac, &hash_len);
  76.         HMAC_CTX_cleanup(&hctx);
  77.         if (0 != memcmp(hash_mac, pTemp + DEFAULT_PAGESIZE - reserve + IV_SIZE, sizeof(hash_mac)))
  78.         {
  79.             //hash check err
  80.             return 0;
  81.         }
  82. #endif
  83.         //
  84.         if (nPage == 1)
  85.         {
  86.             memcpy(pDecryptPerPageBuffer, SQLITE_FILE_HEADER, offset);
  87.         }

  88.         //aes decrypt
  89.         EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new();
  90.         EVP_CipherInit_ex(ectx, EVP_get_cipherbyname("aes-256-cbc"), NULL, NULL, NULL, 0);
  91.         EVP_CIPHER_CTX_set_padding(ectx, 0);
  92.         EVP_CipherInit_ex(ectx, NULL, NULL, key, pTemp + (DEFAULT_PAGESIZE - reserve), 0);

  93.         int nDecryptLen = 0;
  94.         int nTotal = 0;
  95.         EVP_CipherUpdate(ectx, pDecryptPerPageBuffer + offset, &nDecryptLen, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset);
  96.         nTotal = nDecryptLen;
  97.         EVP_CipherFinal_ex(ectx, pDecryptPerPageBuffer + offset + nDecryptLen, &nDecryptLen);
  98.         nTotal += nDecryptLen;
  99.         EVP_CIPHER_CTX_free(ectx);

  100.         //assert(nTotal == DEFAULT_PAGESIZE - reserve - offset);

  101.         //no necessary ,just like sqlcipher
  102.         memcpy(pDecryptPerPageBuffer + DEFAULT_PAGESIZE - reserve, pTemp + DEFAULT_PAGESIZE - reserve, reserve);

  103.         FILE *fp = fopen("MicroMsg_Decrypt.db", "ab+");
  104.         {
  105.             fwrite(pDecryptPerPageBuffer, 1, DEFAULT_PAGESIZE, fp);
  106.             fclose(fp);
  107.         }

  108.         nPage++;
  109.         offset = 0;
  110.         pTemp += DEFAULT_PAGESIZE;
  111.     }<br data-filtered="filtered">
  112.     return 0;
  113. }
复制代码
361125_5ku6odq9xxcthc6.png



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|九重天论坛 ( 粤ICP备19002437号 )

GMT+8, 2019-8-23 12:45

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表