这里以单月票房为例:
https://www.endata.com.cn/BoxOffice/BO/Month/oneMonth.html

逆向

先观察响应:
响应结果
其请求表单或是请求头都无加密参数,响应结果为乱码,看着像十六进制数据,因此本次目标就是找寻解密这串数据的办法

可以通过XHR断点来找到对应代码位置,但是通过API发起程序去找更快,因为要做的是处理返回的结果,因此可以往下找,发现此处:
入口

e便是响应的结果

1 == (e = "{" == e[0] ? JSON.parse(e) : JSON.parse(webInstace.shell(e))).Status || 200 == e.Code ? r(e.Data) : 200 == e.code ? r(e.data) : a(e.Msg)

这里得要盘一盘逻辑,但是不妨大胆一点,既然是解析拿到的数据,e是原始响应结果,肯定得先处理才能JSON.parse(),这里有两个函数调用有嫌疑:r(e.Data)以及webInstace.shell(e)webInstace.shell(e)肯定先于r(e.Data)执行

并且注意前面三元表达式e = "{" == e[0] ? JSON.parse(e) : JSON.parse(webInstace.shell(e))e作为一个十六进制数据,自然没有{,因此此处三元表达式结果即为:e = JSON.parse(webInstace.shell(e))

这就很合理了,先格式化后才能有e.Data等操作,因此webInstace.shell(e)便是我们要找寻的解密函数

同时在该处下断点,待运行后,可手动在控制台输出验证:
注意e的值以及调用后的结果

跳转至webInstace.shell(e)
webDES

发现其实没必要单独扣代码, 偷懒直接全部复制
但是问题来了,不存在webInstace.shell()这个方法,这很正常,毕竟都是混效果,上图的_0x2246('0x257', 'nArV')其结果很明显就是shell,因此要么手动改掉上面的为shell,要么调用时就采用webInstace[_0x2246('0x257', 'nArV')]()形式

注意,这样直接全复制的代码可能需要补环境,先直接运行看看:
缺少环境

报错,恰好_0x2246('0x26d', '0I#o')就是 'userAgent',而!navigator || !navigator[_0x2246('0x26d', '0I#o')]运行结果为false,此时要么直接覆盖填写false,或者将navigator['userAgent']补上,这里选择补上,再运行:
success

成功拿到结果,简单粗暴的一次逆向就此完成...