MPASS 协议大致分析
MPASS 协议大致分析
mPaaS. 移动开发平台(Mobile PaaS,简称mPaaS)是源于支付宝App 的移动开发平台,为移动开发、测试、运营及运维提供云到端的一站式解决方案
1.请求分析
流量大致为:请求参数->gzip压缩-> aes加密请求参数(rsa加密aes密钥)
1.压缩算法
使用python默认解压算法是可以解压的
压缩之后的字节头不一样
1f8b0800533bd36402ff33340200cd44534f02000000
1f8b080000000000021333340200cd44534f02000000
1f8b0800533bd36402ff是python gzip压缩信息 13加密使用信息
文件头必选部分(前10个字节)
前10个字节是必选的文件头部分
bytes[0-1]: 文件标识符 0x1f, 0x8b
bytes[2]: 压缩格式,取值说明(常用: 8-deflate类型)
0-Store存储不压缩
1-compress压缩
2-pack打包
3-lzh使用lzh算法压缩
4…7-保留reserve
8-deflate使用deflate算法压缩data部分
bytes[3]: flags-字节中共有8比特,每个比特代表不同含义
0b00000001-压缩文件可能为文本格式
0b00000010-拆分多个压缩文件的其中一个部分,存在当前部分的序号
0b00000100-文件头中包含附加字段extra field.
0b00001000-文件头中包含文件名file name.
0b00010000-文件头中包含文件注释file comment.
0b00100000-文件是加密的,文件头中包含加密部分
0b11000000-6/7位保留reserve
bytes[4-7]: 文件的修改时间(unix格式-4字节)
bytes[8]: 附加flag(和bytes[2]压缩格式相关)
bytes[9]: 操作系统类型OS Type, 取值说明参见下面,常用的有0x00-Windows,0x03-Unix/Linux
2.加密分析
var ***className*** = "DTURLRequestOperation";
var ***funcName*** = "- addHTTPBodyParameter:forKey:";
通过hook上边代码可以直接分析到数据包加密点,进一步使用trace
frida-trace -FU -m "*[DTR* *]”
可以明显看到有压缩和判断加密的地方
在进一步trace frida-trace -FU -m "+[DTRpcUtils compressGZip:]"
压缩定位到
通过分析代码也可以大致看到
继续调用栈到加密调用地方-[DTURLRequestOperation gzipAndEncrypt:]
进一步追踪,最后太明显。
通过上述可以解密了。
固定密钥之后,抓包并进行解密
红色为加密长度!绿色为密文
解密OK!!
请求解密
data = bytes.fromhex(data)
key_enc_type = bytes.fromhex(ss)[:1]
print(key_enc_type)
key_len = int.from_bytes(bytes.fromhex(ss)[1:4], byteorder='little')
print(key_len)
key = bytes.fromhex(ss)[4:4 + key_len]
print(key.hex())
data_enc_type=bytes.fromhex(ss)[4 + key_len:4 + key_len+1]
print(data_enc_type.hex())
data_len = bytes.fromhex(ss)[4 + key_len+1:4 + key_len+1+3]
print(data_len.hex())
data = bytes.fromhex(ss)[4 + key_len+1+3:]
print(data.hex())
2.响应分析
1.解密分析
流量全程使用二进制传输,通过请求中的tracefrida-trace -FU -m "+[DTRpcUtils decompressGZip:]"
分析到解密在-[DTURLRequestOperation gunzipAndDecrypt:]
并且使用请求中生成加密的16位密钥,先固定固定密钥
var funcName1 = "+ generateRandom:";
var hook1 = eval('ObjC.classes.' + className1 + '["' + funcName1 + '"]');
Interceptor.attach(hook1.implementation, {
onEnter: function (args) {
}, onLeave: function (retval) {
var new_data = 'RE5EszOVJ9GVFLY3'
var new_ret = ObjC.classes.NSString.stringWithString_(new_data);
retval.replace(new_ret);
}
});
经过进一步追踪到这里,然后就很搞定了。
经过抓包之后解密一个响应:
成功!!!
本文系作者 @吾爱小白 原创发布在 我的编程学习之路。未经许可,禁止转载。