爬虫研究分析-请求包含验证参数2

目标网站

某修改运动步数网站

目的

使用接口发送请求或者自动化

(暂不清楚)

分析网络请求

打开Network视图

找到请求修改步数接口

image

请求包含sing字段,应该是用作验证请求是否合法

定位加密方法

首先定位到发送请求的JS文件

image_1

点击左下角大括号,格式化JS文件

image_2

定位到加密方法

image_3

解析加密方法

稍微格式化一下加密方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
_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']
  )
)

经过分析,首先要确认如下变量

1
2
3
_0x3122('0xb1')
_0x3122('0xf3')
...

在console执行命令

image_4

发现结果都是字符串,那么猜测_0x4dd058应该是一个object,根据这里的key取对应的方法

同样在console中执行_0x4dd058,结果为未定义

全局检索_0x4dd058 = 寻找在何处进行定义

image_5

继续检索_0x260d9f =

image_6

至此,已经非常清晰了,再看一遍加密方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
_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’)]。得到方法逻辑如图

image_7

据此,替换每一层方法,得到化简后的加密方法如下

1
2
3
4
5
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

构造加密函数

1
md5(String(parseInt("18888888888", 10) + 0x16) + String("18888888888") + String("999999") + String(1628655276000 / 0x3e8) + "422")

在浏览器console面板中计算结果和sing字段结果一致

image_8