首页
社区
课程
招聘
WhatsApp私信协议实现记录
发表于: 2022-8-24 15:53 54265

WhatsApp私信协议实现记录

2022-8-24 15:53
54265


      最近看了下WhatsApp (android及pc版本),实现了协议发送私信(模板信息也可以发), 记录下学习过程,技术交流用。



一、软硬件环境:

 

WhatsApp v2.22

IDA 7.5

Frida 14.2.2

Gda3.86

JEB

jadx-gui

unidbg

LineageOs 17.1 (android 10)

小米8

 

二、流水账 

    

        刚开始了解了下WhatsApp,说是消息端对端加密的,信息只能双方解密,服务器都不知道的,初始看了一脸懵,在网上找了下资料:

        

      【翻译】WhatsApp 加密概述(技术白皮书)

        http://www.caotama.com/1993224.html

        WhatsAPP通讯协议端对端加密人工智能

        https://blog.csdn.net/BMW33939/article/details/120322512

        Signal 协议 

        https://blog.csdn.net/yzpbright/article/details/117808556


        不过看这些资料其实有点尴尬,刚开始不知道的时候,看这些也看不懂,各种密钥概念,加密过程直接绕晕了,等开始分析app,能看懂的时候,

        发现也搞完了,回过头来看,确实上面写的(特别是白皮书)都是对的,只是初始不了解的时候理解不了,毕竟上面文章不是实操流程。


        首先看下数据流,确定下网络传输方式,结合Wireshark,通过hook及下断点等方式确定了是TCP:


查了下IP:157.240.199.61香港 Facebook


知道发送点后,再结合JNI函数(根据名称就可以确定重要的模块libwhatsapp.so,libcurve25519.so),逐步确定调用线。

看到上面so的名称,查了下知识点:

Curve25519 是目前最高水平的 Diffie-Hellman 函数,适用于广泛的场景,由 Daniel J. Bernstein 教授设计。

在密码学中,Curve25519 是一个椭圆曲线提供 128 位安全性,

设计用于椭圆曲线 Diffie-Hellman(ECDH)密钥协商方案。它是最快的 ECC 曲线之一,并未被任何已知专利所涵盖。



libcurve25519.so boolean org.whispersystems.curve25519.NativeCurve25519Provider.smokeCheck(int) 0x9d782548 func: 0x78b8406288 0x0  iOffset: 4288

libcurve25519.so byte[] org.whispersystems.curve25519.NativeCurve25519Provider.generatePrivateKey(byte[]) 0x9d782638 func: 0x78b8405a2c 0x0  iOffset: 3a2c

libcurve25519.so byte[] org.whispersystems.curve25519.NativeCurve25519Provider.calculateAgreement(byte[], byte[]) 0x9d7825c0 func: 0x78b8405b68 0x0  iOffset: 3b68



生成密钥:

retval: [object Object]

java.lang.Exception

        at org.whispersystems.curve25519.NativeCurve25519Provider.generatePublicKey(Native Method)

        at org.whispersystems.curve25519.OpportunisticCurve25519Provider.generatePublicKey(:750206)


找到了发送信息的明文("11"):

[MI 10::com.whatsapp]-> byteArray,byte src : [10,2,49,49]        protobuf格式

byteArray,md5str:

11

java.lang.Exception

        at X.1FH.A02(Native Method)

        at com.whatsapp.jobqueue.job.SendE2EMessageJob.writeObject(:271863)

        at java.lang.reflect.Method.invoke(Native Method)



顺着流程,会发现很多加密相关类的调用:

java.security.MessageDigest

javax.crypto.Mac

javax.crypto.Cipher


可以直接hook了看数据流的变化,这个时候对加密模式就有了一定了解:

客户端跟服务器有一个加密方式AES-256-GCM,每个包的加密IV都不同,如果发送的数据包是私信内容的,

那里面的私信内容是第二层的加密(aes-256-cbc),这一层的数据因为key的生成用到了对方的公钥做DH得到,

所以只能接收方才能解密,每条私信内容加密的key也是不同的。


每次打开app都会重新发起TCP连接(已经是用验证码登录的情况,后续的打开app),

这个时候要初始化一对密钥,公钥会在连接建立后的第一个发送包中包含,发给服务器。

这里还会用到其它几种密钥(自己的identity_key,标记登录会话类似抖音session token的key,服务器的公钥),这些key相互组合通过calculateAgreement

及HKDF扩展得到中间数据和密钥,包括用来加密下面的数据,

第一个发送包中包含有手机环境信息:

这个数据校验通过后,就是连接正常建立了,后面就可以发送私信了。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 21
支持
分享
打赏 + 200.00雪花
打赏次数 2 雪花 + 200.00
 
赞赏  纪元   +150.00 2022/11/19 可以加个联系方式一起学习吗。wx:kouhong-7777
赞赏  Editor   +50.00 2022/09/01 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (52)
雪    币: 41
活跃值: (86)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
pc端electron写的,可以自己整个二次开发环境调试主进程和渲染进程
2022-8-24 17:20
0
雪    币: 6070
活跃值: (5025)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢楼主分享
WhatsApp具体版本号可以说下嘛?v2.22是大版本号
此外,图片有点模糊
2022-8-24 20:41
0
雪    币: 3043
活跃值: (6786)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
只要能弄好这方面的需求很多, 尤其是海外电商...
2022-8-25 06:03
0
雪    币: 3227
活跃值: (3207)
能力值: ( LV7,RANK:111 )
在线值:
发帖
回帖
粉丝
5
感谢分享,重点来了如何突破发送任意条数讯息,搞定就GG了
2022-8-25 08:55
0
雪    币: 3237
活跃值: (6944)
能力值: ( LV13,RANK:409 )
在线值:
发帖
回帖
粉丝
6
mb_rjdrqvpa 感谢楼主分享 WhatsApp具体版本号可以说下嘛?v2.22是大版本号 此外,图片有点模糊
v2.22.15.71
2022-8-25 08:55
0
雪    币: 3237
活跃值: (6944)
能力值: ( LV13,RANK:409 )
在线值:
发帖
回帖
粉丝
7
ArmVMP 感谢分享,重点来了如何突破发送任意条数讯息,搞定就GG了
一看大佬发的,就是深入参与了业务的,介绍下经验啊
2022-8-25 09:01
0
雪    币: 98
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
不错呀兄弟
2022-8-25 10:47
0
雪    币: 409
活跃值: (1536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我还以为wechat呢,在国内环境官方不能查看明文是不可能的,分分钟下达整改通知书
2022-8-25 12:25
0
雪    币: 3043
活跃值: (6786)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mb_dtimafsn 兄弟们怎么才能私聊
点击用户名然后在右上角有私聊按钮
2022-8-25 12:34
0
雪    币: 2709
活跃值: (1637)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
海外的  很多用Curve25519 
2022-9-5 17:55
0
雪    币: 143
活跃值: (493)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大佬有空能分析下拉群和发消息吗?
2022-9-5 20:52
0
雪    币: 1
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
出全套协yi
2022-9-5 23:50
1
雪    币: 246
活跃值: (398)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢分享
很有趣的内容 
2022-9-13 19:18
0
雪    币: 3237
活跃值: (6944)
能力值: ( LV13,RANK:409 )
在线值:
发帖
回帖
粉丝
15
lvcoffee 大佬有空能分析下拉群和发消息吗?
拉群和发群信息其实套路类似的,初始的密钥设置有点不同,群这个是发送者对其它成员发送senderkey相关信息,不同人用的加密key都不同,后续的具体信息直接就可以用senderkey扩展出的key加密发送了,第一条信息可以跟上面key交换信息一起发出去。
其它操作的套路都差不多,顺着数据流来就可以搞清楚。
2022-9-17 11:17
1
雪    币: 207
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
风控封号才是最蛋疼的
2022-9-17 16:01
0
雪    币: 0
活跃值: (396)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习 学习
2022-9-21 15:21
0
雪    币: 2484
活跃值: (3182)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
有研究line的吗、、交流交流
2022-10-17 10:27
0
雪    币: 171
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
熊猫吃鱼 有研究line的吗、、交流交流
老板怎么联系,一起研究line
2022-12-31 18:48
0
雪    币: 58
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
怎么联系?
2023-1-8 16:36
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21
怎么联系老哥啊
2023-1-17 00:56
0
雪    币: 2484
活跃值: (3182)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
五毛 老板怎么联系,一起研究line
私信
2023-2-5 13:21
0
雪    币: 296
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
有大佬或者一起研究抖音算法的吗,可以一起交流
2023-2-18 16:26
1
雪    币: 7073
活跃值: (3341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
数字信封技术吧
2023-2-18 16:52
0
雪    币: 218
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
xunilm [em_39]出全套协yi
怎么出,我要
2023-2-23 00:15
0
游客
登录 | 注册 方可回帖
返回
//