概要
提示:仅供学习,不得用做商业交易,如有侵权请及时联系!
逆向:某查查网
URL:aHR0cHM6Ly93d3cucWNjLmNvbS8=
目的:获取请求头参数(加密key和val)
整体架构流程
提示:分析-调试-猜想-实现-执行
1、首先登录进去,后随机搜索一个company名称,点击关注!
API接口:
DQpodHRwczovL3d3dy5xY2MuY29tL2FwaS91c2VyL2FkZEZvbGxvd2luZ0xpc3Q=
2、多次请求发现该请求头参数的键和值都是变化的,所以我们通过XHR来进行断点,不断通过堆栈来分析设置改请求头参数的地方,点击关注触发!
3、开始往上跟栈,找到源头!我们发现下面有一个异步操作,而且还有关键词,f.request,看到这里我们猜一猜会不会是在异步中进行调度设置的。
4、重新触发,断住该点!
发现执行了这几个方法,那么我们可以在前俩个方法中尝试进行断点,为什么是前俩个呢?因为前面是请求后面肯定是响应。
5、断点进入前俩个方法中!
再进入o.default方法中
6、所以i变量作为了键,l变量作为了值,开始分析这俩个变量的生成!
我们可以看出i变量是通过t和e.data参数进入a.default方法进行加密获取
t:api接口
e.data:请求体参数
进入a.default方法
我们再分俩段,先分析(0,a.default)(t)是什么,断点进入方法!
1、我们可以看到e为api接口转化为小写,t为e的俩次字符串拼接,而o.default为一个固定值:
o.default = {
codes:{0: 'W', 1: 'l', 2: 'k', 3: 'B', 4: 'Q', 5: 'g', 6: 'f', 7: 'i', 8: 'i', 9: 'r', 10: 'v', 11: '6', 12: 'A', 13: 'K', 14: 'N', 15: 'k', 16: '4', 17: 'L', 18: '1', 19: '8'},
n:20
}
2、对t进行遍历循环取出该字符对应的Unicode码点,然后对o.default.n进行取余数,最后将这个值去取codes中对于下标索引值,然后进行拼接!
def getCodes(baseApi):
codeList = {
"0": "W",
"1": "l",
"2": "k",
"3": "B",
"4": "Q",
"5": "g",
"6": "f",
"7": "i",
"8": "i",
"9": "r",
"10": "v",
"11": "6",
"12": "A",
"13": "K",
"14": "N",
"15": "k",
"16": "4",
"17": "L",
"18": "1",
"19": "8"
}
baseApi = baseApi.lower()
tt = baseApi + baseApi
codes = ''
for k in tt:
a = ord(k) % len(codeList)
codes += codeList[f'{a}']
return codes
第二段我们分析 (0,o.default)(t + n, (0,a.default)(t))
1、t + n:/api/user/addfollowinglist{“companykeyno”:“6e9104e7983f72a2178aa189a1ab8d54”}
2、(0,a.default)(t):iLAgiLklNiLWWk6ii68gvBigk4iLAgiLklNiLWWk6ii68gvBigk4
进入方法分析
开始验证我们的想法,找在线加密工具
URL:https://www.uutils.com/enc/
到这里最后i参数的值就为:api+请求表单转为字符串并为小写,api进行Unicode码取code,进行HmacSHA512加密,然后toLowerCase().substr(8, 20)得到结果。
import hashlib
import hmac
def getHmacSha512(key,data):
hmac_obj = hmac.new(key.encode(), data.encode(), digestmod=hashlib.sha512).digest()
return hmac_obj.hex()
7、开始分析l参数的生成(0,r.default)(t, e.data, (0,s.default)())
1、(0,s.default)():就是访问首页获取得到的window.tid参数
2、其它俩个参数跟上一次加密的参数一致,进入方法内部!
3、我们发现i变量加密的参数除了多了一个window.tid参数,其它都一样,最终加密方法(0,o.default)(n + “pathString” + i + t, (0,a.default)(n))
n + “pathString” + i + t:为一个字符串拼接,值:/api/user/addfollowinglistpathString{“companykeyno”:“6e9104e7983f72a2178aa189a1ab8d54”}2727b92fa87a73d7fe2d4bef8324ea61
HmacSHA512加密的key是一样的为:iLAgiLklNiLWWk6ii68gvBigk4iLAgiLklNiLWWk6ii68gvBigk4
4、得到最终结果l
8、python代码实现
import json
import hashlib
import hmac
def getHmacSha512(key,data):
hmac_obj = hmac.new(key.encode(), data.encode(), digestmod=hashlib.sha512).digest()
return hmac_obj.hex()
def getCodes(baseApi):
codeList = {
"0": "W",
"1": "l",
"2": "k",
"3": "B",
"4": "Q",
"5": "g",
"6": "f",
"7": "i",
"8": "i",
"9": "r",
"10": "v",
"11": "6",
"12": "A",
"13": "K",
"14": "N",
"15": "k",
"16": "4",
"17": "L",
"18": "1",
"19": "8"
}
baseApi = baseApi.lower()
tt = baseApi + baseApi
codes = ''
for k in tt:
a = ord(k) % len(codeList)
codes += codeList[f'{a}']
return codes
def getHeaderKey(baseApi,data,tid):
dataStr = json.dumps(data,separators=(',',':')).lower()
arg1 = baseApi + dataStr
arg2 = getCodes(baseApi)
key = getHmacSha512(arg2,arg1).lower()[8:28]
arg3 = baseApi + "pathString" + dataStr + tid
arg4 = getCodes(baseApi)
val = getHmacSha512(arg4,arg3)
return key,val
if __name__ == '__main__':
baseApi = "/api/user/addfollowinglist"
data = {
'companyKeyno':"6e9104e7983f72a2178aa189a1ab8d54"
}
tid = "2727b92fa87a73d7fe2d4bef8324ea61"
headerKey, headerVal = getHeaderKey(baseApi,data,tid)
print({headerKey:headerVal})
9、运行结果:
技术细节
提示:快速定位方式,猜想是何加密,验证猜想
例如:
- o.then(l.shift(), l.shift())异步进行加密
- 猜想HmacSHA512加密
小结
提示:HmacSHA512加密
学习交流群:v:wzwzwz0613拉进群
敬请期待下一篇,各位也可以提出一些需要逆向的网站,合适的话我也可以发出来学习交流,谢谢!!!