由于网站无法上传附件,本帖子完整内容请点击此处
首先,从coco.apk提取dex文件,利用dex2jar将dex转化为jar,拖到jd-gui中,发现有如下几个可疑点:
com.azus.android.tcplogin.CryptUtil.rsaEncrypt
com.azus.android.tcplogin.CryptUtil.aesDecrypt
com.azus.android.tcplogin.CryptUtil.aesEncrypt
com.azus.android.tcplogin.CryptUtil.getRSAPublic
接下来,使用XPOSED框架,编写hook代码并输出日志,同时用wireshark抓包,最终得出如下加解密逻辑:
(1)客户端生成一个随机16位uuid(在com.instanza.cocovoice.bizlogicservice.b,com.instanza.cocovoice.bizlogicservice.impl,com.instanza.cocovoice.httpservice.d等类中均有此接口)
(2)客户端从安装程序的assets目录下读取rsapubkey.dat文件,并把文件内容当做rsa公钥加密上述16字节的uuid
Rsa公钥为:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv6wVtSeHU8gJWchcFfe4
qu9JNqDrPLBSfDwZ4NW9f+Qp5OI3FAsd19r5FM95wzdTPb6k/tTDnsPkdnTiEwTI
28PYffP/87BIraQrcgCWmbpugZ0l892LFUYweepp/R54OAlTaPLHMcaHxLnWX3Fq
wghOAjCNvAnXC3TWNJJnlHJ5e32n22nPMdCMNzwXV+zHHP+0sJyBQJd8yoBFFLh+
AZwy/F1xFkAWl9r3emdKhSIpPpT4nTEVD1ieGnMq5DxGPNpihP6jbZOI3UEwOTki
wpdOdR5j9lfe5tRis7pGyPHj+IOHzXRsZGC4r5xEhOKiCOckWJPVgCJWS3ruy5xJ
nwIDAQAB
-----END PUBLIC KEY-----
(3)构造登录包。此数据包分成三个部分:
包头;ras公钥加密后的密钥(即16字节的uuid,此密钥是一个aes密钥); 客户端用aes密钥(uuid)和aes算法加密后的用户登录信息(其中也包含上述uuid)。
此程序的服务器端口是tcp 1088(有时也会使用443等端口),登录数据包如下所示:
可以看出,此数据包第20字节开始是”qauth”字符串。
整个数据包可分为如下几个部分:从开头到12 80 02的部分是第一部分,从12 80 02到1a d0 02是第二部分,从1a d0 02开始到20 01 2a的是第三部分。剩下的包尾的是第4部分。第一部分字段暂时未详细研究;第二部分是用rsa公钥加密uuid后的数据值;第三部分是用aes算法和密钥uuid加密后的客户端登录信息;第四部分是用户登录信息段中的deviceid字段和publickey的md5值。整个结构应该是tlv结构来表示的,具体的的字段含义未分析。
以下是客户登录信息加密前的信息,其中划红线的正好是aes加密的密钥,这样数据包解密之后,可以用本字段验证aes加解密的结果是够正确。
如此来说,本程序的破解流程应该是,接收到登录数据包后,先用服务器端的rsa私钥解密出上图第2部分的值,解密结果是一个aes密钥,然后用此aes密钥解密上图中第二部分的登录信息,至此数据包解密完毕。另外值得一提的是,该aes密钥是本次用户和服务器之间所有的文本、语音、图片等通信数据的密钥。
以下是程序的核心加解密算法反编译源码:
通过xposed对以上函数的hook输出,可以看到客户端输入的文本、发送的图片和语音(以0x789c开头的zlib压缩数据),通过以上几个函数加密,变成数据包中的数据的过程。
比如发送消息nihao之后的加密过程:
“nihao”加密后的数据包:
本程序样本、Xposed测试源码和日志输出、数据包都在附件中。