概述
使用frida工具,浅浅研究一下app逆向吧,这个案例算是入门级别没啥难度。
Charles抓包工具抓包分析发现,在请求头有一个signature参数且长度为32,猜想大概率是md5加密,那么印证下结果是否正确
Frida
使用的设备是iOS,数据线时断时续的。这里采用局域网的方式进行连接
1、通过ssh开启手机的frida-server服务
0.0.0.0 代表接受所有ip的转发。如上图,代表着frida-server服务已经开启。
2、通过frida命令获取app的pid
-H Host,连接到主机上的远程frida服务器
-a 表示app,显示所有运行的app
获取到酷狗概念版的pid 19478
3、frida-trace跟踪“CC_MD5”函数
官方的CC_MD5.js文件过于简单,这里做了简单的修改,并能返回入参和与此对应的md5加密后的结果
onEnter(log, args, state) {
var md5_data = args[0].readUtf8String();
console.log("MD5 - 参数值:")
console.error(md5_data)
},
onLeave(log, retval, state) {
var md5_digest = hexdump(retval,{length:16})
var hexfied = " ";
var raw_array = md5_digest.split("\n");
for (var a = 0; a < raw_array.length;a++) {
var line_array = raw_array[a].split(" ");
for (var b = 0; b < line_array.length;b++) {
if(line_array[b].length === 2) {
hexfied += line_array[b];
hexfied = hexfied.trim()
}
}
};
console.log("MD5 - 返回值:");
console.error(hexfied + "\n");
}
重新刷新app首页,获取新的signature
4、验证猜想
并在终端输出的结果中查找抓包中的signature的值,发现确实是使用了md5加密
入参:
ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
appid=3114
card_rank=3007,3014,3101,3001,3006,3102,3004,3005,3103,3104
card_size=3
clienttime=1726131910
clientver=11900
dfid=3dv3PB1sfnol1s9NI216OlHw
mid=d05348844bbbf60056b157aa643e15a182907550
token=0
userid=0ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
现在分析哪些是常量,哪些是变量,简单且实用的办法(多次刷新)
新的入参:
ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
appid=3114
card_rank=3007,3014,3101,3001,3006,3102,3004,3005,3103,3104
card_size=3
clienttime=1726132183
clientver=11900
dfid=3dv3PB1sfnol1s9NI216OlHw
mid=d05348844bbbf60056b157aa643e15a182907550
token=0
userid=0ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
5、文件比对
分析结果:
只有clienttime是个变量,(时间戳);
其它的都是常量,部分常量在请求头中体现
接口参数:
appid=3114&card_rank=3007%2C3014%2C3101%2C3001%2C3006%2C3102%2C3004%2C3005%2C3103%2C3104&card_size=3&clienttime=1726132183&clientver=11900&dfid=3dv3PB1sfnol1s9NI216OlHw&mid=d05348844bbbf60056b157aa643e15a182907550&token=0&userid=0&signature=1e2d007687e7d797b7cdd119a4fe1f9d
md5加密参数:
ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUbappid=3114card_rank=3007,3014,3101,3001,3006,3102,3004,3005,3103,3104card_size=3clienttime=1726132183clientver=11900dfid=3dv3PB1sfnol1s9NI216OlHwmid=d05348844bbbf60056b157aa643e15a182907550token=0userid=0ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
salt = ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb
由此signature = md5(salt + 请求参数 + 时间戳 + salt)
6、算法实现
在Charles,复制curl命令时,会出现--data-binary字样。需要将其转成hex,再转码成base64.防止python读取二进制报错
'Content-Encoding': 'gzip'
必须保留,不然会提示body解析错误
import hashlib
import time
import requests
from urllib.parse import urlencode
import base64
headers = {
'Host': 'gateway.kugou.com',
'Content-Encoding': 'gzip',
}
def md5_encrypt(text):
# 创建一个MD5对象
md5 = hashlib.md5()
# 更新MD5对象,必须将输入数据编码为字节类型
md5.update(text.encode('utf-8'))
# 获取MD5哈希值(以十六进制格式表示)
md5_hash = md5.hexdigest()
return md5_hash
def request_url(url,params):
base64_data = "bae64编码字符串"
decoded_data = base64.b64decode(base64_data)
res = requests.post(url,params = params,data=decoded_data,headers = headers).json()
print(res)
def main():
url = 'https://gateway.kugou.com/card/v1/pxy/youth_recommend'
params = {
'appid': '3114',
'card_rank': '3007,3014,3101,3001,3006,3102,3004,3005,3103,3104',
'card_size': '3',
'clienttime' : '1726131910',
'clientver': '11900',
'dfid': '3dv3PB1sfnol1s9NI216OlHw',
'mid': 'd05348844bbbf60056b157aa643e15a182907550',
'token': '0',
'userid': '0',
}
salt = "ovEFNp9SKfiU4IhZHPxpro0nnp0jLiUb"
# 将字典转换成指定格式的字符串
formatted_string = ''.join(f"{key}={value}" for key, value in params.items())
params['signature'] = md5_encrypt(salt + formatted_string + salt)
request_url(url,params)
if __name__ == '__main__':
main()