欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]钉钉PC版数据库解密算法分析

[原创]钉钉PC版数据库解密算法分析

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

上传的附件 dingding_db.cpp

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功