web逆向-七麦signature参数分析还原
前言
想写这篇主要是七麦网的加密方式比较有趣,有挺多值得深究的地方,在文章中我会一步步用python还原,并介绍一些加密的知识,那么话不多说,let the hacking begin !
调试
七麦网基本每个数据接口都需要带上 analysis
参数,不然就会返回 Access Error
直接全局搜analysis
基本没有线索,说明七麦把这个键值做了隐藏,直接xhr下断点
断住了,接下来就是观察变量和追踪 Call Stack了
在 promise 异步请求的 interceptors 中发现可疑点,打个断点试试
promise
是 ES6 新增的一个用于处理异步任务的javascript类,因为js代码是单线程执行的,很多浏览器事件都必须异步执行(传送门)
1
2 // promise 执行并打印结果
window.PSign.sign(cxs).then(function(e) {console.log(e.h5st)});
interceptors
即Axios(一个基于 promise 的 HTTP 库)的拦截器模式,分成两种,分别是request请求拦截器
和response响应拦截器
,其中,请求拦截器可以修改body参数(fulfilled操作),也可以直接拒绝非法请求(rejected操作)(传送门)
这里主要是修改body,所以我们进入 fulfilled 的 FunctionLocation
查看
打断点调试,Resume一下,这里我们看到a
就是analysis的值,但在函数入口的时候还没有,所以必定是在上面几行代码中生产的
代码分析
在函数内部我们看到 a
的生成代码是
1 | a = (0, |
l参数
先分析参数,首先是 l
,往上找到生成步骤,即 (0,n.nF)("qimai|Technologyx", 1)
传入的是两个常数,进入n.nF
内部查看,也基本是字符串转换、位计算的一些常规操作,所以这里l直接取 0000000c735d856
就行
r参数
经过调试发现,r的初始值是几个查询值的列表
先经过排序
再 join
操作,接下来的n.cv其实就是 base64 编码
后面的几步操作无非是字符串的拼接,其中涉及到了三个变量
e.url.replace(e.baseURL, "")
即去掉主站域名后的路径,比如 https://api.qimai.cn/rank/index 生成 /rank/index- d 的值是固定的 “@#”
- o 的值是
o = +new Date - (f || 0) - 1515125653845
,new Date 是当前的13位毫秒时间戳 - f 的值好像是个和 cookies 有关的整数,这里我直接取随机整数也能通过,精力有限就不深究了
两个函数
最后就是 a = (0,n.cv)((0,n.oZ)(r, l))
了,这里明显是经过了两个函数的处理
- n.oZ
都是一些常规的计算,直接用 python 还原
1 | def oz(a): |
PS:
这里涉及到字符和ASCII码的相互转换
- ord 得到
ASCII码
,对应 js 的 CharCodeAt,用法是"cxs".CharCodeAt(0)
,即转换第一个字符c - chr 得到
字符
,对应 js 的 fromCharCode,用法是String.fromCharCode(77)
,得到字符”M”
fromCharCode 的方法在代码中没有直接体现,而是
其实直接拿 a变量那一整句去 console执行,就得出fromCharCode了(对面的前端好无聊 😑😑😑)
- n.cv
进入函数内部,多次调试发现,只进行了 base64 加密,encodeURIComponent
那一部分最先对原参数进行处理,但是跟没处理一样 ,可以忽略
replace(/%([0-9A-F]{2})/g, ...
的意思就是 遍历字符串,寻找能匹配 %([0-9A-F]{2})的子字符串,做替换, /g
的意思是尽可能匹配多的结果,没有的话只会进行一次匹配,还有其他表示: /i
忽略大小写,/m
多行匹配
代码整理
1 | import time |
运行结果: