type
Post
status
Published
date
Jan 7, 2024
slug
wildfire IM APP
summary
尝试分析野火IM聊天APP的聊天记录数据库过程中遇到了很多问题,因此仅作记录。
tags
Android
Reverse
野火IM
category
Android安全
icon
password
0x00 引言0x01 遇到的问题1. 找聊天记录文件操作遇到问题2. Frida无法找到libmarsstn.so0x02 SQLCipher加密数据库密钥逻辑0x03 Frida 验证0x04 总结0x05 参考
0x00 引言
尝试分析野火IM聊天APP的聊天记录数据库过程中遇到了很多问题,因此仅作记录。
项目源码如下,本文分析其发行示例APP
android-chat
wildfirechat • Updated Apr 15, 2025
0x01 遇到的问题
1. 找聊天记录文件操作遇到问题
首先在数据目录下找疑似聊天记录的数据文件,只有files下面的比较象,并且data文件为加密文件,打开并非明文。目录中
a49qmws2k是用户ID标识,结合野火官方说客户端使用了SQLCipher保证数据安全,基本确定就是这个目录中的内容。
但是通过反编译Java层逻辑并没有找到关于
data文件的操作,通过Frida Hook全部Java层的文件操作方法都没监控到,就怀疑是写在native层里面的。
在arm64架构的动态链接库中找so,排除了bug报告相关的so,然后在每个so里面搜索
Heartbeat.ini字符串,在libmarsstn.so中找到字符串,然后基本确定是在这个so中进行数据文件的操作。2. Frida无法找到libmarsstn.so
找到so后,尝试使用frida去Hook里面的一些函数,但是又遇到了新的问题,frida压根没找到这个so。

后来发现问题在于如果只指定包名 frida默认Hook了主进程,但是实际这个so被
net.wildfirechat.demo:marsservice 加载,PID为9312,直接指定PID即可。

0x02 SQLCipher加密数据库密钥逻辑
之后就可以重点分析这个so
用的腾讯的mars协议栈,稍微改了一下,源码:
proto
LeonDevLifeLog • Updated Sep 11, 2024
在
proto-firechat\mars\proto\src\business.cc 中存在数据库的密钥处理逻辑,总而言之就是拿到服务端传递回来的Token后AES_CBC解密Token,然后使用|分隔符取到解密后Token的最后一段内容作为数据库的密钥。其中
unsigned char* pdata = (unsigned char* )decrypt_data(tmp, len, &dataLen, true, false); 对Token进行解密,具体实现则是aes_cbc 解密,其中key和IV是一致的,都是0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
在
shared_prefs 目录下config.xml中可以找到对应用户ID和Token。
顺利获取解密密钥
ce4a9ac0-6f51-4bb7-a84a-7bb9d529433c
0x03 Frida 验证
在
DB2::Open 中传参密钥,通过open db 等字符串定位编译的so中函数位置
Hook
0x1F08EC 偏移的函数,获取传入的参数,在一定偏移位置找到密钥
0x04 总结
多进程时需要关注多个进程,一直找不到某个Module可能就在别的进程中。
0x05 参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/wildfire%20IM%20APP
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






