作者是如何找到 AES CBC whatsapp CRYPT5 db 使用的初始化向量的?

逆向工程 密码学
2021-07-05 12:58:50

我正在通过解密 MSGSTORE.DB.CRYPT5、新数据库 WHATSAPP窃取 WhatsApp 更新

第一个链接的作者发布了一个解密器,它将 iv 设置aes_192_cbc

iv = bytearray([0x1E,0x39,0xF3,0x69,0xE9,0xD,0xB3,0x3A,0xA7,0x3B,0x44,0x2B,0xBB,0xB6,0xB0,0xB9])

这是完整的解密器:

#!/usr/bin/python              
"""
48bits presents:
8===============================================D~~~
WhatsApp msgstore crypt5 decryptor by grbnz0 and nullsub
8===============================================D~~~

"""

import sys
import hashlib
import StringIO
from M2Crypto import EVP

key = bytearray([141, 75, 21, 92, 201, 255, 129, 229, 203, 246, 250, 120, 25, 54, 106, 62, 198, 33, 166, 86, 65, 108, 215, 147])
iv = bytearray([0x1E,0x39,0xF3,0x69,0xE9,0xD,0xB3,0x3A,0xA7,0x3B,0x44,0x2B,0xBB,0xB6,0xB0,0xB9])

def decrypt(db,acc):
  fh = file(db,'rb')
  edb = fh.read()
  fh.close()
  m = hashlib.md5()
  m.update(acc)
  md5 = bytearray(m.digest())
  for i in xrange(24): key[i] ^= md5[i&0xF]
  cipher = EVP.Cipher('aes_192_cbc', key=key, iv=iv, op=0)
  sys.stdout.write(cipher.update(edb))
  sys.stdout.write(cipher.final())

if __name__ == '__main__':
  if len(sys.argv) != 3:
    print 'usage %s <db> <accountname> > decrypted.db' % sys.argv[0]
  else:
    decrypt(sys.argv[1],sys.argv[2])

我唯一想念的是 IV 是从哪里来的?我在 ida 快照上没有看到它:

在此处输入图片说明

1个回答

它似乎不在 IDA 快照上。您可能确定了程序流的正确部分来设置初始key数组。并假设左侧部分应该与 有关iv,但事实并非如此。iv是 16 字节,IDA 反汇编的左边部分定义了 24 字节,与key. 此外,图像的最顶部显示有一个 if 条件,该条件分支到设置键或设置左侧部分,因此这些分支相互排斥。

在右侧部分的密钥初始化之后,执行 MD5 计算,然后调用dword ptr eax+2AHwhereeax设置为[ebp+0],并且ebp它本身是堆栈中的顶部项目。参数放在堆栈上 -ebp在顶部,然后edx=esp+40,然后edx=esp+60esp+60之前设置MD5_Init为 preludes调用结果的位置,显然字符串是 MD5'ed (MD5_Update(x, esp+60, strlen(esp+60))这种模式 -ebp是一个指向数据和函数的指针,函数的第一个参数是ebp- 暗示ebp是一个指向 C++ 类的指针。

总体而言,右侧部分设置密钥,调用类方法,执行 MD5 操作,并调用另一个类方法。与 python 脚本相比,似乎第一个类方法执行 python“从文件中读取”,第二个是 XOR-ing。CVP.cipher 调用稍后出现,未显示在 IDA 快照中,因此您无法看到 iv 是如何设置的。

IDA 快照的左侧部分是别的东西,可能是用于解密旧版本数据库的代码。IDA 快照的顶部说“如果某物等于 5,则执行正确的部分”;这可能是一个版本号,较低的版本向左分支;然而,IDA 反汇编没有显示左侧分支的条件,所以这是猜测。