淘宝x-sign算法解密分析(更新时间:2021-02-05)
大家都知道只要有了x-sign基本上所有事情都可以干,包括但不仅限于商品信息,商品评价,秒杀活动等等,不过秒杀限流 本文将演示如何获取淘宝商品评价+商品详情数据,以iphone12为例 https://detail.tmall.com/item.htm?id=630185566650 联系qq: 373550711
抓包分析
PS:xsign本质就是一种加签算法,通过hook该算法函数的入参,调用app的那段函数就可以得到准确的xsign 通过frida禁用协议+charles手机抓包分析得出评价接口xsign入参为如下几个: p1={data={"rateType":"","invokeSource":"4","hasPic":"1","foldFlag":"0","feedId":"1108070939471","pageNo":"1","pageSize":"10","rateSrc":"shoutao_rate_list","auctionNumId":"630185566650"}, deviceId=Ak5K550JkQAibiGRVfZzeX-LaVcNIbNi51M4pj0oz3jZ, sid=null, uid=null, x-features=27, appKey=21646297, api=mtop.taobao.rate.detaillist.get, utdid=X2vcywc0ukgDAD8+h10j3jml, extdata=openappkey=DEFAULT_AUTH, ttid=1582098638365@taobao_android_9.13.0, t=1605765273, v=5.0} p2={pageId=http://a.m.taobao.com/i624453894663.htm, pageName=com.taobao.android.detail.wrapper.activity.DetailActivity} p3=21646297 请求头(最重要的x-sign) 'headers': {'content-type': 'application/x-www-form-urlencoded;charset', 'f-refer': 'mtop', 'user-agent': 'MTOPSDK%2F3.1.1.7+%28Android%3B9%3BXiaomi%3BMIX+2S%29', 'x-app-conf-v': '0', 'x-app-ver': '9.13.0', 'x-appkey': '21646297', 'x-bx-version': '6.5.16', 'x-c-traceid': 'X2vcywc0ukgDAD8%2Bh10j3jml16057652736450339123225', 'x-devid': 'Ak5K550JkQAibiGRVfZzeX-LaVcNIbNi51M4pj0oz3jZ', 'x-extdata': 'openappkey%3DDEFAULT_AUTH', 'x-features': '27', 'x-mini-wua': 'HHnB_nb7saH8meeuGZ22YP9eD5Jdk2GZ681fhshSpO6rBVSyW76dan0lU3sb%2ByKBIOi7eHNk2j%2BUmeqljW0cFG3F0CH6F0lY00PGMwyh0lvWGKgyXWPsWiyQMIoECnt2mjrlH', 'x-nettype': 'WIFI', 'x-nq': 'WIFI', 'x-page-name': 'com.taobao.android.detail.wrapper.activity.DetailActivity', 'x-page-url': 'http%3A%2F%2Fa.m.taobao.com%2Fi624453894663.htm', 'x-pv': '6.3', 'x-region-channel': 'CN', 'x-sgext': 'JAEFI9jm/p560cY6yrT9OCM0EzUQNAA3EDwXJhow', 'x-sign': 'azYBCM003xAAIg9q8KVhOkzwXxhakg9iCGBEB/j8wEtdOtvUYsa8yQ/97DVSmGhGPzp4hMR7cFXUKCtuX1NL1q4mrvkOcg9iDnIPYg', 'x-t': '1606125047', 'x-ttid': '1582098638365%40taobao_android_9.13.0', 'x-umt': 'MWtLfFRLOqR0SDV186xbDupvt0NoSOr8', 'x-utdid': 'X2vcywc0ukgDAD8%2Bh10j3jml'} 'url': 'https://guide-acs.m.taobao.com/gw/mtop.taobao.rate.detaillist.get/5.0/?data=%7B%22rateType%22%3A%22%22%2C%22invokeSource%22%3A%224%22%2C%22hasPic%22%3A%221%22%2C%22foldFlag%22%3A%220%22%2C%22feedId%22%3A%221102301773012%22%2C%22pageNo%22%3A%221%22%2C%22pageSize%22%3A%2210%22%2C%22rateSrc%22%3A%22shoutao_rate_list%22%2C%22auctionNumId%22%3A%22602214990823%22%7D' 将以上参数关键数据进行更改,例如商品id: auctionNumId、 t:时间戳 frida+rpc远程调用函数传参获得加密后的结果 sign_res: {'x-t': '1606125047', 'x-sgext': 'JAEFI9jm/p560cY6yrT9OCM0EzUQNAA3EDwXJhow', 'x-sign': 'azYBCM003xAAIg9q8KVhOkzwXxhakg9iCGBEB/j8wEtdOtvUYsa8yQ/97DVSmGhGPzp4hMR7cFXUKCtuX1NL1q4mrvkOcg9iDnIPYg', 'x-umt': 'MWtLfFRLOqR0SDV186xbDupvt0NoSOr8', 'x-mini-wua': 'HHnB_nb7saH8meeuGZ22YP9eD5Jdk2GZ681fhshSpO6rBVSyW76dan0lU3sb+yKBIOi7eHNk2j+UmeqljW0cFG3F0CH6F0lY00PGMwyh0lvWGKgyXWPsWiyQMIoECnt2mjrlH'}xsign入参说明
高版本xsign入参是5个,其中2个是固定值,所以只需要传3个参数即可,评价接口xsign入参示例:
p1={data={"rateType":"","invokeSource":"4","hasPic":"1","foldFlag":"0","feedId":"1108070939471","pageNo":"1","pageSize":"10","rateSrc":"shoutao_rate_list","auctionNumId":"630185566650"}, deviceId=Ak5K550JkQAibiGRVfZzeX-LaVcNIbNi51M4pj0oz3jZ, sid=null, uid=null, x-features=27, appKey=21646297, api=mtop.taobao.rate.detaillist.get, utdid=X2vcywc0ukgDAD8+h10j3jml, extdata=openappkey=DEFAULT_AUTH, ttid=1582098638365@taobao_android_9.13.0, t=1605765273, v=5.0}p2={pageId=http://a.m.taobao.com/i624453894663.htm, pageName=com.taobao.android.detail.wrapper.activity.DetailActivity}p3=21646297如有其他疑问,或者需要帮助的请联系qq: 373550711以上分析只是hook到了xsign加签函数的位置以及抓包请求参数,这部分其实很多博客都有分析,找出xsign位置并不难
但是关键点有两个
1、如何正确传参获取xsign,即构造上图p1、p2、p3等入参, 然后通过frida +rpc 远程调用加签函数生成xsign,其中pv6.2以上版本会有x-mini-wua、x-umt等参数
2、如何正确使用xsign获取数据,hook入参错误拿回错误的xsign或请求参数错误均会返回签名非法等提示
下图先放一个接口调用的demo运行结果示例
PV接口说明:
根据pv版本构造p1、p2、p3等xsign函数入参,p1、p2参数格式其实就是url编码后的json字符串,p3是bool类型,需要再次强调的是xsign本质只是一个加签算法,传什么参数是你应该知道的,生成的xsign怎么用也是自己应该去了解的,所以关于此接口若没有一定技术基础是不推荐使用和掌握的!pv接口需要接口测试联系Q:373550711, 不提供任何技术支持。
fetch_any接口说明:
此接口使用门槛就很低了,只要会抓包,抓包出的任何接口都有的data、api、v、pv等参数,其中data、api、v在url里,pv在headers里,然后调用normal/fetch_any即可返回携带xsign的headers和请求url,用postman就可以测试url和headers是否有效了,vip/fetch_any接口就是传参调用接口直接返回数据,使用更简单!fetch_any接口使用,这个也不需要啥技术支持吧,浏览器打开链接都能测,其中2个接口区别是vip接口集成特殊方式获取到限流接口数据,例: 商品详情、图文详情,不是所有噢!需要接口测试联系Q:373550711python 版本调用接口demo 代码
运行条件: python3 + requests 库
def test_all_api(): import json import requests from urllib import parse requests.packages.urllib3.disable_warnings() # 本地调用接口测试 host = 'http://127.0.0.1:7000' key = '2950c374b72817b7f187714b47a6d468f80e67c8bb9c7ca5' # 测试key, 有效期60分钟 # 远程调用接口测试+key获取 请联系 QQ:373550711 # 测试key有效期1小时 # 检验key剩余时间 url = f'{host}/judge_key?key={key}' print('*'*100) print('检验key剩余时间:') print(f'检验接口: {url}') resp = requests.get(url).text print(f'测试key返回示例: {resp}\n\n') # 注意点: p1 ,p2参数格式 : url编码的json字符串! #pv62 接口调用示例 p1 = {'data' : r'{"rateType": "", "invokeSource": "4", "hasPic": "1", "foldFlag": "0", "feedId": "1108070939471","pageNo": "1", "pageSize": "10", "rateSrc": "shoutao_rate_list", "auctionNumId": "630185566650"}', 'deviceId' : 'Ak5K550JkQAibiGRVfZzeX-LaVcNIbNi51M4pj0oz3jZ', 'x-features' : '27', 'appKey' : '21646297', 'api' : 'mtop.taobao.rate.detaillist.get', 'utdid' : 'X2vcywc0ukgDAD8+h10j3jml', 'extdata' : 'openappkey=DEFAULT_AUTH', 'ttid' : '1582098638365@taobao_android_9.13.0', 't' : '1605765273', 'v' : '5.0'} print('*'*100) print('pv62接口调用示例:') # 必传参数 p1 key url = f'{host}/pv62?p1={parse.quote(json.dumps(p1))}&key={key}' print(f'pv62接口: {url}') resp = requests.get(url).text print(f'pv62接口返回示例: {resp}\n\n') #################################################################################################################### # pv63 p2={'pageId':'http://a.m.taobao.com/i624453894663.htm', 'pageName':'com.taobao.android.detail.wrapper.activity.DetailActivity'} url = f'{host}/pv63?p1={parse.quote(json.dumps(p1))}&p2={parse.quote(json.dumps(p2))}&key={key}' # 必传参数 p1 p2 key print('*'*100) print('pv63接口调用示例:') print(f'pv63接口: {url}') resp = requests.get(url).text print(f'pv63接口返回示例: {resp}\n\n') #################################################################################################################### ip_port = 'no' # 参数为no返回headers,传自己代理(示例ip_port = '221.225.92.14:52310')直接返回数据 # 小评价数据测试 v = '4.0' api = 'mtop.taobao.rate.detail' # 请求淘宝的api接口 data = '{"feedId":"1077256700001","isEncode":"true"}' pv = '6.3' p2 = {"pageId": "http://a.m.taobao.com/i624453894663.htm", "pageName": "com.taobao.android.detail.wrapper.activity.DetailActivity"} url = f'{host}/normal/fetch_any?data={data}&api={api}&v={v}&pv={pv}&ip_port={ip_port}&p2={parse.quote(json.dumps(p2))}&key={key}' # 必传参数 data, api, v, pv, key # 只有pv=6.3 p2才必传 # 可选参数 sid, uid(登录信息) p2 # url = url + f'&uid={uid}&sid={sid}' print('*'*100) print('/normal/fetch_any接口调用示例:') print(f'/normal/fetch_any接口: {url}') resp = requests.get(url).json() print(f'/normal/fetch_any接口返回示例: {resp}') print('验证返回url和headers是否可用...') if resp.get('url', None): resp2 = requests.get(resp['url'],headers=resp['headers'],verify=False) print(f'验证结果返回:{resp2.json()}\n\n') #################################################################################################################### # 详情测试 破解部分限制接口 v = '6.0' api = 'mtop.taobao.detail.getdetail' data = '{"itemNumId":"624453894663"}' pv = '6.2' p2 = {"pageId": "http://a.m.taobao.com/i624453894663.htm", "pageName": "com.taobao.android.detail.wrapper.activity.DetailActivity"} # 必传参数 data, api, v, pv, key # 只有pv=6.3 p2才必传 # 可选参数 sid, uid(登录信息) p2 url = f'{host}/vip/fetch_any?data={data}&api={api}&v={v}&pv={pv}&key={key}' # url = url+f'&p2={parse.quote(json.dumps(p2))}' # url = url + f'&uid={uid}&sid={sid}' print('*'*100) print('/vip/fetch_any接口调用示例:') print(f'/vip/fetch_any接口: {url}') resp = requests.get(url).json() print(f'/vip/fetch_any接口返回示例: {resp}\n\n') # 代理测试接口 def test_proxies(): import requests # 测试自己代理是否可用的接口 ip_port = '180.113.61.223:44091' # 这里改自己代理ip端口 url = 'http://acs.m.taobao.com/gw/mtop.common.getTimestamp/' proxies = {'http':ip_port, 'https':ip_port} try: resp = requests.get(url, proxies=proxies, timeout=3).text print(resp) print('代理ok') except Exception as e: print(e) print('无效代理') if __name__ == '__main__': test_all_api()
技术支持 + 接口测试
联系qq: 373550711
