一个简单音乐软件的逆向

一个音乐app的逆向分析

这个App主要是用来听歌的并且支持下载QQ音乐和网易云的无损音乐,由于想在每个客户端方便的听歌,而且还不需要开会员,就想在网上找类似的网站,偶然间发现了这个App,但是我总不可能在电脑上开模拟器用这个软件吧,于是就有了接下来的事。(借)接口

第一步:分析一下APK

对于这类软件,作者一般是会保护一下源代码的,打开MT发现果然加固了

image-20240525135142134

得,先用抓包工具看看有没有有用的数据包

第二步:抓包

image-20240525140906097

很容易就发现了数据就i在这个接口里获取的,那么只需要分析一下请求头信息就好了

将数据导出到ApiFox里

image-20240525141503577

不难发现,这三个参数就是关键信息,都是经过加密的了,那么下一步就要获取加密前的内容和加密方式

第三步:分析加密接口参数

启动算法助手,搜索字符串

image-20240525141857295

image-20240525141942344

请求参数里的sing是用字符串

1
{"act":"search","type":"qq","keywords":"%E5%91%A8%E6%9D%B0%E4%BC%A6","keytype":"0"}

加密而来的,lv是确定的,加密密钥是通过其他文本加密的,现在搜索一下这个密钥

image-20240525142258988

很明显是由搜索关键字加上0 + qq + 7c1a11ed25a53751710b51123a4fdc6a组成的字符产的md5值

因为这个软件有QQ和网易两个接口,所以网易接口的应该就是中间的qq变成了wy

很轻松的获取到了全部的参数

1
2
3
4
key = "8FC785DF03E03D12CBA398BDF36CB3F0"
data = '{"act":"search","type":"qq","keywords":"%E5%91%A8%E6%9D%B0%E4%BC%A6","keytype":"0"}'
lv = 'k1y2a3b4r5t6c7q7'

然后用python编写加密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import base64
from Crypto.Cipher import AES


class PrpCrypt(object):
def __init__(self, key):
self.key = key.encode('utf-8')
self.mode = AES.MODE_CBC
self.iv = 'k1y2a3b4r5t6c7q7'.encode('utf-8')

def encrypt(self, text):
text = text.encode('utf-8')
cryptor = AES.new(self.key, self.mode, self.iv)
length = 16
count = len(text)
if count < length:
add = (length - count)
text = text + ('\0' * add).encode('utf-8')
elif count > length:
add = (length - (count % length))
text = text + ('\0' * add).encode('utf-8')
self.ciphertext = cryptor.encrypt(text)
return self.ciphertext.hex()

def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
plain_text = cryptor.decrypt(base64.b64decode(text))
return plain_text


if __name__ == '__main__':
pc = PrpCrypt('5BFDBE2A394F3ADFBDEC604BC39E5206')
e = pc.encrypt('{"act":"search","type":"qq","keywords":"%E5%91%A8%E6%9D%B0%E4%BC%A6","keytype":"0"}')
print(e)

image-20240525143714156

成功获取到加密后的数据,其他的数据也是类似的方式获取

第四步:编写测试接口获取数据

image-20240525144123553

成功获取到搜索的歌曲信息,那么接下来就简单了

image-20240525144858221

歌曲的播放链接获取也是同理,传入的加密前的参数有些许变化

1
2
搜索的JSON:{"act":"search","type":"qq","keywords":"%E5%91%A8%E6%9D%B0%E4%BC%A6","keytype":"0"}
获取播放链接的JSON:{"act":"musicurl","type":"qq","songid":"0039MnYb0qxYhV","strmid":"002202B43Cq4V4","file":"128"}

其中file的值是决定获取到的音质,标准:file = 128 高品:file = 320 无损:file = sq

image-20240525172030902

编写代码批量下载,完事!

考虑到接口滥用,需要代码学习 评论我发你邮箱