酷狗概念版signature逆向

概述

使用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()

7、运行结果

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值