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 Jun 27, 2024
0x01 遇到的问题
1. 找聊天记录文件操作遇到问题
首先在数据目录下找疑似聊天记录的数据文件,只有files下面的比较象,并且data文件为加密文件,打开并非明文。目录中
a49qmws2k
是用户ID标识,结合野火官方说客户端使用了SQLCipher
保证数据安全,基本确定就是这个目录中的内容。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fed284a30-1f3b-4952-9045-ea90914aebdc%2FUntitled.png?table=block&id=6f9d7cae-2858-4f49-b678-7034cf617008&t=6f9d7cae-2858-4f49-b678-7034cf617008&width=1705&cache=v2)
但是通过反编译Java层逻辑并没有找到关于
data
文件的操作,通过Frida Hook全部Java
层的文件操作方法都没监控到,就怀疑是写在native
层里面的。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fddaa00f0-dff4-48f6-a4bb-36c00c467c92%2FUntitled.png?table=block&id=fa238812-604b-4cea-868a-2e3944522712&t=fa238812-604b-4cea-868a-2e3944522712&width=1476&cache=v2)
在arm64架构的动态链接库中找so,排除了bug报告相关的so,然后在每个so里面搜索
Heartbeat.ini
字符串,在libmarsstn.so
中找到字符串,然后基本确定是在这个so中进行数据文件的操作。2. Frida无法找到libmarsstn.so
找到so后,尝试使用frida去Hook里面的一些函数,但是又遇到了新的问题,frida压根没找到这个so。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2F64655e93-66b0-4fc9-87e2-84af986952e0%2FUntitled.png?table=block&id=904dce71-7e02-48b2-a64b-40e6221c146c&t=904dce71-7e02-48b2-a64b-40e6221c146c&width=581&cache=v2)
后来发现问题在于如果只指定包名 frida默认Hook了主进程,但是实际这个so被
net.wildfirechat.demo:marsservice
加载,PID为9312,直接指定PID即可。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2F760974b7-7a3b-4530-a496-d2c8d0f33989%2FUntitled.png?table=block&id=94b4c2d0-67db-4410-bcfe-b8bdb40810a7&t=94b4c2d0-67db-4410-bcfe-b8bdb40810a7&width=1255&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fc889adbd-4002-4c05-85a7-1ddbb3e344d0%2FUntitled.png?table=block&id=09826e3b-5ede-4f91-b637-07dc99597db0&t=09826e3b-5ede-4f91-b637-07dc99597db0&width=1088&cache=v2)
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
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2F419267d7-6147-4a11-a619-f5d0074d771e%2FUntitled.png?table=block&id=f71b3b89-9c21-40fd-ab58-2f09fb6852c6&t=f71b3b89-9c21-40fd-ab58-2f09fb6852c6&width=2542&cache=v2)
在
shared_prefs
目录下config.xml
中可以找到对应用户ID和Token。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fce3e7ff0-bc8f-47c2-ae2f-299373f96003%2FUntitled.png?table=block&id=5287a33b-ed83-463d-8a44-00175103c70e&t=5287a33b-ed83-463d-8a44-00175103c70e&width=2119&cache=v2)
顺利获取解密密钥
ce4a9ac0-6f51-4bb7-a84a-7bb9d529433c
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Feec36c58-e1ba-49d2-a3d0-efeec1ae7bbc%2FUntitled.png?table=block&id=382f61a3-e6a9-4c42-81fd-1ab5d1cb3006&t=382f61a3-e6a9-4c42-81fd-1ab5d1cb3006&width=3077&cache=v2)
0x03 Frida 验证
在
DB2::Open
中传参密钥,通过open db
等字符串定位编译的so中函数位置![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fcf057ce2-f0d5-47f2-a17d-a77bbf02f969%2FUntitled.png?table=block&id=be594636-ab52-4d6c-ad0f-14f7cba96e22&t=be594636-ab52-4d6c-ad0f-14f7cba96e22&width=1589&cache=v2)
Hook
0x1F08EC
偏移的函数,获取传入的参数,在一定偏移位置找到密钥![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F3d9d581b-1cbe-449e-9723-f2162662aa76%2Fe0c20715-4680-4882-83c7-32bbae6d2754%2FUntitled.png?table=block&id=795ff3ad-8de3-4117-815d-33fca6c112de&t=795ff3ad-8de3-4117-815d-33fca6c112de&width=1766&cache=v2)
0x04 总结
多进程时需要关注多个进程,一直找不到某个Module可能就在别的进程中。
0x05 参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/wildfire%20IM%20APP
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章