1. 解密过程分析
CreateFile 下条件断点,在打开数据库文件时 断下后查看堆栈,调用来至mainframe.dll
查看sqlite 源码,在 openDatabase 函数有以上的代码段,直接 用 ida 在 mainframe.dll 搜索 字符串 "temp",查找引用,定位到 openDatabase 函数
x64dbg 下断点,成功断下
跳出此函数,往下运行,停在疑似设置数据库密码的位置
步入
call 4202420 就是设置密码
打开ida 分析 4202420
从密钥里取16 byte 作为 AES-128 的 key 分别初始化 encrypt_key 和 decrypt_key 保存在
encrypt_cb_func_user_data ,encrypt_cb_func 会在解密数据库页面时被调用
encrypt_cb_func 的ida 代码如下
xx_cipher_callback_read
数据库 页面分块aes 解密, 在 aes_decrypt 下断,
在 上面的while 循环结尾断下后
可以看到 sqlite 文件头
2 密钥的生成分析
在上面设置密钥处进行回溯,很容易找到 密钥的生成 的相关代码
在目录 C:\Users\Administrator\AppData\Roaming\DingTalk下有两类数据库文件
globalStorage 子目录下的storage.db
{uid}_v2\DBFiles 子目录下的storage.db\dingtalk.db
storage.db 的密码生成
cpuid 0 的 四个整数 %d%d%d%d格式化成字符串
dingtalk.db 就是 uid 的MD5 值
代码:附件 dingding_db.cpp
[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行
最后于 2天前 被欧阳brother编辑 ,原因: