本文案例是对小红书小程序的x-sign参数分析,文章内容仅用于学习和技术交流,如有侵权请联系我删除。
小程序如何反编译不具体说了
参数定位
之前通过开发者工具查询关键词找到了包含X-sign的JS文件,这里直接查看xsign.js文件。
DEFAULT_SIGN_HEADER = X-Sign
继续搜素DEFAULT_SIGN_HEADER
发现 header[_feApiSign.DEFAULT_SIGN_HEADER] = (0, _feApiSign.encryptFeApiToken)(feApiConfig);
也就是说headers中的X-Sign = (0, _feApiSign.encryptFeApiToken)(feApiConfig);
先查看encryptFeApiToken方法。
function encryptFeApiToken(config) {
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_SIGN_VERSION;
var _config$url = config.url, url = _config$url === undefined ? '' : _config$url;
var params = config.params, _config$transform = config.transform,
transform = _config$transform === undefined ? false : _config$transform;
url = url.slice(url.indexOf(DEFAULT_SIGN_API_PATH), url.length);
var queryString = '';
if (params) {
queryString = getQueryByParams(params, transform)
}
queryString = queryString ? '?' + queryString : '';
if (version === DEFAULT_SIGN_VERSION) {
return '' + version + (0, _md2.default)(url + queryString + SECRET_KEY)
}
return ''
}
});
直接查看返回的地方,version + (0, _md2.default)(url + queryString + SECRET_KEY)
url是接口地址,queryString是请求参数,SECRET_KEY是"WSUDD"
因为 version === DEFAULT_SIGN_VERSION才会执行,所以version 就是 "X"。
_md2是引入的md5方法。
那么这一块便是生成X-sign的位置了。
另外在JS中,(0, function)这种表达式可看做(true && function)或(0 ? 0 : function)
这种调用方法可以让function在全局执行。
逻辑分析
根据: version + (0, _md2.default)(url + queryString + SECRET_KEY)
已经知道xsign是由 "X"+ MD5后的url+params+ "WSUDD"。
再细看一下encryptFeApiToken方法,其中url = url.slice(url.indexOf(DEFAULT_SIGN_API_PATH), url.length);
而DEFAULT_SIGN_API_PATH = '/fe_api/'
意思是把在url中找到 '/fe_api/'出现的位置,然后slice去截取该段字符串,等于去掉了 /fe_api/ 之前的字符。
而queryString大概一看就能明白是把请求的参数拼接成字符串。
所以最后的逻辑就是 :
当收到请求url为:https://www.xiaohongshu.com/fe_api/burdock/weixin/v2/notes/61238b740000000021037d94/comments
请求参数为: { "pageSize" : 10 ,"endId" : 0}
则先把 url 转成 /fe_api/burdock/weixin/v2/notes/61238b740000000021037d94/comments?
然后把参数转成 pageSize=10&endId=0 ,再和WSUDD一块进行拼接。
最后把拼接的字符串md5加密,然后再加上X
所以最终的x-sign是 : X+md5( "/fe_api/burdock/weixin/v2/notes/61238b740000000021037d94/comments?pageSize=10&endId=0")
这边可以用在线网站生成一下和抓到的包进行对比,返现结果一致。
接下来可以进行代码还原了。
加密还原
用python代码进行还原:
【温馨提示:此处隐藏内容需要付费订阅后才能查看!】
备注
authorization需要抓包获得。可查看下图:(频繁采集非常容易被封号,且行且珍惜)