某度自研IM通讯软件如流数据库解密分析
字数 1999
更新时间 2026-04-12 12:01:21

某度自研IM通讯软件“如流”数据库解密分析教学文档

1. 概述

本教程旨在详细解析对某度自研即时通讯(IM)软件“如流”的加密数据库进行解密分析的技术过程。核心目标是定位其数据库加密密钥,并实现通用化的密钥提取与数据库解密。

2. 核心分析过程

2.1 定位数据库读取与加密函数

  • 初步定位:首先通过调试器(如x64dbg或OllyDbg)在目标软件进程中对文件读取API(例如Windows系统的ReadFile函数)设置条件断点。目的是拦截软件读取本地聊天记录数据库文件(如.db文件)的操作。
  • 模块溯源:当断点触发,检查调用堆栈,可以追溯到执行该操作的具体模块。在本次分析中,调用来源于 ImStorage.dll 动态链接库。此模块很可能是负责数据存储与管理的核心组件。

2.2 逆向分析核心模块

  • 静态反编译:使用逆向工程工具(如IDA Pro)对ImStorage.dll进行反编译与静态分析。
  • 关键函数定位:在分析过程中,定位到与SQLite数据库加密相关的函数调用。具体找到了 sqlite3_key 函数。这是SQLCipher(一个SQLite加密扩展)或类似SQLite加密库中用于输入数据库解密密钥的关键函数。此函数的出现确认了数据库使用了SQLite格式并经过加密。

2.3 动态调试提取密钥

  • 动态断点:在调试器中,对sqlite3_key函数设置断点。当软件启动并尝试打开本地数据库时,此断点将被触发。
  • 获取密钥:函数触发时,检查传递给sqlite3_key函数的参数。其中一参数即为解密密钥。在本次分析中,内存中观察到的原始密钥为:vJCouweimIBZLuJL

2.4 寻找密钥的通用内存特征

  • 多环境对比:仅一个实例的密钥不足以通用化提取。需要在不同账户或不同运行环境中运行软件,多次在sqlite3_key断点处检查密钥在内存中的存储位置及周边数据。
  • 提取特征码:通过对比多个样本,发现存储密钥的指针及其周边内存结构存在固定模式,而非密钥内容本身。分析得出一个可用的内存特征码为:90 08 ?? ?? f8 7f 00 00 10 00 00 00 17 00 00 00(十六进制)。
    • 说明?? 表示可变字节,通常可能是地址的低位部分,在不同环境下会变化。但该特征序列的其余部分是稳定的,可用于在进程内存中定位指向密钥字符串的指针。

2.5 编写通用密钥提取工具

  • 内存扫描程序:基于上述特征码,可以编写一个内存扫描程序(例如用C/C++、Python配合读写进程内存的API,如ReadProcessMemory)。该程序的主要功能是:
    1. 附加到“如流”软件的进程。
    2. 扫描整个进程内存空间,寻找与特征码90 08 ?? ?? f8 7f 00 00 10 00 00 00 17 00 00 00匹配的字节序列。
    3. 找到后,从匹配位置提取出存储的指针(通常是一个内存地址)。
    4. 读取该指针所指向的内存地址处的字符串,此字符串即为当前环境下的数据库解密密钥。

2.6 数据库解密

  • 解密工具:获取到密钥后,即可对加密的数据库文件(.db文件)进行解密。可以使用支持SQLCipher的命令行工具sqlite3.exe(需编译支持加密的DLL,如sqlite3.dllsqlcipher.dll)。
  • 解密命令:通过命令行或脚本执行解密,基本命令形式为:
    # 一种常见方式是先打开加密数据库并输入密钥,再导出为明文数据库
    sqlite3 encrypted.db
    PRAGMA key = '提取到的密钥';
    .backup decrypted.db
    
    或者使用专门的SQLCipher shell:
    sqlcipher encrypted.db
    PRAGMA key = '提取到的密钥';
    .output decrypted.db
    .dump
    
  • 查看数据:解密生成的decrypted.db是标准的SQLite3数据库文件,可以使用任何SQLite浏览器(如DB Browser for SQLite)或命令行工具查看其中的表结构和聊天记录等数据。

3. 核心知识点总结

  1. 关键函数sqlite3_key 是SQLite数据库加密方案中用于验证和解密的核心函数,是动态调试的关键切入点。
  2. 分析思路:采用动静结合的分析方法。静态分析(IDA)用于理解模块功能和定位关键函数;动态调试(调试器)用于实时获取运行时的敏感数据(密钥)。
  3. 特征码定位:在安全分析中,为了绕过地址随机化(ASLR)并使工具通用化,不直接使用硬编码地址,而是搜索内存中具有稳定模式的特征字节序列来定位目标数据指针。
  4. 数据库操作:掌握SQLCipher加密数据库的解密流程与基本命令是数据提取的最后一步。

4. 注意事项

  • 法律与道德:此技术文档仅用于安全研究、教育及授权测试目的。未经授权对他人软件或数据进行解密分析可能涉及法律风险及侵犯隐私。
  • 技术时效性:软件会持续更新,加密方式和密钥存储特征可能会发生变化,本方法仅适用于特定版本。
  • 工具依赖性:成功解密依赖于获取正确的密钥和兼容的SQLCipher工具库。
相似文章
相似文章
 全屏