温馨提示,ABEMA 在世界杯期间加强了访问限制策略,如果显示错误页面就代表本文无解,换个 IP 继续吧。
访问 ABEMA (物理)
开篇废话
ABEMA 最近更新了 IP 库或者风控加强了,我的 Oracle Tokyo 已经不能直接访问。
不过看上去只是前端加了点规则,应该还是可以解锁的,这里就来研究下。
其实随便搜索下就可以找到现成的解锁脚本 https://gist.github.com/Last-Order/5a1c70686bc0c130fe3fbdcbdb1bf22a
这里分享下我是如何逆向的
正文
找到对应 JS 文件
具体 js 文件会随着前端更新而变化,自己动手实践应以实际为准
我们右键检查,找到 Network 标签,然后根据页面的语言文件来找到对应 .js 文件,如图所示:
可以找到 e144c605522fc069f095.9855.js
,我们粘贴到本地,然后随便看一下。
可以点击左下角的
{}
图标来格式化代码。
找到提示函数
我们转到了 VSCode ,然后继续随便搜索一下,这里我用了 maintenance_region_detail_label
也就是语言的变量,看上去定位到了是什么让页面成抱歉,然后继续随便看看有没有什么独特的东西:
然后我们就看到了 region
这个词,我们全局搜索ta
看上去找到罪魁祸首了,我们继续查找 Oe
这个函数,看上去就是个加载函数,当变量 t
为否时就报错,调用 xe 函数。
这时候我们第一版补丁就已经有灵感了,如图所示:
可以正常进入网页并且也可以观看直播(点播当然还是不行)
然而直接给文件打补丁,以后前端更新的时候又要改了,我们还是要找到为什么。
此处为人眼调查能调查到的极限,接下来我们需要在浏览器下断点才能继续追踪
动态调试
我们切换到 Sources 标签,找到 e144c605522fc069f095.9855.js
并且在之前 Oe 函数里面下个断点:
可以看到在是这个函数调用的,对应的是 HTML 中的 window.__CLIENT_REGION__ = {...,"isAllowed":false}
我们用些奇怪的办法把 isAllowed 改成 true 即可(参考开篇废话的那个现成脚本),然后刷新页面,可以看到页面变成了正常的。
写脚本
这里就直接借开头提到的解锁脚本,没有再想其他方法:
其实没有其它更方便的办法了
// https://gist.github.com/Last-Order/5a1c70686bc0c130fe3fbdcbdb1bf22a
// ==UserScript==
// @name Abema 区域限制
// @version 1.0.0
// @run-at document-end
// @namespace Violentmonkey Scripts
// @match https://abema.tv/*
// @grant none
// ==/UserScript==
Object.defineProperty(__CLIENT_REGION__, 'isAllowed', {
get: () => true
});
Object.defineProperty(__CLIENT_REGION__, 'status', {
get: () => false
});
在 MDN 可以找到关于 Object.defineProperty
的详细介绍,
此处脚本直接劫持了 __CLIENT_REGION__
对象,把 getter 强行改成了 true
,无论数值如何变化其返回结果也只会是 true
,这样就不必写循环事件之类的来保持 __CLIENT_REGION__.isAllowed
/ __CLIENT_REGION__.status
的值为 true 了。
反制方法为
Object.freeze
/Object.defineProperty
writable: true 这里不再演示。
都是网页了,反制基本上也是无效,自然有别的办法绕,看谁先放弃折腾,实在不行就替换 JS 文件安排,所以要加限制还是看等级,不想让人搞就在服务端层面掐掉可能性。
总结
这次逆向也算是学到了一个新的劫持姿势,受益匪浅。
然后就是逆向类的博文还是不太好写,我该如何描述截图期间的过程呢?对于我来说可能只是这里点点,那里再搜索一下,然后再打个断点亦或者手动 console.log
,修改下试试效果最后做成油猴脚本的事,也许录视频才能更好地解说?
完