艺恩票房API逆向
这里以单月票房为例:
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)
便是我们要找寻的解密函数
同时在该处下断点,待运行后,可手动在控制台输出验证:
跳转至webInstace.shell(e)
处
发现其实没必要单独扣代码, 偷懒直接全部复制
但是问题来了,不存在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']
补上,这里选择补上,再运行:
成功拿到结果,简单粗暴的一次逆向就此完成...