type
status
date
slug
summary
tags
category
icon
password
 
 
 

0x00 引言

尝试分析野火IM聊天APP的聊天记录数据库过程中遇到了很多问题,因此仅作记录。
项目源码如下,本文分析其发行示例APP
android-chat
wildfirechatUpdated Jun 27, 2024
 

0x01 遇到的问题

1. 找聊天记录文件操作遇到问题

首先在数据目录下找疑似聊天记录的数据文件,只有files下面的比较象,并且data文件为加密文件,打开并非明文。目录中a49qmws2k是用户ID标识,结合野火官方说客户端使用了SQLCipher保证数据安全,基本确定就是这个目录中的内容。
notion image
但是通过反编译Java层逻辑并没有找到关于data文件的操作,通过Frida Hook全部Java层的文件操作方法都没监控到,就怀疑是写在native层里面的。
notion image
在arm64架构的动态链接库中找so,排除了bug报告相关的so,然后在每个so里面搜索Heartbeat.ini字符串,在libmarsstn.so中找到字符串,然后基本确定是在这个so中进行数据文件的操作。

2. Frida无法找到libmarsstn.so

找到so后,尝试使用frida去Hook里面的一些函数,但是又遇到了新的问题,frida压根没找到这个so。
notion image
后来发现问题在于如果只指定包名 frida默认Hook了主进程,但是实际这个so被net.wildfirechat.demo:marsservice 加载,PID为9312,直接指定PID即可。
notion image
notion image

0x02 SQLCipher加密数据库密钥逻辑

之后就可以重点分析这个so
用的腾讯的mars协议栈,稍微改了一下,源码:
proto
LeonDevLifeLogUpdated May 8, 2024
proto-firechat\mars\proto\src\business.cc 中存在数据库的密钥处理逻辑,总而言之就是拿到服务端传递回来的TokenAES_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
notion image
shared_prefs 目录下config.xml中可以找到对应用户ID和Token。
notion image
顺利获取解密密钥ce4a9ac0-6f51-4bb7-a84a-7bb9d529433c
notion image

0x03 Frida 验证

DB2::Open 中传参密钥,通过open db 等字符串定位编译的so中函数位置
notion image
Hook 0x1F08EC 偏移的函数,获取传入的参数,在一定偏移位置找到密钥
notion image

0x04 总结

💡
多进程时需要关注多个进程,一直找不到某个Module可能就在别的进程中。
 

0x05 参考

  1. https://wildfirechat.cn/
  1. https://www.cnblogs.com/WXjzc/p/17770436.html
 
Android环境下Seccomp对系统调用的监控2023AVSS-SELinux题目
  • Twikoo