type
status
date
slug
summary
tags
category
icon
password
0x00 引言0x01 遇到的问题1. 找聊天记录文件操作遇到问题2. Frida无法找到libmarsstn.so0x02 SQLCipher加密数据库密钥逻辑0x03 Frida 验证0x04 总结0x05 参考
0x00 引言
尝试分析野火IM聊天APP的聊天记录数据库过程中遇到了很多问题,因此仅作记录。
项目源码如下,本文分析其发行示例APP
android-chat
wildfirechat • Updated Aug 8, 2024
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 May 8, 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 许可协议,转载请注明出处。
相关文章