爬虫-请求包含验证参数
目标网站
某修改运动步数网站
目的
使用接口发送请求或者自动化
(暂不清楚)
分析网络请求
打开Network视图
找到请求修改步数接口
请求包含sing字段,应该是用作验证请求是否合法
定位加密方法
首先定位到发送请求的JS文件
点击左下角大括号,格式化JS文件
定位到加密方法
解析加密方法
稍微格式化一下加密方法
_0x4dd058[_0x3122('0xb1')](
md5,
_0x4dd058[_0x3122('0xf3')](
_0x4dd058[_0x3122('0x37')](
String(_0x4dd058[_0x3122('0x94')](_0x4dd058[_0x3122('0x3e')](parseInt, _0x136350, '10'), 0x16)) +
_0x4dd058[_0x3122('0xb1')](String, _0x3f5e81) +
String(_0x5c2e93),
_0x4dd058[_0x3122('0x77')](String, _0x4dd058[_0x3122('0x64')](_0x5ea5ce, 0x3e8))
),
_0x4dd058['Eygbd']
)
)
经过分析,首先要确认如下变量
_0x3122('0xb1')
_0x3122('0xf3')
...
在console执行命令
发现结果都是字符串,那么猜测_0x4dd058应该是一个object,根据这里的key取对应的方法
同样在console中执行_0x4dd058,结果为未定义
全局检索_0x4dd058 = 寻找在何处进行定义
继续检索_0x260d9f =
至此,已经非常清晰了,再看一遍加密方法
_0x4dd058[_0x3122('0xb1')](
md5,
_0x4dd058[_0x3122('0xf3')](
_0x4dd058[_0x3122('0x37')](
String(_0x4dd058[_0x3122('0x94')](_0x4dd058[_0x3122('0x3e')](parseInt, _0x136350, '10'), 0x16)) +
_0x4dd058[_0x3122('0xb1')](String, _0x3f5e81) +
String(_0x5c2e93),
_0x4dd058[_0x3122('0x77')](String, _0x4dd058[_0x3122('0x64')](_0x5ea5ce, 0x3e8))
),
_0x4dd058['Eygbd']
)
)
将_0x4dd058替换为_0x260d9f进行检索即可得到每一层的方法逻辑
例如
从最外层方法_0x4dd058[_0x3122('0xb1')]替换为_0x260d9f[_0x3122('0xb1')]。得到方法逻辑如图
据此,替换每一层方法,得到化简后的加密方法如下
const account = "账号"
const password = "密码"
const step = "步数"
const time = Date["parse"](new Date())
md5(String(parseInt(account, 10) + 0x16) + String(password) + String(step) + String(time / 0x3e8) + "422")
测试
输入如下信息后发送请求
账号:18888888888
密码:18888888888
步数:999999
查看Network面板得到
时间戳:1628655276
sing:5eba2de213710d18d51e22db732b0674
构造加密函数
md5(String(parseInt("18888888888", 10) + 0x16) + String("18888888888") + String("999999") + String(1628655276000 / 0x3e8) + "422")
在浏览器console面板中计算结果和sing字段结果一致
结束