一个音乐app的逆向分析 这个App主要是用来听歌的并且支持下载QQ音乐和网易云的无损音乐,由于想在每个客户端方便的听歌,而且还不需要开会员,就想在网上找类似的网站,偶然间发现了这个App,但是我总不可能在电脑上开模拟器用这个软件吧,于是就有了接下来的事。偷 (借)接口
第一步:分析一下APK 对于这类软件,作者一般是会保护一下源代码的,打开MT发现果然加固了
得,先用抓包工具看看有没有有用的数据包
第二步:抓包
很容易就发现了数据就i在这个接口里获取的,那么只需要分析一下请求头信息就好了
将数据导出到ApiFox里
不难发现,这三个参数就是关键信息,都是经过加密的了,那么下一步就要获取加密前的内容和加密方式
第三步:分析加密接口参数 启动算法助手,搜索字符串
请求参数里的sing是用字符串
1 {"act" :"search" ,"type" :"qq" ,"keywords" :"%E5%91%A8%E6%9D%B0%E4%BC%A6" ,"keytype" :"0" }
加密而来的,lv是确定的,加密密钥是通过其他文本加密的,现在搜索一下这个密钥
很明显是由搜索关键字加上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 base64from Crypto.Cipher import AESclass 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)
成功获取到加密后的数据,其他的数据也是类似的方式获取
第四步:编写测试接口获取数据
成功获取到搜索的歌曲信息,那么接下来就简单了
歌曲的播放链接获取也是同理,传入的加密前的参数有些许变化
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
编写代码批量下载,完事!
考虑到接口滥用,需要代码学习 评论我发你邮箱