首页
社区
课程
招聘
[原创]某开源通讯软件view once图片的调用逻辑分析
发表于: 2天前 680

[原创]某开源通讯软件view once图片的调用逻辑分析

2天前
680

一开始直接用了burpsuit抓包,但是什么东西都没抓到,于是用netstat看了一下,再结合资料,发现用的是私有协议mtproto,所以burp抓不到东西。

直接用frida开始hook,虽然不太清楚具体的结构,但是可以先hook一些比较底层的函数,然后分析数据再把hook点一步步的网上移,最后挂到反序列化、解密操作之后的地方。

用脚本先Hook native里的以下函数:

这一步可以拿到fd, peer, ip:port, 收发方向, 包大小。

然后分析包的前十几个bytes,发现了疑似mtproto transport的类型。

例如:

这里看到的只是原始数据,是看不到明文的。

可以hook

在这里直接遍历

然后打印第一参数,也就是tl的请求对象:

在日志里就能够看到:

真正获取到明文消息的内容的位置是在

在这里只选择第一参数是:

的overload。
可以做个简单的逻辑判断:

然后调用

这里已经是 Telegram 客户端处理服务端更新的业务层了。也就是说:

在这里抓到的就不是密文了,而是java对象。

接下来需要做的是对updates.updates里的东西进行筛选:

如果发现有message字段,就进一步去尝试获取:

找到的最贴近聊天窗口的地方是在:

hook一下MessageObject的构造函数:

这个MessageObject是一个用的很多的消息包装对象,文本、图片、媒体状态都会被包成这个对象然后交给ui。

logMessageObject()主要功能是:

其中:
messageOwner 是原始 TLRPC$Message
messageText 是 UI 层处理后的文本
summarizeMessage(owner) 会继续解析消息、发送方、会话、媒体

所以这一步拿到的其实就是已经解密、反序列化之后的马上要给ui去用的明文消息。

大概的格式是这样的:

这里的ttl_seconds应该是这张图片过期的时间,2147483647是最大的int值。在app里处理的时候也有判断ttl_seconds == Interger.Max的,如果是那就说明这是一张view once图片;如果ttl_seconds > 0说明不是一张普通的图片;如果0 < ttl_seconds < Interger.Max那就计算其过期时间,时间到了就调用相应的销毁逻辑。

在找到以上信息之后,为了找到对应的图片处理逻辑,直接尝试hook了getPathToAttach这个函数。

每当从对话列表点到对话框里的时候,就会调用这个函数去加载照片。

对于普通的图片和阅后即焚的图片保存路径是不一样的,阅后即焚的照片保存路径在

并且不是以明文的形式保存的。通过对这个目录下的一些文件进行分析,发现文件名有点意思,可以看看:

除了开头的那个-之外,60709917428586295这一段相同,后面的结尾有点不同。

所以有理由相信,这些就是同一组照片在cache中的不同的派生文件,简单来说就是这是一起的。

所以接下来需要找的就是谁加载了这些文件,然后加载之后去了哪里,在哪里解密的?

为了找到是谁打开了这个.enc,在native层我hook了:

在java层hook了:

中的

还有

中的

最终确定了调用链:


[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回